diff --git a/proxy/.eslintrc.cjs b/.eslintrc.cjs similarity index 79% rename from proxy/.eslintrc.cjs rename to .eslintrc.cjs index 1330f5a7e..ee12673b8 100644 --- a/proxy/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -11,6 +11,8 @@ module.exports = { }, ignorePatterns: [ - + "coverage/**", + "typechain-types/**", + "**/venv/**" ] }; diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 177dd8e5e..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,69 +0,0 @@ -module.exports = { - "env": { - "browser": false, - "es6": true - }, - "extends": "standard", - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "rules": { - "indent": [ "error", 4 ], - "linebreak-style": [ "error", "unix" ], - "quotes": [ "error", "double" ], - "semi": [ "error", "always" ], - "camelcase": "off", - // "no-unused-vars": "off", - "eqeqeq": "off", - "comma-dangle": [ "error", "never" ], - "comma-style": [ "error", "last" ], - "comma-spacing": "off", - "space-before-function-paren": [ "error", "never" ], - "space-in-parens": [ "error", "always" ], - "keyword-spacing": [ "error", { - "overrides": { - "if": { "before": false, "after": false }, - "else": { "before": true, "after": true }, - "for": { "before": false, "after": false }, - "while": { "before": false, "after": false } - } - } ], - "space-before-blocks": [ "error", "always" ], - "array-bracket-spacing": [ "error", "always" ], - "object-curly-spacing": [ "error", "always" ], - "space-unary-ops": "off", - "spaced-comment": "off", - "curly": [ "error", "multi-or-nest" ], - "nonblock-statement-body-position": [ "error", "below" ], - "one-var": "off", - "no-unneeded-ternary": "off", - "no-cond-assign": [ "error", "always" ], - "no-console": "off", - "new-cap": "off", - "no-tabs": "off", - "no-mixed-spaces-and-tabs": "off", - "no-prototype-builtins": "off", - "quote-props": "off", - "no-undef": "off", - "no-useless-return": "off", - "no-new": "off", - "no-useless-constructor": "off", - "no-lone-blocks": "off", - "no-fallthrough": "off", - "no-useless-catch": "off", - "padded-blocks": "off", - "no-use-before-define": "off", // [ "error", { "variables": false, "functions": false } ], - "lines-between-class-members": [ "error", "never" ], - "no-var": "error", - "no-unused-vars": "error", - "object-shorthand": 0, - "multiline-ternary": "off", - "max-len": [ "error", { "code": 100, "tabWidth": 4 } ], - "max-lines-per-function": [ "error", { "max": 200, "skipBlankLines": false } ] - } -}; diff --git a/.githooks/commit-msg b/.githooks/commit-msg new file mode 100755 index 000000000..8bb66f6a2 --- /dev/null +++ b/.githooks/commit-msg @@ -0,0 +1,10 @@ +#!/bin/bash + +set -e + +if [[ $(npx cspell -- --no-summary $1 2> /dev/null) ]] +then + echo "It looks like you have spell-checking errors in your commit message." + npx cspell -- --no-summary $1 + exit 1 +fi diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 000000000..d091c348c --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,17 @@ +#!/bin/bash + +# cSpell:words gpgsign + +set -e + +GPG_SIGN_ENABLED=$(git config commit.gpgsign || true) +if ! [[ "$GPG_SIGN_ENABLED" == "true" ]] +then + echo "Enable GPG signature for new commits"; + exit 1; +fi + +files=$(git diff --cached --name-only) +npx cspell -- --no-summary $files + +yarn fullCheck diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..a6c97c654 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +* @DimaStebaev @DmytroNazarenko +*.md @skalenetwork/docowners diff --git a/.github/dependabot.yml b/.github/dependabot.yml index faed4e27d..764343bce 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,9 +1,11 @@ version: 2 updates: -- package-ecosystem: npm - directory: "/proxy" - schedule: - interval: "weekly" - day: "saturday" - allow: - - dependency-type: "production" + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "pip" + directory: "/scripts/" + schedule: + interval: "weekly" diff --git a/.github/workflows/issue_check.yml b/.github/workflows/issue_check.yml index ee5ec6b24..04cf02eb6 100644 --- a/.github/workflows/issue_check.yml +++ b/.github/workflows/issue_check.yml @@ -6,6 +6,7 @@ on: jobs: check-linked-issues: name: Check if pull request has linked issues + if: ${{ !startsWith(github.head_ref, 'dependabot/') }} runs-on: ubuntu-latest steps: - name: Get issues @@ -15,5 +16,5 @@ jobs: GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - name: PR has not linked issues if: join(steps.get-issues.outputs.issues) == '' - run: + run: exit 1 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b57976aaf..323cac1ba 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,6 @@ -name: Build and publish +name: publish + +# cspell:words PYPI_TOKEN ncipollo on: pull_request: @@ -26,10 +28,6 @@ jobs: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} - defaults: - run: - working-directory: proxy - outputs: version: ${{ steps.version.outputs.version }} @@ -39,16 +37,17 @@ jobs: submodules: recursive - name: Install NODE JS - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'yarn' - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} cache: 'pip' + cache-dependency-path: predeployed/test/requirements.txt - name: Prepare for pip package building run: | @@ -60,7 +59,6 @@ jobs: - name: Calculate version id: version - working-directory: ./ run: | export BRANCH=${GITHUB_REF##*/} echo "Branch $BRANCH" @@ -93,7 +91,7 @@ jobs: run: npx hardhat run scripts/generateAbi.ts - name: Generate predeployed ABIs - working-directory: proxy/predeployed + working-directory: predeployed env: VERSION: ${{ env.VERSION }} run: | @@ -107,20 +105,20 @@ jobs: uses: actions/upload-artifact@v4 with: name: data - path: proxy/data + path: data - name: Create Release uses: ncipollo/release-action@v1 with: tag: ${{ env.VERSION }} + commit: ${{ github.sha }} prerelease: ${{ env.PRERELEASE }} - artifacts: "proxy/predeployed/dist/*,\ - proxy/predeployed/data/*,\ - proxy/data/ima-schain-*-manifest.json,\ - proxy/data/*-abi.json" + artifacts: "predeployed/dist/*,\ + predeployed/data/*,\ + data/ima-schain-*-manifest.json,\ + data/*-abi.json" - name: Build and publish image - working-directory: ./ env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} diff --git a/.github/workflows/main.yml b/.github/workflows/test.yml similarity index 91% rename from .github/workflows/main.yml rename to .github/workflows/test.yml index 7b4ebc403..51a9979ba 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,6 @@ # This is a basic workflow to help you get started with Actions -name: Build and test +name: test on: push: @@ -19,23 +19,20 @@ jobs: test-contracts: runs-on: ubuntu-latest - defaults: - run: - working-directory: proxy - steps: - uses: actions/checkout@v4 with: submodules: true - name: Install PYTHON - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} cache: 'pip' + cache-dependency-path: scripts/requirements.txt - name: Install NODE JS - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'yarn' @@ -80,23 +77,20 @@ jobs: test-predeployed: runs-on: ubuntu-latest - defaults: - run: - working-directory: proxy - steps: - uses: actions/checkout@v4 with: submodules: true - name: Install PYTHON - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} cache: 'pip' + cache-dependency-path: predeployed/test/requirements.txt - name: Install NODE JS - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'yarn' @@ -104,7 +98,7 @@ jobs: - name: Install project run: | yarn install - npm run compile + yarn compile - name: Install python testing staff run: pip3 install -r predeployed/test/requirements.txt diff --git a/.gitignore b/.gitignore index 4f3eb7d73..927ce0b9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,22 @@ # artifacts -proxy/artifacts/ +artifacts/ test-tokens/artifacts/ -proxy/cache/ +cache/ test-tokens/cache/ -proxy/typechain +typechain test-tokens/typechain # openzeppelin -proxy/.openzeppelin/dev-*.json -proxy/.openzeppelin/unknown-*.json -proxy/.openzeppelin/.session +.openzeppelin/dev-*.json +.openzeppelin/unknown-*.json +.openzeppelin/.session +.openzeppelin/holesky.json +.openzeppelin/sepolia.json # predeployed generator artificats -proxy/predeployed/test/additional.json -proxy/predeployed/version.txt -proxy/data/proxySchain_Bob.json.saved_copy +predeployed/test/additional.json +predeployed/version.txt +data/proxySchain_Bob.json.saved_copy # idea .DS_Store @@ -34,25 +36,24 @@ pids *.pid.lock # Coverage directory used by tools like istanbul -proxy/coverageEnv -proxy/coverage/ -proxy/coverage.json +coverageEnv +coverage/ +coverage.json # tmp file after precompiled contracts generation -proxy/data/precompiled.json.file +data/precompiled.json.file -proxy/predeployed/build -proxy/predeployed/dist -proxy/predeployed/src/ima_predeployed/artifacts +predeployed/build +predeployed/dist +predeployed/src/ima_predeployed/artifacts *.egg-info -proxy/predeployed/test/genesis.json +predeployed/test/genesis.json # nyc test coverage .nyc_output # Dependency directories node_modules -proxy/node_modules test/node_modules test-tokens/node_modules @@ -84,8 +85,8 @@ wallet*.json __pycache__/ **/*.bak -proxy/proxy.json -proxy/data/*.json +proxy.json +data/*.json test-tokens/data/*.json ima_data.json diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..0d597947f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "dictionary"] + path = dictionary + url = https://github.com/skalenetwork/dictionary.git diff --git a/proxy/.openzeppelin/mainnet.json b/.openzeppelin/mainnet.json similarity index 100% rename from proxy/.openzeppelin/mainnet.json rename to .openzeppelin/mainnet.json diff --git a/proxy/.solcover.js b/.solcover.js similarity index 100% rename from proxy/.solcover.js rename to .solcover.js diff --git a/proxy/.solhint.json b/.solhint.json similarity index 100% rename from proxy/.solhint.json rename to .solhint.json diff --git a/proxy/.solhintignore b/.solhintignore similarity index 100% rename from proxy/.solhintignore rename to .solhintignore diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 16ab2912c..000000000 --- a/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -* @sergiy-skalelabs @DmytroNazarenko -*.md @skalenetwork/docowners -/proxy/ @payvint diff --git a/proxy/DEPLOYED b/DEPLOYED similarity index 100% rename from proxy/DEPLOYED rename to DEPLOYED diff --git a/Dockerfile b/Dockerfile index 2702021af..4640d429d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM node:18 RUN mkdir /app COPY VERSION /app -COPY proxy /app +COPY ./ /app WORKDIR /app diff --git a/README.md b/README.md index 1fd45b15a..9ac1a3ff2 100644 --- a/README.md +++ b/README.md @@ -15,24 +15,139 @@ Please see [SECURITY.md](.github/SECURITY.md) for audit reports and reporting po IMA consists of the following three parts: -1) `Mainnet` smart contracts. -2) `SKALE Chain` smart contracts. -3) A containerized [IMA Agent](https://github.com/skalenetwork/ima-agent) application. +1) `Mainnet` smart contracts. +2) `SKALE Chain` smart contracts. +3) A containerized [IMA Agent](https://github.com/skalenetwork/ima-agent) application. Smart contracts are interfaces for any software working with `Mainnet` and `SKALE Chain` like other smart contracts deployed there or software connecting these Ethereum networks. The Agent is a Node JS application connecting the smart contracts on Mainnet with SKALE Chains. -## Components Structure +## SKALE IMA Proxy -### Proxy +SKALE Interchain Messaging Smart Contracts -IMA proxy is the Solidity part of IMA containing `Mainnet` and `SKALE Chain` smart contracts. +Proxy is a library with smart contracts for the SKALE Interchain Messaging Agent. This system allows transferring ETH, ERC20 and ERC721 and is based on the Message Proxy system. + +- Smart contract language: Solidity 0.8.16 +- NodeJS version: v18 +- Yarn Classic + +### Message Proxy system + +This system allows sending and receiving messages from other chains. `MessageProxy.sol` contract needs to be deployed to Mainnet, and deployed to each SKALE chain to use it with the SKALE Interchain Messaging Agent. +You can use MessageProxy contract separately by Interchain Messaging Smart Contracts: + +1) Add interface: + + ```solidity + interface Proxy { + function postOutgoingMessage( + string calldata targetSchainName, + address targetContract, + uint256 amount, + address to, + bytes calldata data + ) + external; + } + ``` + +2) Write `postMessage` function, which will receive and process messages from other chains: + + ```solidity + function postMessage( + address sender, + string memory fromSchainName, + address payable to, + uint256 amount, + bytes memory data + ) + public + { + ... + } + ``` + +3) Add the address of MessageProxy on some chain: + Data of Smart contracts stores in `data` folder + +4) Then continue developing your dApp + +### Ether clone on SKALE chain + +There is a Wrapped Ether clone(EthERC20.sol) on SKALE chains - it is an ERC20 token and inherits the known ERC-20 approve issue. Please find more details here + +### Interchain Messaging Agent system + +This system sends and receives ETH, ERC20, and ERC721 tokens from other chains. +It consists of 3 additional smart contracts (not including MessageProxy contract): + +1) `DepositBox.sol` - contract only on a mainnet: DepositBox can transfer ETH and ERC20, ERC721 tokens to other chains. \- `deposit(string memory schainName, address to)` - transfer ETH. ... +2) `TokenManager.sol` +3) `TokenFactory.sol` + +### Install + +1) Clone this repo +2) run `npm install` +3) run `npm start`, this command will compile contracts + +### Deployment + +Configure your networks for SKALE chain and mainnet in `truffle-config.js` + +There are several example networks in comments. + +The `.env` file should include the following variables: + +```bash +URL_W3_ETHEREUM="your mainnet RPC url, it also can be an infura endpoint" +URL_W3_S_CHAIN="your SKALE chain RPC url, it also can be an infura endpoint" +CHAIN_NAME_SCHAIN="your SKALE chain name" +PRIVATE_KEY_FOR_ETHEREUM="your private key for mainnet" +PRIVATE_KEY_FOR_SCHAIN="your private key for SKALE chain" +ACCOUNT_FOR_ETHEREUM="your account for mainnet" +ACCOUNT_FOR_SCHAIN="your account for SKALE chain" +NETWORK_FOR_ETHEREUM="your created network for mainnet" +NETWORK_FOR_SCHAIN="your created network for SKALE chain" +``` + +- deploy only to your mainnet: + +```bash +npm run deploy-to-mainnet +``` + +- deploy only to your schain: + +```bash +npm run deploy-to-schain +``` + +- deploy only to your mainnet and to schain: + +```bash +npm run deploy-to-both +``` + +#### Generate IMA data file for skale-node + +Results will be saved to `[RESULTS_FOLDER]/ima_data.json` + +- `ARTIFACTS_FOLDER` - path to `build/contracts` folder +- `RESULTS_FOLDER` - path to the folder where `ima_data.json` will be saved + +```bash +cd proxy +npm run compile +python ima_datafile_generator.py [ARTIFACTS_FOLDER] [RESULTS_FOLDER] +``` ## For more information -- [SKALE Network Website](https://skale.network) -- [SKALE Network Twitter](https://twitter.com/SkaleNetwork) -- [SKALE Network Blog](https://skale.network/blog) +- [SKALE Network Website](https://skale.network) +- [SKALE Network Twitter](https://twitter.com/SkaleNetwork) +- [SKALE Network Blog](https://skale.network/blog) Learn more about the SKALE community over on [Discord](https://discord.gg/vvUtWJB). diff --git a/proxy/contracts/MessageProxy.sol b/contracts/MessageProxy.sol similarity index 100% rename from proxy/contracts/MessageProxy.sol rename to contracts/MessageProxy.sol diff --git a/proxy/contracts/Messages.sol b/contracts/Messages.sol similarity index 100% rename from proxy/contracts/Messages.sol rename to contracts/Messages.sol diff --git a/proxy/contracts/extensions/ERC721ReferenceMintAndMetadataMainnet.sol b/contracts/extensions/ERC721ReferenceMintAndMetadataMainnet.sol similarity index 100% rename from proxy/contracts/extensions/ERC721ReferenceMintAndMetadataMainnet.sol rename to contracts/extensions/ERC721ReferenceMintAndMetadataMainnet.sol diff --git a/proxy/contracts/extensions/ERC721ReferenceMintAndMetadataSchain.sol b/contracts/extensions/ERC721ReferenceMintAndMetadataSchain.sol similarity index 100% rename from proxy/contracts/extensions/ERC721ReferenceMintAndMetadataSchain.sol rename to contracts/extensions/ERC721ReferenceMintAndMetadataSchain.sol diff --git a/proxy/contracts/extensions/interfaces/MessageProxyClient.sol b/contracts/extensions/interfaces/MessageProxyClient.sol similarity index 100% rename from proxy/contracts/extensions/interfaces/MessageProxyClient.sol rename to contracts/extensions/interfaces/MessageProxyClient.sol diff --git a/proxy/contracts/extensions/interfaces/MessageReceiver.sol b/contracts/extensions/interfaces/MessageReceiver.sol similarity index 100% rename from proxy/contracts/extensions/interfaces/MessageReceiver.sol rename to contracts/extensions/interfaces/MessageReceiver.sol diff --git a/proxy/contracts/extensions/interfaces/MessageSender.sol b/contracts/extensions/interfaces/MessageSender.sol similarity index 100% rename from proxy/contracts/extensions/interfaces/MessageSender.sol rename to contracts/extensions/interfaces/MessageSender.sol diff --git a/proxy/contracts/mainnet/CommunityPool.sol b/contracts/mainnet/CommunityPool.sol similarity index 97% rename from proxy/contracts/mainnet/CommunityPool.sol rename to contracts/mainnet/CommunityPool.sol index ddcbb7a36..966589809 100644 --- a/proxy/contracts/mainnet/CommunityPool.sol +++ b/contracts/mainnet/CommunityPool.sol @@ -262,7 +262,8 @@ contract CommunityPool is Twin, ICommunityPool { override returns (uint256) { - uint256 currentValue = _multiplyOnAdaptedBaseFee(minTransactionGas); + require(tx.gasprice != 0, "Gas price is not set"); + uint256 currentValue = _getMinEthDeposit(); if (currentValue <= _userWallets[receiver][schainHash]) { return 0; } @@ -276,7 +277,7 @@ contract CommunityPool is Twin, ICommunityPool { return delta + _userWallets[receiver][schainHash] >= minTransactionGas * tx.gasprice; } - function _multiplyOnAdaptedBaseFee(uint256 value) private view returns (uint256) { - return value * block.basefee * multiplierNumerator / multiplierDivider; + function _getMinEthDeposit() private view returns (uint256) { + return minTransactionGas * tx.gasprice * multiplierNumerator / multiplierDivider; } } diff --git a/proxy/contracts/mainnet/DepositBox.sol b/contracts/mainnet/DepositBox.sol similarity index 100% rename from proxy/contracts/mainnet/DepositBox.sol rename to contracts/mainnet/DepositBox.sol diff --git a/proxy/contracts/mainnet/DepositBoxes/DepositBoxERC1155.sol b/contracts/mainnet/DepositBoxes/DepositBoxERC1155.sol similarity index 100% rename from proxy/contracts/mainnet/DepositBoxes/DepositBoxERC1155.sol rename to contracts/mainnet/DepositBoxes/DepositBoxERC1155.sol diff --git a/proxy/contracts/mainnet/DepositBoxes/DepositBoxERC20.sol b/contracts/mainnet/DepositBoxes/DepositBoxERC20.sol similarity index 100% rename from proxy/contracts/mainnet/DepositBoxes/DepositBoxERC20.sol rename to contracts/mainnet/DepositBoxes/DepositBoxERC20.sol diff --git a/proxy/contracts/mainnet/DepositBoxes/DepositBoxERC721.sol b/contracts/mainnet/DepositBoxes/DepositBoxERC721.sol similarity index 100% rename from proxy/contracts/mainnet/DepositBoxes/DepositBoxERC721.sol rename to contracts/mainnet/DepositBoxes/DepositBoxERC721.sol diff --git a/proxy/contracts/mainnet/DepositBoxes/DepositBoxERC721WithMetadata.sol b/contracts/mainnet/DepositBoxes/DepositBoxERC721WithMetadata.sol similarity index 100% rename from proxy/contracts/mainnet/DepositBoxes/DepositBoxERC721WithMetadata.sol rename to contracts/mainnet/DepositBoxes/DepositBoxERC721WithMetadata.sol diff --git a/proxy/contracts/mainnet/DepositBoxes/DepositBoxEth.sol b/contracts/mainnet/DepositBoxes/DepositBoxEth.sol similarity index 100% rename from proxy/contracts/mainnet/DepositBoxes/DepositBoxEth.sol rename to contracts/mainnet/DepositBoxes/DepositBoxEth.sol diff --git a/proxy/contracts/mainnet/Linker.sol b/contracts/mainnet/Linker.sol similarity index 100% rename from proxy/contracts/mainnet/Linker.sol rename to contracts/mainnet/Linker.sol diff --git a/proxy/contracts/mainnet/MessageProxyForMainnet.sol b/contracts/mainnet/MessageProxyForMainnet.sol similarity index 100% rename from proxy/contracts/mainnet/MessageProxyForMainnet.sol rename to contracts/mainnet/MessageProxyForMainnet.sol diff --git a/proxy/contracts/mainnet/SkaleManagerClient.sol b/contracts/mainnet/SkaleManagerClient.sol similarity index 100% rename from proxy/contracts/mainnet/SkaleManagerClient.sol rename to contracts/mainnet/SkaleManagerClient.sol diff --git a/proxy/contracts/mainnet/Twin.sol b/contracts/mainnet/Twin.sol similarity index 100% rename from proxy/contracts/mainnet/Twin.sol rename to contracts/mainnet/Twin.sol diff --git a/proxy/contracts/schain/CommunityLocker.sol b/contracts/schain/CommunityLocker.sol similarity index 100% rename from proxy/contracts/schain/CommunityLocker.sol rename to contracts/schain/CommunityLocker.sol diff --git a/proxy/contracts/schain/DefaultAddresses.sol b/contracts/schain/DefaultAddresses.sol similarity index 100% rename from proxy/contracts/schain/DefaultAddresses.sol rename to contracts/schain/DefaultAddresses.sol diff --git a/proxy/contracts/schain/KeyStorage.sol b/contracts/schain/KeyStorage.sol similarity index 100% rename from proxy/contracts/schain/KeyStorage.sol rename to contracts/schain/KeyStorage.sol diff --git a/proxy/contracts/schain/MessageProxyForSchain.sol b/contracts/schain/MessageProxyForSchain.sol similarity index 100% rename from proxy/contracts/schain/MessageProxyForSchain.sol rename to contracts/schain/MessageProxyForSchain.sol diff --git a/proxy/contracts/schain/TokenManager.sol b/contracts/schain/TokenManager.sol similarity index 100% rename from proxy/contracts/schain/TokenManager.sol rename to contracts/schain/TokenManager.sol diff --git a/proxy/contracts/schain/TokenManagerLinker.sol b/contracts/schain/TokenManagerLinker.sol similarity index 100% rename from proxy/contracts/schain/TokenManagerLinker.sol rename to contracts/schain/TokenManagerLinker.sol diff --git a/proxy/contracts/schain/TokenManagers/TokenManagerERC1155.sol b/contracts/schain/TokenManagers/TokenManagerERC1155.sol similarity index 100% rename from proxy/contracts/schain/TokenManagers/TokenManagerERC1155.sol rename to contracts/schain/TokenManagers/TokenManagerERC1155.sol diff --git a/proxy/contracts/schain/TokenManagers/TokenManagerERC20.sol b/contracts/schain/TokenManagers/TokenManagerERC20.sol similarity index 100% rename from proxy/contracts/schain/TokenManagers/TokenManagerERC20.sol rename to contracts/schain/TokenManagers/TokenManagerERC20.sol diff --git a/proxy/contracts/schain/TokenManagers/TokenManagerERC721.sol b/contracts/schain/TokenManagers/TokenManagerERC721.sol similarity index 100% rename from proxy/contracts/schain/TokenManagers/TokenManagerERC721.sol rename to contracts/schain/TokenManagers/TokenManagerERC721.sol diff --git a/proxy/contracts/schain/TokenManagers/TokenManagerERC721WithMetadata.sol b/contracts/schain/TokenManagers/TokenManagerERC721WithMetadata.sol similarity index 100% rename from proxy/contracts/schain/TokenManagers/TokenManagerERC721WithMetadata.sol rename to contracts/schain/TokenManagers/TokenManagerERC721WithMetadata.sol diff --git a/proxy/contracts/schain/TokenManagers/TokenManagerEth.sol b/contracts/schain/TokenManagers/TokenManagerEth.sol similarity index 100% rename from proxy/contracts/schain/TokenManagers/TokenManagerEth.sol rename to contracts/schain/TokenManagers/TokenManagerEth.sol diff --git a/proxy/contracts/schain/bls/FieldOperations.sol b/contracts/schain/bls/FieldOperations.sol similarity index 100% rename from proxy/contracts/schain/bls/FieldOperations.sol rename to contracts/schain/bls/FieldOperations.sol diff --git a/proxy/contracts/schain/bls/Precompiled.sol b/contracts/schain/bls/Precompiled.sol similarity index 100% rename from proxy/contracts/schain/bls/Precompiled.sol rename to contracts/schain/bls/Precompiled.sol diff --git a/proxy/contracts/schain/bls/SkaleVerifier.sol b/contracts/schain/bls/SkaleVerifier.sol similarity index 100% rename from proxy/contracts/schain/bls/SkaleVerifier.sol rename to contracts/schain/bls/SkaleVerifier.sol diff --git a/proxy/contracts/schain/tokens/ERC1155OnChain.sol b/contracts/schain/tokens/ERC1155OnChain.sol similarity index 100% rename from proxy/contracts/schain/tokens/ERC1155OnChain.sol rename to contracts/schain/tokens/ERC1155OnChain.sol diff --git a/proxy/contracts/schain/tokens/ERC20OnChain.sol b/contracts/schain/tokens/ERC20OnChain.sol similarity index 100% rename from proxy/contracts/schain/tokens/ERC20OnChain.sol rename to contracts/schain/tokens/ERC20OnChain.sol diff --git a/proxy/contracts/schain/tokens/ERC721OnChain.sol b/contracts/schain/tokens/ERC721OnChain.sol similarity index 99% rename from proxy/contracts/schain/tokens/ERC721OnChain.sol rename to contracts/schain/tokens/ERC721OnChain.sol index d0c892f0f..b75f8357f 100644 --- a/proxy/contracts/schain/tokens/ERC721OnChain.sol +++ b/contracts/schain/tokens/ERC721OnChain.sol @@ -104,7 +104,7 @@ contract ERC721OnChain is ) public view - override(AccessControlEnumerableUpgradeable, ERC721Upgradeable) + override(AccessControlEnumerableUpgradeable, ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); diff --git a/proxy/contracts/schain/tokens/EthErc20.sol b/contracts/schain/tokens/EthErc20.sol similarity index 100% rename from proxy/contracts/schain/tokens/EthErc20.sol rename to contracts/schain/tokens/EthErc20.sol diff --git a/proxy/contracts/test/ConfigReader.sol b/contracts/test/ConfigReader.sol similarity index 100% rename from proxy/contracts/test/ConfigReader.sol rename to contracts/test/ConfigReader.sol diff --git a/proxy/contracts/test/EtherbaseMock.sol b/contracts/test/EtherbaseMock.sol similarity index 100% rename from proxy/contracts/test/EtherbaseMock.sol rename to contracts/test/EtherbaseMock.sol diff --git a/proxy/contracts/test/FallbackEthTester.sol b/contracts/test/FallbackEthTester.sol similarity index 100% rename from proxy/contracts/test/FallbackEthTester.sol rename to contracts/test/FallbackEthTester.sol diff --git a/proxy/contracts/test/KeyStorageMock.sol b/contracts/test/KeyStorageMock.sol similarity index 100% rename from proxy/contracts/test/KeyStorageMock.sol rename to contracts/test/KeyStorageMock.sol diff --git a/proxy/contracts/test/Logger.sol b/contracts/test/Logger.sol similarity index 100% rename from proxy/contracts/test/Logger.sol rename to contracts/test/Logger.sol diff --git a/proxy/contracts/test/MessageProxyCaller.sol b/contracts/test/MessageProxyCaller.sol similarity index 100% rename from proxy/contracts/test/MessageProxyCaller.sol rename to contracts/test/MessageProxyCaller.sol diff --git a/proxy/contracts/test/MessageProxyForMainnetTester.sol b/contracts/test/MessageProxyForMainnetTester.sol similarity index 100% rename from proxy/contracts/test/MessageProxyForMainnetTester.sol rename to contracts/test/MessageProxyForMainnetTester.sol diff --git a/proxy/contracts/test/MessageProxyForSchainTester.sol b/contracts/test/MessageProxyForSchainTester.sol similarity index 98% rename from proxy/contracts/test/MessageProxyForSchainTester.sol rename to contracts/test/MessageProxyForSchainTester.sol index a40c88093..6838d25f8 100644 --- a/proxy/contracts/test/MessageProxyForSchainTester.sol +++ b/contracts/test/MessageProxyForSchainTester.sol @@ -43,7 +43,7 @@ interface IMessageProxyForSchainTester { } -contract MessageProxyForSchainTester is MessageProxyForSchain, IMessageProxyForSchainTester { +contract MessageProxyForSchainTester is MessageProxyForSchain, IMessageProxyForSchainTester { IEtherbaseUpgradeable public etherbase = ETHERBASE; @@ -82,4 +82,4 @@ contract MessageProxyForSchainTester is MessageProxyForSchain, IMessageProxyForS function _getEtherbase() internal view override returns (IEtherbaseUpgradeable) { return etherbase; } -} \ No newline at end of file +} diff --git a/proxy/contracts/test/MessageProxyForSchainWithoutSignature.sol b/contracts/test/MessageProxyForSchainWithoutSignature.sol similarity index 100% rename from proxy/contracts/test/MessageProxyForSchainWithoutSignature.sol rename to contracts/test/MessageProxyForSchainWithoutSignature.sol diff --git a/proxy/contracts/test/MessagesTester.sol b/contracts/test/MessagesTester.sol similarity index 100% rename from proxy/contracts/test/MessagesTester.sol rename to contracts/test/MessagesTester.sol diff --git a/proxy/contracts/test/PrecompiledMock.sol b/contracts/test/PrecompiledMock.sol similarity index 100% rename from proxy/contracts/test/PrecompiledMock.sol rename to contracts/test/PrecompiledMock.sol diff --git a/proxy/contracts/test/ReceiverGasLimitMainnetMock.sol b/contracts/test/ReceiverGasLimitMainnetMock.sol similarity index 100% rename from proxy/contracts/test/ReceiverGasLimitMainnetMock.sol rename to contracts/test/ReceiverGasLimitMainnetMock.sol diff --git a/proxy/contracts/test/ReceiverGasLimitSchainMock.sol b/contracts/test/ReceiverGasLimitSchainMock.sol similarity index 100% rename from proxy/contracts/test/ReceiverGasLimitSchainMock.sol rename to contracts/test/ReceiverGasLimitSchainMock.sol diff --git a/proxy/contracts/test/ReceiverMock.sol b/contracts/test/ReceiverMock.sol similarity index 100% rename from proxy/contracts/test/ReceiverMock.sol rename to contracts/test/ReceiverMock.sol diff --git a/proxy/contracts/test/SafeMock.sol b/contracts/test/SafeMock.sol similarity index 100% rename from proxy/contracts/test/SafeMock.sol rename to contracts/test/SafeMock.sol diff --git a/contracts/test/SkaleManagerMock.sol b/contracts/test/SkaleManagerMock.sol new file mode 100644 index 000000000..11e99fa4c --- /dev/null +++ b/contracts/test/SkaleManagerMock.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/** + * SkaleManagerMock.sol - SKALE Interchain Messaging Agent + * Copyright (C) 2024-Present SKALE Labs + * @author Artem Payvin + * + * SKALE IMA is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SKALE IMA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with SKALE IMA. If not, see . + */ + +pragma solidity 0.8.16; + +import "./TestContractManager.sol"; +interface ISkaleManagerMock { + function setVersion(string calldata newVersion) external; +} + +contract SkaleManagerMock is ISkaleManagerMock, ContractManager { + + ContractManager public contractManager; + + string public version; + + constructor(address newContractManager) { + contractManager = ContractManager(newContractManager); + } + + function setVersion(string calldata newVersion) external override { + version = newVersion; + } +} diff --git a/proxy/contracts/test/SkaleVerifierMock.sol b/contracts/test/SkaleVerifierMock.sol similarity index 100% rename from proxy/contracts/test/SkaleVerifierMock.sol rename to contracts/test/SkaleVerifierMock.sol diff --git a/proxy/contracts/test/TestCallReceiverContract.sol b/contracts/test/TestCallReceiverContract.sol similarity index 100% rename from proxy/contracts/test/TestCallReceiverContract.sol rename to contracts/test/TestCallReceiverContract.sol diff --git a/proxy/contracts/test/TestContractManager.sol b/contracts/test/TestContractManager.sol similarity index 100% rename from proxy/contracts/test/TestContractManager.sol rename to contracts/test/TestContractManager.sol diff --git a/proxy/contracts/test/TestNodes.sol b/contracts/test/TestNodes.sol similarity index 100% rename from proxy/contracts/test/TestNodes.sol rename to contracts/test/TestNodes.sol diff --git a/proxy/contracts/test/TestSchains.sol b/contracts/test/TestSchains.sol similarity index 100% rename from proxy/contracts/test/TestSchains.sol rename to contracts/test/TestSchains.sol diff --git a/proxy/contracts/test/TestSchainsInternal.sol b/contracts/test/TestSchainsInternal.sol similarity index 100% rename from proxy/contracts/test/TestSchainsInternal.sol rename to contracts/test/TestSchainsInternal.sol diff --git a/proxy/contracts/test/TestWallets.sol b/contracts/test/TestWallets.sol similarity index 100% rename from proxy/contracts/test/TestWallets.sol rename to contracts/test/TestWallets.sol diff --git a/proxy/contracts/test/erc20/ERC20IncorrectTransfer.sol b/contracts/test/erc20/ERC20IncorrectTransfer.sol similarity index 100% rename from proxy/contracts/test/erc20/ERC20IncorrectTransfer.sol rename to contracts/test/erc20/ERC20IncorrectTransfer.sol diff --git a/proxy/contracts/test/erc20/ERC20TransferWithFalseReturn.sol b/contracts/test/erc20/ERC20TransferWithFalseReturn.sol similarity index 100% rename from proxy/contracts/test/erc20/ERC20TransferWithFalseReturn.sol rename to contracts/test/erc20/ERC20TransferWithFalseReturn.sol diff --git a/proxy/contracts/test/erc20/ERC20TransferWithoutReturn.sol b/contracts/test/erc20/ERC20TransferWithoutReturn.sol similarity index 100% rename from proxy/contracts/test/erc20/ERC20TransferWithoutReturn.sol rename to contracts/test/erc20/ERC20TransferWithoutReturn.sol diff --git a/proxy/contracts/test/erc20/ERC20WithoutTransfer.sol b/contracts/test/erc20/ERC20WithoutTransfer.sol similarity index 100% rename from proxy/contracts/test/erc20/ERC20WithoutTransfer.sol rename to contracts/test/erc20/ERC20WithoutTransfer.sol diff --git a/proxy/contracts/test/erc20/RevertableERC20.sol b/contracts/test/erc20/RevertableERC20.sol similarity index 100% rename from proxy/contracts/test/erc20/RevertableERC20.sol rename to contracts/test/erc20/RevertableERC20.sol diff --git a/proxy/contracts/thirdparty/ERC1155ReceiverUpgradeableWithoutGap.sol b/contracts/thirdparty/ERC1155ReceiverUpgradeableWithoutGap.sol similarity index 100% rename from proxy/contracts/thirdparty/ERC1155ReceiverUpgradeableWithoutGap.sol rename to contracts/thirdparty/ERC1155ReceiverUpgradeableWithoutGap.sol diff --git a/cspell.json b/cspell.json new file mode 100644 index 000000000..bb838964a --- /dev/null +++ b/cspell.json @@ -0,0 +1,22 @@ +{ + "version": "0.2", + "language": "en", + "ignorePaths": [ + ".gitignore", + "artifacts/**", + "cache/**", + "coverage/**", + "coverage.json", + "data/**", + "typechain-types/**", + "**/venv/**" + ], + "dictionaries": ["domain-terms", "libraries", "names", "skale-terms", "solidity"], + "dictionaryDefinitions": [ + { "name": "skale-terms", "path": "dictionary/skale-terms.txt"}, + { "name": "libraries", "path": "dictionary/libraries.txt"}, + { "name": "domain-terms", "path": "dictionary/domain-terms.txt"}, + { "name": "names", "path": "dictionary/names.txt"}, + { "name": "solidity", "path": "dictionary/solidity.txt"} + ] +} diff --git a/proxy/data/.keep b/data/.keep similarity index 100% rename from proxy/data/.keep rename to data/.keep diff --git a/deployer/README.md b/deployer/README.md index c8f9dfbe8..4f6a2378c 100644 --- a/deployer/README.md +++ b/deployer/README.md @@ -1,4 +1,5 @@ + # SKALE IMA Deployer @@ -6,11 +7,11 @@ These helper scripts will deploy `IMA` on a SKALE chain. ## Usage -1) Place credentials files for each SKALE chain into the `creds` directory -2) Run `python deployer.py` +1) Place credentials files for each SKALE chain into the `creds` directory +2) Run `python deployer.py` ## Requirements -- python 3.6+ -- scp -- all dependencies for truffle deployment (see `proxy` folder) +- python 3.6+ +- scp +- all dependencies for truffle deployment (see root folder) diff --git a/dictionary b/dictionary new file mode 160000 index 000000000..cb48388ff --- /dev/null +++ b/dictionary @@ -0,0 +1 @@ +Subproject commit cb48388ffc15af680430e2174bb51ebc61c3ce0c diff --git a/docs/deployment.md b/docs/deployment.md index 24d179e20..15695d301 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -1,4 +1,5 @@ + # IMA Deployment and Initialization @@ -18,7 +19,7 @@ Deploy process includes: 2) `SKALE Chain` network with known HTTP(S) URL of **Web3** interface. -3) Preliminary deployed **Skale Manager** software with known address of **ContractManager** smart contract saved into the `proxy/data/skaleManagerComponents.json` file like shown in the following example: +3) Preliminary deployed **Skale Manager** software with known address of **ContractManager** smart contract saved into the `data/skaleManagerComponents.json` file like shown in the following example: ```json { @@ -26,33 +27,14 @@ Deploy process includes: } ``` -4) `libBLS` command utilities - -5) Truffle version **5.0.12** is recommended to install (notice, the _-g_ option of _npm_ may require _sudo_): - - ```shell - sudo npm uninstall -g truffle - sudo npm install -g truffle@5.0.12 - truffle --version - ``` - -6) Node modules should be initialized in the following folders: - ```shell - export IMA_ROOT=..... - cd $IMA_ROOT/proxy; npm install - cd $IMA_ROOT/npms/skale-owasp; npm install - cd $IMA_ROOT/npms/skale-ima; npm install - cd $IMA_ROOT/agent; npm install - ``` - ## Smart Contracts Installation ### Configure Truffle -Edit the `$IMA_ROOT/proxy/truffle-config.js` and specify needed networks (`Mainnet` and `SKALE Chain`) and account addresses which will own contracts on these blockchains: +Edit the `$IMA_ROOT/truffle-config.js` and specify needed networks (`Mainnet` and `SKALE Chain`) and account addresses which will own contracts on these blockchains: ```shell -cd $IMA_ROOT/proxy +cd $IMA_ROOT nano ./truffle-config.js ``` @@ -83,7 +65,7 @@ Initialize required environment variables. Example of `.env` file can be found i Build all the contracts once to ensure everything initialized OK: ```shell -cd $IMA_ROOT/proxy +cd $IMA_ROOT mkdir -p data || true rm -rf ./build rm -rf ./data/proxy* @@ -94,7 +76,7 @@ ls -1 ./data/ ### Smart contract Deployment for Main Net ```shell -cd $IMA_ROOT/proxy +cd $IMA_ROOT npm run deploy-to-mainnet ls -1 ./data/ ``` @@ -104,7 +86,7 @@ You should see **proxyMainnet.json** file listed. #### Smart contract Deployment for S-Chain ```shell -cd $IMA_ROOT/proxy +cd $IMA_ROOT npm run deploy-to-schain ls -1 ./data/ ``` @@ -126,8 +108,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -143,8 +125,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -162,8 +144,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -210,8 +192,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --address-s-chain=0x66c5a87f4a49dd75e970055a265e8dd5c3f8f852 ``` @@ -232,8 +214,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --address-main-net=[ADDRESS] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -253,8 +235,8 @@ node ./main.js --verbose=9 \ --cid-main-net=-4 \ --cid-s-chain=-4 \ --id-s-chain=Bob \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] ``` @@ -273,8 +255,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] ``` @@ -312,8 +294,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -331,8 +313,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -350,8 +332,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] ``` @@ -399,8 +381,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --erc20-main-net=data-mn.json \ --erc20-s-chain=data-sc.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ @@ -428,8 +410,8 @@ node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --erc20-main-net=data-mn.json \ --erc20-s-chain=data-sc.json \ --address-main-net=[ADDRESS] \ @@ -536,8 +518,8 @@ reset; node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] \ --sign-messages \ @@ -553,8 +535,8 @@ reset; node ./main.js --verbose=9 \ --id-s-chain=Bob \ --cid-main-net=-4 \ --cid-s-chain=-4 \ - --abi-main-net=../proxy/data/proxyMainnet.json \ - --abi-s-chain=../proxy/data/proxySchain_Bob.json \ + --abi-main-net=../data/proxyMainnet.json \ + --abi-s-chain=../data/proxySchain_Bob.json \ --key-main-net=[YOUR_ETH_PRIVATE_KEY] \ --key-s-chain=[YOUR_PRIVATE_KEY] \ --sign-messages \ diff --git a/proxy/gas/calculateGas.ts b/gas/calculateGas.ts similarity index 79% rename from proxy/gas/calculateGas.ts rename to gas/calculateGas.ts index 6b607edb3..de1f32c81 100644 --- a/proxy/gas/calculateGas.ts +++ b/gas/calculateGas.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { CommunityLocker, CommunityPool, @@ -79,22 +79,29 @@ import { deployTokenManagerERC1155 } from "../test/utils/deploy/schain/tokenMana import { deployMessageProxyForSchain } from "../test/utils/deploy/schain/messageProxyForSchain"; import { deployMessages } from "../test/utils/deploy/messages"; -import { stringKeccak256, getPublicKey } from "../test/utils/helper"; +import { getPublicKey } from "../test/utils/helper"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, Wallet, HDNodeWallet, ContractTransactionReceipt } from "ethers"; import { expect } from "chai"; import { deployCommunityLocker } from "../test/utils/deploy/schain/communityLocker"; import { deployCommunityPool } from "../test/utils/deploy/mainnet/communityPool"; +function getGasUsed(res: ContractTransactionReceipt | null): bigint { + if (!res) { + throw new Error("Transaction result is null"); + } + return res.gasUsed; +} + describe("Gas calculation", () => { let deployer: SignerWithAddress; let user: SignerWithAddress; let schainOwner: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let imaLinker: Linker; let depositBoxEth: DepositBoxEth; @@ -130,20 +137,20 @@ describe("Gas calculation", () => { let ERC1155TokenOnSchain: ERC1155OnChain; const schainName = "GasCalculation"; - const schainNameHash = stringKeccak256("GasCalculation"); + const schainNameHash = ethers.id("GasCalculation"); const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const mainnetName = "Mainnet"; before(async () => { [deployer, schainOwner, user, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - ethers.parseEther("1")}); }) after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - ethers.parseEther("1")}); }); beforeEach(async () => { @@ -155,17 +162,17 @@ describe("Gas calculation", () => { schainsInternal = await (await ethers.getContractFactory("SchainsInternal")).deploy() as SchainsInternal; skaleVerifier = await (await ethers.getContractFactory("SkaleVerifierMock")).deploy() as SkaleVerifierMock; wallets = await (await ethers.getContractFactory("Wallets")).deploy() as Wallets; - await contractManager.connect(deployer).setContractsAddress("KeyStorage", keyStorage.address); - await contractManager.connect(deployer).setContractsAddress("Nodes", nodes.address); - await contractManager.connect(deployer).setContractsAddress("Schains", schains.address); - await contractManager.connect(deployer).setContractsAddress("SchainsInternal", schainsInternal.address); - await contractManager.connect(deployer).setContractsAddress("SkaleVerifier", skaleVerifier.address); - await contractManager.connect(deployer).setContractsAddress("Wallets", wallets.address); + await contractManager.connect(deployer).setContractsAddress("KeyStorage", keyStorage); + await contractManager.connect(deployer).setContractsAddress("Nodes", nodes); + await contractManager.connect(deployer).setContractsAddress("Schains", schains); + await contractManager.connect(deployer).setContractsAddress("SchainsInternal", schainsInternal); + await contractManager.connect(deployer).setContractsAddress("SkaleVerifier", skaleVerifier); + await contractManager.connect(deployer).setContractsAddress("Wallets", wallets); // add ContractManager to contracts - await schains.connect(deployer).addContractManager(contractManager.address); - await schainsInternal.connect(deployer).addContractManager(contractManager.address); - await wallets.connect(deployer).addContractManager(contractManager.address); + await schains.connect(deployer).addContractManager(contractManager); + await schainsInternal.connect(deployer).addContractManager(contractManager); + await wallets.connect(deployer).addContractManager(contractManager); // setup 16 nodes const nodeCreationParams = { @@ -224,41 +231,41 @@ describe("Gas calculation", () => { depositBoxERC1155 = await deployDepositBoxERC1155(contractManager, imaLinker, messageProxyForMainnet); const extraContractRegistrarRole = await messageProxyForMainnet.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForMainnet.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxyForMainnet.registerExtraContractForAll(depositBoxEth.address) - await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC20.address) - await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC721.address) - await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC1155.address) - await messageProxyForMainnet.registerExtraContractForAll(communityPool.address) - await messageProxyForMainnet.registerExtraContractForAll(imaLinker.address) + await messageProxyForMainnet.registerExtraContractForAll(depositBoxEth) + await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC20) + await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC721) + await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC1155) + await messageProxyForMainnet.registerExtraContractForAll(communityPool) + await messageProxyForMainnet.registerExtraContractForAll(imaLinker) messages = await deployMessages(); // IMA schain part deployment - messageProxyForSchain = await deployMessageProxyForSchain(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchain(keyStorage, schainName); await keyStorage.connect(deployer).setBlsCommonPublicKey(BLSPublicKey); - tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, imaLinker.address); - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, communityPool.address); + tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, await imaLinker.getAddress()); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, await communityPool.getAddress()); tokenManagerEth = await deployTokenManagerEth( schainName, - messageProxyForSchain.address, + messageProxyForSchain, tokenManagerLinker, communityLocker, - depositBoxEth.address, + await depositBoxEth.getAddress(), "0x0000000000000000000000000000000000000000"); - tokenManagerERC20 = await deployTokenManagerERC20(schainName, messageProxyForSchain.address, tokenManagerLinker, communityLocker, depositBoxERC20.address); - tokenManagerERC721 = await deployTokenManagerERC721(schainName, messageProxyForSchain.address, tokenManagerLinker, communityLocker, depositBoxERC721.address); - tokenManagerERC1155 = await deployTokenManagerERC1155(schainName, messageProxyForSchain.address, tokenManagerLinker, communityLocker, depositBoxERC1155.address); + tokenManagerERC20 = await deployTokenManagerERC20(schainName, messageProxyForSchain, tokenManagerLinker, communityLocker, await depositBoxERC20.getAddress()); + tokenManagerERC721 = await deployTokenManagerERC721(schainName, messageProxyForSchain, tokenManagerLinker, communityLocker, await depositBoxERC721.getAddress()); + tokenManagerERC1155 = await deployTokenManagerERC1155(schainName, messageProxyForSchain, tokenManagerLinker, communityLocker, await depositBoxERC1155.getAddress()); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxyForSchain.registerExtraContractForAll(tokenManagerEth.address) - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC20.address) - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address) - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC1155.address) - await messageProxyForSchain.registerExtraContractForAll(communityLocker.address) + await messageProxyForSchain.registerExtraContractForAll(tokenManagerEth) + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC20) + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721) + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC1155) + await messageProxyForSchain.registerExtraContractForAll(communityLocker) ethERC20 = await deployEthErc20(tokenManagerEth); - await tokenManagerEth.connect(deployer).setEthErc20Address(ethERC20.address); + await tokenManagerEth.connect(deployer).setEthErc20Address(ethERC20); const chainConnectorRole = await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(); - await messageProxyForSchain.connect(deployer).grantRole(chainConnectorRole, tokenManagerLinker.address); + await messageProxyForSchain.connect(deployer).grantRole(chainConnectorRole, tokenManagerLinker); await tokenManagerERC20.connect(deployer).grantRole(await tokenManagerERC20.TOKEN_REGISTRAR_ROLE(), schainOwner.address); await tokenManagerERC721.connect(deployer).grantRole(await tokenManagerERC721.TOKEN_REGISTRAR_ROLE(), schainOwner.address); await tokenManagerERC1155.connect(deployer).grantRole(await tokenManagerERC1155.TOKEN_REGISTRAR_ROLE(), schainOwner.address); @@ -269,16 +276,16 @@ describe("Gas calculation", () => { // await lockAndDataForSchain.setContract("ERC20Module", erc20ModuleForSchain.address); // await lockAndDataForSchain.setContract("ERC721Module", erc721ModuleForSchain.address); // await lockAndDataForSchain.setContract("TokenManager", tokenManager.address); - // await lockAndDataForSchain.setContract("MessageProxy", messageProxyForSchain.address); + // await lockAndDataForSchain.setContract("MessageProxy", messageProxyForSchain); // await lockAndDataForSchain.setContract("TokenFactory", tokenFactory.address); // IMA registration - await messageProxyForMainnet.grantRole(await messageProxyForMainnet.CHAIN_CONNECTOR_ROLE(), imaLinker.address); - await imaLinker.connectSchain(schainName, [tokenManagerLinker.address, communityLocker.address, tokenManagerEth.address, tokenManagerERC20.address, tokenManagerERC721.address, tokenManagerERC1155.address]); + await messageProxyForMainnet.grantRole(await messageProxyForMainnet.CHAIN_CONNECTOR_ROLE(), imaLinker); + await imaLinker.connectSchain(schainName, [tokenManagerLinker, communityLocker, tokenManagerEth, tokenManagerERC20, tokenManagerERC721, tokenManagerERC1155]); await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: 1e18.toString() }); - // await lockAndDataForSchain.addDepositBox(depositBoxEth.address); - // await lockAndDataForSchain.addDepositBox(depositBoxERC20.address); - // await lockAndDataForSchain.addDepositBox(depositBoxERC721.address); + // await lockAndDataForSchain.addDepositBox(depositBoxEth); + // await lockAndDataForSchain.addDepositBox(depositBoxERC20); + // await lockAndDataForSchain.addDepositBox(depositBoxERC721); // Deploy test tokens ERC20TokenOnMainnet = await deployERC20OnChain("GCERC20", "GCE"); @@ -291,7 +298,7 @@ describe("Gas calculation", () => { // Mint tokens and grant minter role await ERC20TokenOnMainnet.mint(user.address, 5); const minterRoleERC20 = await ERC20TokenOnSchain.MINTER_ROLE(); - await ERC20TokenOnSchain.grantRole(minterRoleERC20, tokenManagerERC20.address); + await ERC20TokenOnSchain.grantRole(minterRoleERC20, tokenManagerERC20); await ERC721TokenOnMainnet.mint(user.address, 1); await ERC721TokenOnMainnet.mint(user.address, 2); @@ -304,7 +311,7 @@ describe("Gas calculation", () => { await ERC721TokenOnMainnet.mint(user.address, 9); await ERC721TokenOnMainnet.mint(user.address, 10); const minterRoleERC721 = await ERC721TokenOnSchain.MINTER_ROLE(); - await ERC721TokenOnSchain.grantRole(minterRoleERC721, tokenManagerERC721.address); + await ERC721TokenOnSchain.grantRole(minterRoleERC721, tokenManagerERC721); await ERC1155TokenOnMainnet.mint(user.address, 1, 1, "0x"); await ERC1155TokenOnMainnet.mint(user.address, 2, 2, "0x"); @@ -317,7 +324,7 @@ describe("Gas calculation", () => { await ERC1155TokenOnMainnet.mint(user.address, 9, 9, "0x"); await ERC1155TokenOnMainnet.mint(user.address, 10, 10, "0x"); const minterRoleERC1155 = await ERC1155TokenOnSchain.MINTER_ROLE(); - await ERC1155TokenOnSchain.grantRole(minterRoleERC1155, tokenManagerERC1155.address); + await ERC1155TokenOnSchain.grantRole(minterRoleERC1155, tokenManagerERC1155); // register user await communityPool.connect(user).rechargeUserWallet(schainName, user.address, {value: "1000000000000000000"}); @@ -325,234 +332,234 @@ describe("Gas calculation", () => { it("calculate eth deposits", async () => { let res = await (await depositBoxEth.connect(user).deposit(schainName, {value: "1000000000000000000"})).wait(); - console.log("First deposit eth cost:", res.gasUsed.toNumber()); + console.log("First deposit eth cost:", getGasUsed(res)); res = await (await depositBoxEth.connect(user).deposit(schainName, {value: "1000000000000000000"})).wait(); - console.log("Second deposit eth cost:", res.gasUsed.toNumber()); + console.log("Second deposit eth cost:", getGasUsed(res)); res = await (await depositBoxEth.connect(user).deposit(schainName, {value: "1000000000000000000"})).wait(); - console.log("Third deposit eth cost:", res.gasUsed.toNumber()); + console.log("Third deposit eth cost:", getGasUsed(res)); res = await (await depositBoxEth.connect(user).deposit(schainName, {value: "1000000000000000000"})).wait(); - console.log("Forth deposit eth cost:", res.gasUsed.toNumber()); + console.log("Forth deposit eth cost:", getGasUsed(res)); res = await (await depositBoxEth.connect(user).deposit(schainName, {value: "1000000000000000000"})).wait(); - console.log("Fifth deposit eth cost:", res.gasUsed.toNumber()); + console.log("Fifth deposit eth cost:", getGasUsed(res)); }); describe("ERC20 init", async () => { beforeEach(async () => { - let res = await (await tokenManagerERC20.connect(schainOwner).addERC20TokenByOwner(mainnetName, ERC20TokenOnMainnet.address, ERC20TokenOnSchain.address)).wait(); - console.log("Registration of ERC20 token in TokenManager cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, ERC20TokenOnMainnet.address)).wait(); - console.log("Registration of ERC20 token in DepositBox cost:", res.gasUsed.toNumber()); + let res = await (await tokenManagerERC20.connect(schainOwner).addERC20TokenByOwner(mainnetName, ERC20TokenOnMainnet, ERC20TokenOnSchain)).wait(); + console.log("Registration of ERC20 token in TokenManager cost:", getGasUsed(res)); + res = await (await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, ERC20TokenOnMainnet)).wait(); + console.log("Registration of ERC20 token in DepositBox cost:", getGasUsed(res)); }); it("calculate registration and approve ERC20", async () => { - let res = await (await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20.address, 2)).wait(); - console.log("First approve of ERC20 token cost:", res.gasUsed.toNumber()); - res = await (await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20.address, 2)).wait(); - console.log("Second approve of ERC20 token cost:", res.gasUsed.toNumber()); + let res = await (await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20, 2)).wait(); + console.log("First approve of ERC20 token cost:", getGasUsed(res)); + res = await (await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20, 2)).wait(); + console.log("Second approve of ERC20 token cost:", getGasUsed(res)); }); it("calculate erc20 deposits without eth without automatic deploy", async () => { - await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20.address, 5); - - let res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, 1)).wait(); - console.log("First deposit erc20 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, 1)).wait(); - console.log("Second deposit erc20 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, 1)).wait(); - console.log("Third deposit erc20 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, 1)).wait(); - console.log("Forth deposit erc20 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, 1)).wait(); - console.log("Deposit all remaining approved erc20 tokens cost:", res.gasUsed.toNumber()); + await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20, 5); + + let res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, 1)).wait(); + console.log("First deposit erc20 cost:", getGasUsed(res)); + res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, 1)).wait(); + console.log("Second deposit erc20 cost:", getGasUsed(res)); + res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, 1)).wait(); + console.log("Third deposit erc20 cost:", getGasUsed(res)); + res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, 1)).wait(); + console.log("Forth deposit erc20 cost:", getGasUsed(res)); + res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, 1)).wait(); + console.log("Deposit all remaining approved erc20 tokens cost:", getGasUsed(res)); }); it("calculate erc20 deposits of all approved tokens without eth without automatic deploy", async () => { - await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20.address, 5); + await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20, 5); - const res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, 5)).wait(); - console.log("Deposit all approved erc20 tokens at once cost:", res.gasUsed.toNumber()); + const res = await (await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, 5)).wait(); + console.log("Deposit all approved erc20 tokens at once cost:", getGasUsed(res)); }); }); describe("ERC721 init", async () => { beforeEach(async () => { - let res = await (await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, ERC721TokenOnMainnet.address, ERC721TokenOnSchain.address)).wait(); - console.log("Registration of ERC721 token in TokenManager cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(schainOwner).addERC721TokenByOwner(schainName, ERC721TokenOnMainnet.address)).wait(); - console.log("Registration of ERC721 token in DepositBox cost:", res.gasUsed.toNumber()); + let res = await (await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, ERC721TokenOnMainnet, ERC721TokenOnSchain)).wait(); + console.log("Registration of ERC721 token in TokenManager cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(schainOwner).addERC721TokenByOwner(schainName, ERC721TokenOnMainnet)).wait(); + console.log("Registration of ERC721 token in DepositBox cost:", getGasUsed(res)); }); it("calculate registration and approve ERC721", async () => { - let res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 1)).wait(); - console.log("First transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 2)).wait(); - console.log("Second transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 3)).wait(); - console.log("Third transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 4)).wait(); - console.log("Forth transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 5)).wait(); - console.log("Fifth transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 6)).wait(); - console.log("Sixth transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 7)).wait(); - console.log("Seventh transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 8)).wait(); - console.log("Eighth transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 9)).wait(); - console.log("Ninth transfer of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 10)).wait(); - console.log("Tenth transfer of ERC721 token cost:", res.gasUsed.toNumber()); + let res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 1)).wait(); + console.log("First transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 2)).wait(); + console.log("Second transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 3)).wait(); + console.log("Third transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 4)).wait(); + console.log("Forth transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 5)).wait(); + console.log("Fifth transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 6)).wait(); + console.log("Sixth transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 7)).wait(); + console.log("Seventh transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 8)).wait(); + console.log("Eighth transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 9)).wait(); + console.log("Ninth transfer of ERC721 token cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 10)).wait(); + console.log("Tenth transfer of ERC721 token cost:", getGasUsed(res)); }); it("calculate erc721 deposits without eth without automatic deploy", async () => { - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 1); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 2); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 3); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 4); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 5); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 6); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 7); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 8); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 9); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 10); - - let res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 1)).wait(); - console.log("First deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 2)).wait(); - console.log("Second deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 3)).wait(); - console.log("Third deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 4)).wait(); - console.log("Forth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 5)).wait(); - console.log("Fifth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 6)).wait(); - console.log("Sixth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 7)).wait(); - console.log("Seventh deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 8)).wait(); - console.log("Eighth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 9)).wait(); - console.log("Ninth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 10)).wait(); - console.log("Tenth deposit erc721 cost:", res.gasUsed.toNumber()); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 1); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 2); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 3); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 4); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 5); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 6); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 7); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 8); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 9); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 10); + + let res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 1)).wait(); + console.log("First deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 2)).wait(); + console.log("Second deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 3)).wait(); + console.log("Third deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 4)).wait(); + console.log("Forth deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 5)).wait(); + console.log("Fifth deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 6)).wait(); + console.log("Sixth deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 7)).wait(); + console.log("Seventh deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 8)).wait(); + console.log("Eighth deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 9)).wait(); + console.log("Ninth deposit erc721 cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 10)).wait(); + console.log("Tenth deposit erc721 cost:", getGasUsed(res)); }); it("calculate erc721 deposits without eth without automatic deploy and approve each time", async () => { - let res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 1)).wait(); - console.log("First approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 1)).wait(); - console.log("First deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 2)).wait(); - console.log("Second approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 2)).wait(); - console.log("Second deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 3)).wait(); - console.log("Third approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 3)).wait(); - console.log("Third deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 4)).wait(); - console.log("Forth approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 4)).wait(); - console.log("Forth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 5)).wait(); - console.log("Fifth approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 5)).wait(); - console.log("Fifth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 6)).wait(); - console.log("Sixth approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 6)).wait(); - console.log("Sixth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 7)).wait(); - console.log("Seventh approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 7)).wait(); - console.log("Seventh deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 8)).wait(); - console.log("Eighth approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 8)).wait(); - console.log("Eighth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 9)).wait(); - console.log("Ninth approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 9)).wait(); - console.log("Ninth deposit erc721 cost:", res.gasUsed.toNumber()); - res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 10)).wait(); - console.log("Tenth approve of ERC721 token cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, 10)).wait(); - console.log("Tenth deposit erc721 cost:", res.gasUsed.toNumber()); + let res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 1)).wait(); + console.log("First approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 1)).wait(); + console.log("First deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 2)).wait(); + console.log("Second approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 2)).wait(); + console.log("Second deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 3)).wait(); + console.log("Third approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 3)).wait(); + console.log("Third deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 4)).wait(); + console.log("Forth approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 4)).wait(); + console.log("Forth deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 5)).wait(); + console.log("Fifth approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 5)).wait(); + console.log("Fifth deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 6)).wait(); + console.log("Sixth approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 6)).wait(); + console.log("Sixth deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 7)).wait(); + console.log("Seventh approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 7)).wait(); + console.log("Seventh deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 8)).wait(); + console.log("Eighth approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 8)).wait(); + console.log("Eighth deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 9)).wait(); + console.log("Ninth approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 9)).wait(); + console.log("Ninth deposit erc721 cost:", getGasUsed(res)); + res = await (await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 10)).wait(); + console.log("Tenth approve of ERC721 token cost:", getGasUsed(res)); + res = await (await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, 10)).wait(); + console.log("Tenth deposit erc721 cost:", getGasUsed(res)); }); }); describe("ERC1155 init", async () => { beforeEach(async () => { - let res = await (await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, ERC1155TokenOnMainnet.address, ERC1155TokenOnSchain.address)).wait(); - console.log("Registration of ERC1155 token in TokenManager cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(schainOwner).addERC1155TokenByOwner(schainName, ERC1155TokenOnMainnet.address)).wait(); - console.log("Registration of ERC1155 token in DepositBox cost:", res.gasUsed.toNumber()); + let res = await (await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, ERC1155TokenOnMainnet, ERC1155TokenOnSchain)).wait(); + console.log("Registration of ERC1155 token in TokenManager cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(schainOwner).addERC1155TokenByOwner(schainName, ERC1155TokenOnMainnet)).wait(); + console.log("Registration of ERC1155 token in DepositBox cost:", getGasUsed(res)); }); it("calculate registration and approve ERC1155", async () => { - const res = await (await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155.address, true)).wait(); - console.log("Approve ERC1155 token cost:", res.gasUsed.toNumber()); + const res = await (await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155, true)).wait(); + console.log("Approve ERC1155 token cost:", getGasUsed(res)); }); it("calculate erc1155 deposits without eth without automatic deploy", async () => { - await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155.address, true); - - let res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 1, 1)).wait(); - console.log("First deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 2, 2)).wait(); - console.log("Second deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 3, 3)).wait(); - console.log("Third deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 4, 4)).wait(); - console.log("Forth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 5, 5)).wait(); - console.log("Fifth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 6, 6)).wait(); - console.log("Sixth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 7, 7)).wait(); - console.log("Seventh deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 8, 8)).wait(); - console.log("Eighth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 9, 9)).wait(); - console.log("Ninth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, 10, 10)).wait(); - console.log("Tenth deposit erc1155 cost:", res.gasUsed.toNumber()); + await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155, true); + + let res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 1, 1)).wait(); + console.log("First deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 2, 2)).wait(); + console.log("Second deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 3, 3)).wait(); + console.log("Third deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 4, 4)).wait(); + console.log("Forth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 5, 5)).wait(); + console.log("Fifth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 6, 6)).wait(); + console.log("Sixth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 7, 7)).wait(); + console.log("Seventh deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 8, 8)).wait(); + console.log("Eighth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 9, 9)).wait(); + console.log("Ninth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, 10, 10)).wait(); + console.log("Tenth deposit erc1155 cost:", getGasUsed(res)); }); it("calculate erc1155 deposits batches without eth without automatic deploy", async () => { - await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155.address, true); - - let res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])).wait(); - console.log("First deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1, 1, 1])).wait(); - console.log("Second deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [3, 4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1, 1])).wait(); - console.log("Third deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1])).wait(); - console.log("Forth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1])).wait(); - console.log("Fifth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [6, 7, 8, 9, 10], [1, 1, 1, 1, 1])).wait(); - console.log("Sixth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [7, 8, 9, 10], [1, 1, 1, 1])).wait(); - console.log("Seventh deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [8, 9, 10], [1, 1, 1])).wait(); - console.log("Eighth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [9, 10], [1, 1])).wait(); - console.log("Ninth deposit erc1155 cost:", res.gasUsed.toNumber()); - res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, [10], [1])).wait(); - console.log("Tenth deposit erc1155 cost:", res.gasUsed.toNumber()); + await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155, true); + + let res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])).wait(); + console.log("First deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1, 1, 1])).wait(); + console.log("Second deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [3, 4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1, 1])).wait(); + console.log("Third deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [4, 5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1, 1])).wait(); + console.log("Forth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [5, 6, 7, 8, 9, 10], [1, 1, 1, 1, 1, 1])).wait(); + console.log("Fifth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [6, 7, 8, 9, 10], [1, 1, 1, 1, 1])).wait(); + console.log("Sixth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [7, 8, 9, 10], [1, 1, 1, 1])).wait(); + console.log("Seventh deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [8, 9, 10], [1, 1, 1])).wait(); + console.log("Eighth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [9, 10], [1, 1])).wait(); + console.log("Ninth deposit erc1155 cost:", getGasUsed(res)); + res = await (await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, [10], [1])).wait(); + console.log("Tenth deposit erc1155 cost:", getGasUsed(res)); }); }); describe("Exits", async() => { // prepare BLS signature // P.s. this is test signature from test of SkaleManager.SkaleVerifier - please do not use it!!! - const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781"), + const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781", ]; const sign = { blsSignature: BlsSignature, @@ -568,7 +575,7 @@ describe("Gas calculation", () => { arrayOfMessages, sign )).wait(); - console.log(action, "cost:", res.gasUsed.toNumber()); + console.log(action, "cost:", getGasUsed(res)); } describe("Eth transfers ready", async () => { @@ -577,8 +584,8 @@ describe("Gas calculation", () => { async function getEthMessage() { return { data: await messages.encodeTransferEthMessage(user.address, "1000000000000000000"), - destinationContract: depositBoxEth.address, - sender: tokenManagerEth.address, + destinationContract: depositBoxEth, + sender: tokenManagerEth, }; } @@ -588,7 +595,7 @@ describe("Gas calculation", () => { async function getMyEth(action: string) { const res = await (await depositBoxEth.connect(user).getMyEth()).wait(); - console.log(action, "getMyEth eth cost:", res.gasUsed.toNumber()); + console.log(action, "getMyEth eth cost:", getGasUsed(res)); } it("calculate 1 exit eth cost per one message", async () => { @@ -812,27 +819,27 @@ describe("Gas calculation", () => { describe("ERC20 Token registered and approved", async () => { - // prepare exit message of erc20 token - await TokenManager.exitToMainERC20(ERC20TokenOnMainnet.address, amount, {from: user}); + // prepare exit message of erc20 token - await TokenManager.exitToMainERC20(ERC20TokenOnMainnet, amount, {from: user}); async function getERC20Message(amount: number) { return { - data: await messages.encodeTransferErc20Message(ERC20TokenOnMainnet.address, user.address, amount), - destinationContract: depositBoxERC20.address, - sender: tokenManagerERC20.address + data: await messages.encodeTransferErc20Message(ERC20TokenOnMainnet, user.address, amount), + destinationContract: depositBoxERC20, + sender: tokenManagerERC20 }; } async function sendERC20(amount: number) { - await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet.address, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, ERC20TokenOnMainnet, amount); } async function checkBalance() { - ((await ERC20TokenOnMainnet.balanceOf(user.address)).toString()).should.be.equal(BigNumber.from(5).toString()); + (await ERC20TokenOnMainnet.balanceOf(user.address)).should.be.equal(5); } beforeEach(async () => { - await tokenManagerERC20.connect(schainOwner).addERC20TokenByOwner(mainnetName, ERC20TokenOnMainnet.address, ERC20TokenOnSchain.address); - await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, ERC20TokenOnMainnet.address); - await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20.address, 5); + await tokenManagerERC20.connect(schainOwner).addERC20TokenByOwner(mainnetName, ERC20TokenOnMainnet, ERC20TokenOnSchain); + await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, ERC20TokenOnMainnet); + await ERC20TokenOnMainnet.connect(user).approve(depositBoxERC20, 5); }); afterEach(async() => { @@ -919,17 +926,17 @@ describe("Gas calculation", () => { describe("ERC721 Token registered and approved", async() => { - // prepare exit message of erc721 token - await TokenManager.exitToMainERC721(ERC721TokenOnMainnet.address, tokenId, {from: user}); + // prepare exit message of erc721 token - await TokenManager.exitToMainERC721(ERC721TokenOnMainnet, tokenId, {from: user}); async function getERC721Message(tokenId: number) { return { - data: await messages.encodeTransferErc721Message(ERC721TokenOnMainnet.address, user.address, tokenId), - destinationContract: depositBoxERC721.address, - sender: tokenManagerERC721.address + data: await messages.encodeTransferErc721Message(ERC721TokenOnMainnet, user.address, tokenId), + destinationContract: depositBoxERC721, + sender: tokenManagerERC721 }; } async function sendERC721(tokenId: number) { - await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet.address, tokenId); + await depositBoxERC721.connect(user).depositERC721(schainName, ERC721TokenOnMainnet, tokenId); } async function checkBalance() { @@ -941,13 +948,13 @@ describe("Gas calculation", () => { } beforeEach(async() => { - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, ERC721TokenOnMainnet.address, ERC721TokenOnSchain.address); - await depositBoxERC721.connect(schainOwner).addERC721TokenByOwner(schainName, ERC721TokenOnMainnet.address); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 1); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 2); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 3); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 4); - await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721.address, 5); + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, ERC721TokenOnMainnet, ERC721TokenOnSchain); + await depositBoxERC721.connect(schainOwner).addERC721TokenByOwner(schainName, ERC721TokenOnMainnet); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 1); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 2); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 3); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 4); + await ERC721TokenOnMainnet.connect(user).approve(depositBoxERC721, 5); }); afterEach(async() => { @@ -1054,45 +1061,45 @@ describe("Gas calculation", () => { describe("ERC1155 Token registered and approved", async() => { - // prepare exit message of erc1155 token - await TokenManager.exitToMainERC721(ERC721TokenOnMainnet.address, tokenId, amount, {from: user}); + // prepare exit message of erc1155 token - await TokenManager.exitToMainERC721(ERC721TokenOnMainnet, tokenId, amount, {from: user}); async function getERC1155Message(tokenId: number, amount: number) { return { - data: await messages.encodeTransferErc1155Message(ERC1155TokenOnMainnet.address, user.address, tokenId, amount), - destinationContract: depositBoxERC1155.address, - sender: tokenManagerERC1155.address + data: await messages.encodeTransferErc1155Message(ERC1155TokenOnMainnet, user.address, tokenId, amount), + destinationContract: depositBoxERC1155, + sender: tokenManagerERC1155 }; } - // prepare exit batch message of erc1155 token - await TokenManager.exitToMainERC721(ERC721TokenOnMainnet.address, tokenId, amounts, {from: user}); + // prepare exit batch message of erc1155 token - await TokenManager.exitToMainERC721(ERC721TokenOnMainnet, tokenId, amounts, {from: user}); async function getERC1155BatchMessage(tokenIds: number[], amounts: number[]) { return { - data: await messages.encodeTransferErc1155BatchMessage(ERC1155TokenOnMainnet.address, user.address, tokenIds, amounts), - destinationContract: depositBoxERC1155.address, - sender: tokenManagerERC1155.address + data: await messages.encodeTransferErc1155BatchMessage(ERC1155TokenOnMainnet, user.address, tokenIds, amounts), + destinationContract: depositBoxERC1155, + sender: tokenManagerERC1155 }; } async function sendERC1155(tokenId: number, amount: number) { - await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet.address, tokenId, amount); + await depositBoxERC1155.connect(user).depositERC1155(schainName, ERC1155TokenOnMainnet, tokenId, amount); } async function sendERC1155Batch(tokenIds: number[], amounts: number[]) { - await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet.address, tokenIds, amounts); + await depositBoxERC1155.connect(user).depositERC1155Batch(schainName, ERC1155TokenOnMainnet, tokenIds, amounts); } async function checkBalance() { const balanceIds = await ERC1155TokenOnMainnet.balanceOfBatch([user.address, user.address, user.address, user.address, user.address], [1, 2, 3, 4, 5]); const balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal([1, 2, 3, 4, 5]); } beforeEach(async() => { - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, ERC1155TokenOnMainnet.address, ERC1155TokenOnSchain.address); - await depositBoxERC1155.connect(schainOwner).addERC1155TokenByOwner(schainName, ERC1155TokenOnMainnet.address); - await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155.address, true); + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, ERC1155TokenOnMainnet, ERC1155TokenOnSchain); + await depositBoxERC1155.connect(schainOwner).addERC1155TokenByOwner(schainName, ERC1155TokenOnMainnet); + await ERC1155TokenOnMainnet.connect(user).setApprovalForAll(depositBoxERC1155, true); }); afterEach(async() => { diff --git a/proxy/hardhat.config.ts b/hardhat.config.ts similarity index 95% rename from proxy/hardhat.config.ts rename to hardhat.config.ts index ebd01cb73..f162b3f81 100644 --- a/proxy/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,6 +1,6 @@ import { HardhatUserConfig } from "hardhat/config"; -import "@nomiclabs/hardhat-etherscan"; -import "@nomiclabs/hardhat-waffle"; +import "@nomicfoundation/hardhat-verify"; +import "@nomicfoundation/hardhat-chai-matchers"; import "@openzeppelin/hardhat-upgrades"; import "@typechain/hardhat"; import "solidity-coverage"; diff --git a/proxy/migrations/changeManifest.ts b/migrations/changeManifest.ts similarity index 100% rename from proxy/migrations/changeManifest.ts rename to migrations/changeManifest.ts diff --git a/migrations/deployMainnet.ts b/migrations/deployMainnet.ts new file mode 100644 index 000000000..6b060adf6 --- /dev/null +++ b/migrations/deployMainnet.ts @@ -0,0 +1,274 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +/** + * @license + * SKALE IMA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/** + * @file deployMainnet.ts + * @copyright SKALE Labs 2019-Present + */ +import chalk from "chalk"; +import { promises as fs } from 'fs'; +import { AddressLike, Interface } from 'ethers'; +import { ethers, upgrades } from "hardhat"; +import { MessageProxyForMainnet, Linker, ContractManager, CommunityPool } from "../typechain"; +import { getAbi, getContractFactory, verifyProxy, getVersion } from '@skalenetwork/upgrade-tools'; +import { Manifest } from "@openzeppelin/upgrades-core"; +import { skaleContracts } from "@skalenetwork/skale-contracts-ethers-v6"; + + +export const depositBoxes = [ + "DepositBoxEth", + "DepositBoxERC20", + "DepositBoxERC721", + "DepositBoxERC1155", + "DepositBoxERC721WithMetadata" +]; + +export const contracts = [ + "MessageProxyForMainnet", + "Linker", + "CommunityPool", + ...depositBoxes +]; + +export function getContractKeyInAbiFile(contract: string) { + return contract === "MessageProxyForMainnet" + ? "message_proxy_mainnet" + : contract.replace(/([a-z0-9])(?=[A-Z])/g, '$1_').toLowerCase(); +} + +export async function getManifestFile(): Promise { + return (await Manifest.forNetwork(ethers.provider)).file; +} + +async function getContractManager() { + const skaleManager = await getSkaleManagerInstance(); + const contractManager = (await skaleManager.getContract("ContractManager")) as unknown as ContractManager; + return contractManager; +} + +async function getLinker(): Promise { + const contractManager = await getContractManager(); + const Linker = await ethers.getContractFactory("Linker"); + const linkerAddress = await contractManager.getContract("Linker"); + return Linker.attach(linkerAddress) as Linker; +} + +async function getMessageProxyForMainnet(): Promise { + const contractManager = await getContractManager(); + const MessageProxyForMainnet = await ethers.getContractFactory("MessageProxyForMainnet"); + const messageProxyForMainnetAddress = await contractManager.getContract("MessageProxyForMainnet"); + return MessageProxyForMainnet.attach(messageProxyForMainnetAddress) as MessageProxyForMainnet; +} + +async function getSkaleManagerInstance() { + if (!process.env.SKALE_MANAGER_ADDRESS) { + console.log(chalk.red("Specify desired skale-manager instance")); + console.log(chalk.red("Set instance alias or SkaleManager address to SKALE_MANAGER_ADDRESS environment variable")); + process.exit(1); + } + const network = await skaleContracts.getNetworkByProvider(ethers.provider); + const project = network.getProject("skale-manager"); + return await project.getInstance(process.env.SKALE_MANAGER_ADDRESS); +} + +async function setVersion(messageProxy: MessageProxyForMainnet, version: string) { + try { + console.log(`Set version ${version}`); + await (await messageProxy.setVersion(version)).wait(); + } catch { + console.error("Failed to set ima version on mainnet"); + } +} + +async function deployContract(name: string, args: string[], initializer: string) { + console.log("Deploy", name); + const factory = await getContractFactory(name); + const proxy = await upgrades.deployProxy(factory, args, { initializer }); + await proxy.waitForDeployment(); + const address = await proxy.getAddress(); + console.log("Proxy Contract", name, "deployed to", address); + await verifyProxy(name, address, []); + return proxy; +} + +async function registerContracts(linker: Linker, messageProxy: MessageProxyForMainnet, proxies: AddressLike[]) { + for (const proxy of proxies) { + await (await linker.registerMainnetContract(proxy)).wait(); + await (await messageProxy.registerExtraContractForAll(proxy)).wait(); + } +} + +async function deployMessageProxyForMainnet( + deployed: Map< + string, + { + address: string; + interface: Interface; + } + > +): Promise { + const [owner] = await ethers.getSigners(); + const contractManager = await getContractManager(); + const messageProxyForMainnet = await deployContract( + "MessageProxyForMainnet", + [await contractManager.getAddress()], + 'initialize(address)' + ) as unknown as MessageProxyForMainnet; + await contractManager.connect(owner).setContractsAddress("MessageProxyForMainnet", messageProxyForMainnet); + await messageProxyForMainnet.grantRole(await messageProxyForMainnet.EXTRA_CONTRACT_REGISTRAR_ROLE(), owner.address); + deployed.set("MessageProxyForMainnet", { + address: await messageProxyForMainnet.getAddress(), + interface: messageProxyForMainnet.interface + }); + return messageProxyForMainnet; +} + +async function deployLinker( + deployed: Map< + string, + { + address: string; + interface: Interface; + } + > +): Promise { + const [owner] = await ethers.getSigners(); + const contractManager = await getContractManager(); + const messageProxyForMainnet = await getMessageProxyForMainnet(); + const linker = await deployContract( + "Linker", + [ + await contractManager.getAddress(), + await messageProxyForMainnet.getAddress(), + ], + 'initialize(address,address)' + ) as unknown as Linker; + await contractManager.connect(owner).setContractsAddress("Linker", linker); + await messageProxyForMainnet.grantRole(await messageProxyForMainnet.CHAIN_CONNECTOR_ROLE(), linker); + await registerContracts(linker, messageProxyForMainnet, [linker]); + + deployed.set("Linker", { + address: await linker.getAddress(), + interface: linker.interface + }); + return linker; +} + +async function deployCommunityPool( + deployed: Map< + string, + { + address: string; + interface: Interface; + } + > +): Promise { + const [owner] = await ethers.getSigners(); + const contractManager = await getContractManager(); + const messageProxyForMainnet = await getMessageProxyForMainnet(); + const linker = await getLinker(); + const communityPool = await deployContract( + "CommunityPool", + [ + await contractManager.getAddress(), + await messageProxyForMainnet.getAddress(), + await linker.getAddress() + ], + 'initialize(address,address,address)' + ) as unknown as CommunityPool; + await contractManager.connect(owner).setContractsAddress("CommunityPool", communityPool); + await messageProxyForMainnet.setCommunityPool(communityPool); + await registerContracts(linker, messageProxyForMainnet, [communityPool]); + + deployed.set("CommunityPool", { + address: await communityPool.getAddress(), + interface: communityPool.interface + }); + return communityPool; +} + +async function deployDepositBoxes( + deployed: Map< + string, + { + address: string; + interface: Interface; + } + > +) { + const [owner] = await ethers.getSigners(); + const contractManager = await getContractManager(); + const linker = await getLinker(); + const messageProxyForMainnet = await getMessageProxyForMainnet(); + for (const contract of depositBoxes) { + const proxy = await deployContract( + contract, + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxyForMainnet.getAddress() + ], + 'initialize(address,address,address)' + ); + await registerContracts(linker, messageProxyForMainnet, [proxy]); + await contractManager.connect(owner).setContractsAddress(contract, proxy); + deployed.set(contract, { + address: await proxy.getAddress(), + interface: proxy.interface + }); + } +} + +async function main() { + const deployed = new Map(); + const version = await getVersion(); + + const messageProxyForMainnet = await deployMessageProxyForMainnet(deployed); + await setVersion(messageProxyForMainnet, version); + + await deployLinker(deployed); + await deployCommunityPool(deployed); + await deployDepositBoxes(deployed); + + console.log("Store ABIs"); + const outputObject: { [k: string]: string | [] } = {}; + for (const contract of contracts) { + const contractKey = getContractKeyInAbiFile(contract); + const deployedContract = deployed.get(contract); + if (!deployedContract) { + throw new Error(`Contract ${contract} was not found`); + } + outputObject[`${contractKey}_address`] = deployedContract.address; + outputObject[`${contractKey}_abi`] = getAbi(deployedContract.interface); + } + + await fs.writeFile("data/proxyMainnet.json", JSON.stringify(outputObject, null, 4)); + + console.log("Done"); +} + +if (require.main === module) { + main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); +} diff --git a/proxy/migrations/deploySchain.ts b/migrations/deploySchain.ts similarity index 64% rename from proxy/migrations/deploySchain.ts rename to migrations/deploySchain.ts index dcf726a16..bf0f18c83 100644 --- a/proxy/migrations/deploySchain.ts +++ b/migrations/deploySchain.ts @@ -19,30 +19,16 @@ */ /** - * @file deploySchain.js + * @file deploySchain.ts * @copyright SKALE Labs 2019-Present */ import { promises as fs } from 'fs'; -import { Interface } from "ethers/lib/utils"; +import { Interface } from "ethers"; import { ethers, upgrades } from "hardhat"; -import hre from "hardhat"; import { getAbi, getVersion } from '@skalenetwork/upgrade-tools'; import { Manifest } from "@openzeppelin/upgrades-core"; -import { getManifestAdmin } from "@openzeppelin/hardhat-upgrades/dist/admin"; -import { - CommunityLocker, - EthErc20, - KeyStorage, - MessageProxyForSchain, - TokenManagerERC20, - TokenManagerERC721, - TokenManagerEth, - TokenManagerLinker, - TokenManagerERC721WithMetadata, - MessageProxyForSchainWithoutSignature -} from '../typechain'; -import { TokenManagerERC1155 } from '../typechain'; -import { SkaleABIFile } from '@skalenetwork/upgrade-tools/dist/src/types/SkaleABIFile'; +import { MessageProxyForSchain, MessageProxyForSchainWithoutSignature } from '../typechain'; + export function getContractKeyInAbiFile(contract: string): string { if (contract === "MessageProxyForSchain") { @@ -57,7 +43,7 @@ export async function getManifestFile(): Promise { async function getProxyMainnet(contractName: string) { const defaultFilePath = "data/proxyMainnet.json"; - const jsonData = JSON.parse(await fs.readFile(defaultFilePath)) as SkaleABIFile; + const jsonData: { [key: string]: string | [] } = JSON.parse(await fs.readFile(defaultFilePath, 'utf-8')); try { const contractAddress = jsonData[contractName] as string; return contractAddress; @@ -120,10 +106,10 @@ async function main() { console.log("Deploy KeyStorage"); const keyStorageFactory = await ethers.getContractFactory("KeyStorage"); - const keyStorage = await upgrades.deployProxy(keyStorageFactory) as KeyStorage; - await keyStorage.deployTransaction.wait(); - deployed.set( "KeyStorage", { address: keyStorage.address, interface: keyStorage.interface } ); - console.log("Contract KeyStorage deployed to", keyStorage.address); + const keyStorage = await upgrades.deployProxy(keyStorageFactory); + await keyStorage.waitForDeployment(); + deployed.set( "KeyStorage", { address: await keyStorage.getAddress(), interface: keyStorage.interface } ); + console.log("Contract KeyStorage deployed to", await keyStorage.getAddress()); let messageProxy: MessageProxyForSchain | MessageProxyForSchainWithoutSignature; if( process.env.NO_SIGNATURES === "true" ) { @@ -136,12 +122,13 @@ async function main() { console.log("Deploy MessageProxyForSchain"); messageProxy = await upgrades.deployProxy( await ethers.getContractFactory("MessageProxyForSchain"), - [keyStorage.address, schainName] - ) as MessageProxyForSchain; + [await keyStorage.getAddress(), schainName] + ) as unknown as MessageProxyForSchain; } - await messageProxy.deployTransaction.wait(); - deployed.set( "MessageProxyForSchain", { address: messageProxy.address, interface: messageProxy.interface } ); - console.log("Contract MessageProxyForSchain deployed to", messageProxy.address); + await messageProxy.waitForDeployment(); + const messageProxyAddress = await messageProxy.getAddress(); + deployed.set( "MessageProxyForSchain", { address: messageProxyAddress, interface: messageProxy.interface } ); + console.log("Contract MessageProxyForSchain deployed to", messageProxyAddress); try { console.log(`Set version ${version}`) @@ -152,111 +139,123 @@ async function main() { console.log("Deploy TokenManagerLinker"); const tokenManagerLinkerFactory = await ethers.getContractFactory("TokenManagerLinker"); - const tokenManagerLinker = await upgrades.deployProxy(tokenManagerLinkerFactory, [ messageProxy.address, linkerAddress ] ) as TokenManagerLinker; - await tokenManagerLinker.deployTransaction.wait(); - deployed.set( "TokenManagerLinker", { address: tokenManagerLinker.address, interface: tokenManagerLinker.interface } ); - console.log("Contract TokenManagerLinker deployed to", tokenManagerLinker.address); + const tokenManagerLinker = await upgrades.deployProxy(tokenManagerLinkerFactory, [messageProxyAddress, linkerAddress]); + await tokenManagerLinker.waitForDeployment(); + deployed.set( "TokenManagerLinker", { + address: await tokenManagerLinker.getAddress(), + interface: tokenManagerLinker.interface + }); + console.log("Contract TokenManagerLinker deployed to", await tokenManagerLinker.getAddress()); console.log("Deploy CommunityLocker"); const communityLockerFactory = await ethers.getContractFactory("CommunityLocker"); const communityLocker = await upgrades.deployProxy( communityLockerFactory, - [ schainName, messageProxy.address, tokenManagerLinker.address, communityPoolAddress ] - ) as CommunityLocker; - await communityLocker.deployTransaction.wait(); - deployed.set( "CommunityLocker", { address: communityLocker.address, interface: communityLocker.interface }); - console.log("Contract CommunityLocker deployed to", communityLocker.address); + [ schainName, messageProxyAddress, await tokenManagerLinker.getAddress(), communityPoolAddress ] + ); + await communityLocker.waitForDeployment(); + deployed.set( "CommunityLocker", { address: await communityLocker.getAddress(), interface: communityLocker.interface }); + console.log("Contract CommunityLocker deployed to", await communityLocker.getAddress()); console.log("Deploy TokenManagerEth"); const tokenManagerEthFactory = await ethers.getContractFactory("TokenManagerEth"); const tokenManagerEth = await upgrades.deployProxy(tokenManagerEthFactory, [ schainName, - messageProxy.address, - tokenManagerLinker.address, - communityLocker.address, + messageProxyAddress, + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), depositBoxEthAddress, "0x0000000000000000000000000000000000000000" - ]) as TokenManagerEth; - await tokenManagerEth.deployTransaction.wait(); - deployed.set( "TokenManagerEth", { address: tokenManagerEth.address, interface: tokenManagerEth.interface } ); - console.log("Contract TokenManagerEth deployed to", tokenManagerEth.address); + ]); + await tokenManagerEth.waitForDeployment(); + deployed.set( "TokenManagerEth", { address: await tokenManagerEth.getAddress(), interface: tokenManagerEth.interface } ); + console.log("Contract TokenManagerEth deployed to", await tokenManagerEth.getAddress()); console.log("Deploy TokenManagerERC20"); const tokenManagerERC20Factory = await ethers.getContractFactory("TokenManagerERC20"); const tokenManagerERC20 = await upgrades.deployProxy(tokenManagerERC20Factory, [ schainName, - messageProxy.address, - tokenManagerLinker.address, - communityLocker.address, + messageProxyAddress, + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), depositBoxERC20Address - ]) as TokenManagerERC20; - await tokenManagerERC20.deployTransaction.wait(); - deployed.set( "TokenManagerERC20", { address: tokenManagerERC20.address, interface: tokenManagerERC20.interface } ); - console.log("Contract TokenManagerERC20 deployed to", tokenManagerERC20.address); + ]); + await tokenManagerERC20.waitForDeployment(); + deployed.set( "TokenManagerERC20", { + address: await tokenManagerERC20.getAddress(), + interface: tokenManagerERC20.interface + }); + console.log("Contract TokenManagerERC20 deployed to", await tokenManagerERC20.getAddress()); console.log("Deploy TokenManagerERC721"); const tokenManagerERC721Factory = await ethers.getContractFactory("TokenManagerERC721"); const tokenManagerERC721 = await upgrades.deployProxy(tokenManagerERC721Factory, [ schainName, - messageProxy.address, - tokenManagerLinker.address, - communityLocker.address, + messageProxyAddress, + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), depositBoxERC721Address - ]) as TokenManagerERC721; - await tokenManagerERC721.deployTransaction.wait(); - deployed.set( "TokenManagerERC721", { address: tokenManagerERC721.address, interface: tokenManagerERC721.interface } ); - console.log("Contract TokenManagerERC721 deployed to", tokenManagerERC721.address); + ]); + await tokenManagerERC721.waitForDeployment(); + deployed.set( "TokenManagerERC721", { + address: await tokenManagerERC721.getAddress(), + interface: tokenManagerERC721.interface + }); + console.log("Contract TokenManagerERC721 deployed to", await tokenManagerERC721.getAddress()); console.log("Deploy TokenManagerERC1155"); const tokenManagerERC1155Factory = await ethers.getContractFactory("TokenManagerERC1155"); const tokenManagerERC1155 = await upgrades.deployProxy(tokenManagerERC1155Factory, [ schainName, - messageProxy.address, - tokenManagerLinker.address, - communityLocker.address, + messageProxyAddress, + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), depositBoxERC1155Address - ]) as TokenManagerERC1155; - await tokenManagerERC1155.deployTransaction.wait(); - deployed.set( "TokenManagerERC1155", { address: tokenManagerERC1155.address, interface: tokenManagerERC1155.interface } ); - console.log("Contract TokenManagerERC1155 deployed to", tokenManagerERC1155.address); + ]); + await tokenManagerERC1155.waitForDeployment(); + deployed.set( "TokenManagerERC1155", { address: await tokenManagerERC1155.getAddress(), interface: tokenManagerERC1155.interface } ); + console.log("Contract TokenManagerERC1155 deployed to", await tokenManagerERC1155.getAddress()); console.log("Deploy TokenManagerERC721WithMetadata"); const tokenManagerERC721WithMetadataFactory = await ethers.getContractFactory("TokenManagerERC721WithMetadata"); const tokenManagerERC721WithMetadata = await upgrades.deployProxy(tokenManagerERC721WithMetadataFactory, [ schainName, - messageProxy.address, - tokenManagerLinker.address, - communityLocker.address, + messageProxyAddress, + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), depositBoxERC721WithMetadataAddress - ]) as TokenManagerERC721WithMetadata; - await tokenManagerERC721WithMetadata.deployTransaction.wait(); - deployed.set( "TokenManagerERC721WithMetadata", { address: tokenManagerERC721WithMetadata.address, interface: tokenManagerERC721WithMetadata.interface } ); - console.log("Contract TokenManagerERC721WithMetadata deployed to", tokenManagerERC721WithMetadata.address); + ]); + await tokenManagerERC721WithMetadata.waitForDeployment(); + deployed.set("TokenManagerERC721WithMetadata", { + address: await tokenManagerERC721WithMetadata.getAddress(), + interface: tokenManagerERC721WithMetadata.interface + }); + console.log("Contract TokenManagerERC721WithMetadata deployed to", await tokenManagerERC721WithMetadata.getAddress()); console.log("Register token managers"); - await (await tokenManagerLinker.registerTokenManager(tokenManagerEth.address)).wait(); - await (await tokenManagerLinker.registerTokenManager(tokenManagerERC20.address)).wait(); - await (await tokenManagerLinker.registerTokenManager(tokenManagerERC721.address)).wait(); - await (await tokenManagerLinker.registerTokenManager(tokenManagerERC1155.address)).wait(); - await (await tokenManagerLinker.registerTokenManager(tokenManagerERC721WithMetadata.address)).wait(); + await (await tokenManagerLinker.registerTokenManager(await tokenManagerEth.getAddress())).wait(); + await (await tokenManagerLinker.registerTokenManager(await tokenManagerERC20.getAddress())).wait(); + await (await tokenManagerLinker.registerTokenManager(await tokenManagerERC721.getAddress())).wait(); + await (await tokenManagerLinker.registerTokenManager(await tokenManagerERC1155.getAddress())).wait(); + await (await tokenManagerLinker.registerTokenManager(await tokenManagerERC721WithMetadata.getAddress())).wait(); console.log("Deploy EthErc20"); const ethERC20Factory = await ethers.getContractFactory("EthErc20"); - const ethERC20 = await upgrades.deployProxy(ethERC20Factory, [ tokenManagerEth.address ]) as EthErc20; - await ethERC20.deployTransaction.wait(); - deployed.set( "EthErc20", { address: ethERC20.address, interface: ethERC20.interface } ); - console.log("Contract EthErc20 deployed to", ethERC20.address); + const ethERC20 = await upgrades.deployProxy(ethERC20Factory, [ await tokenManagerEth.getAddress() ]); + await ethERC20.waitForDeployment(); + deployed.set( "EthErc20", { address: await ethERC20.getAddress(), interface: ethERC20.interface } ); + console.log("Contract EthErc20 deployed to", await ethERC20.getAddress()); console.log( "\nWill set dependencies!\n" ); - await tokenManagerEth.setEthErc20Address( ethERC20.address ); - console.log( "Set EthErc20 address", ethERC20.address, "in TokenManagerEth", tokenManagerEth.address, "completed!\n" ); + await tokenManagerEth.setEthErc20Address( await ethERC20.getAddress() ); + console.log( "Set EthErc20 address", await ethERC20.getAddress(), "in TokenManagerEth", await tokenManagerEth.getAddress(), "completed!\n" ); const chainConnectorRole = await messageProxy.CHAIN_CONNECTOR_ROLE(); - await messageProxy.grantRole( chainConnectorRole, tokenManagerLinker.address ); - console.log( "Grant CHAIN_CONNECTOR_ROLE to TokenManagerLinker", tokenManagerLinker.address, "in MessageProxyForSchain", messageProxy.address, "completed!\n" ); + await messageProxy.grantRole( chainConnectorRole, await tokenManagerLinker.getAddress() ); + console.log( "Grant CHAIN_CONNECTOR_ROLE to TokenManagerLinker", await tokenManagerLinker.getAddress(), "in MessageProxyForSchain", messageProxyAddress, "completed!\n" ); const constantSetterRole = await communityLocker.CONSTANT_SETTER_ROLE(); - await communityLocker.grantRole(constantSetterRole, owner.address); + await communityLocker.grantRole(constantSetterRole, await owner.getAddress()); console.log("Grant CONSTANT_SETTER_ROLE to owner of schain"); const extraContracts = [ @@ -268,10 +267,10 @@ async function main() { tokenManagerERC721WithMetadata ]; const extraContractRegistrarRole = await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(); - await messageProxy.grantRole(extraContractRegistrarRole, owner.address); + await messageProxy.grantRole(extraContractRegistrarRole, await owner.getAddress()); for (const extraContract of extraContracts) { - await messageProxy.registerExtraContractForAll(extraContract.address) - console.log("Contract with address ", extraContract.address, "registered as extra contract"); + await messageProxy.registerExtraContractForAll(await extraContract.getAddress()) + console.log("Contract with address ", await extraContract.getAddress(), "registered as extra contract"); } const jsonObjectABI: {[k: string]: string | []} = { }; @@ -299,9 +298,6 @@ async function main() { jsonObjectABI.ERC721OnChain_abi = getAbi(erc721OnChainFactory.interface); const erc1155OnChainFactory = await ethers.getContractFactory("ERC1155OnChain"); jsonObjectABI.ERC1155OnChain_abi = getAbi(erc1155OnChainFactory.interface); - const proxyAdmin = await getManifestAdmin(hre); - jsonObjectABI.proxy_admin_address = proxyAdmin.address; - jsonObjectABI.proxy_admin_abi = getAbi(proxyAdmin.interface); await fs.writeFile( `data/proxySchain_${schainName}.json`, JSON.stringify( jsonObjectABI ) ); console.log( `Done, check proxySchain_${schainName}.json file in data folder.` ); diff --git a/proxy/migrations/deploySkaleManagerComponents.ts b/migrations/deploySkaleManagerComponents.ts similarity index 51% rename from proxy/migrations/deploySkaleManagerComponents.ts rename to migrations/deploySkaleManagerComponents.ts index 8ab8fe3f2..03d148e72 100644 --- a/proxy/migrations/deploySkaleManagerComponents.ts +++ b/migrations/deploySkaleManagerComponents.ts @@ -24,11 +24,12 @@ */ import { promises as fs } from 'fs'; import { ethers } from "hardhat"; -import { getAbi, getContractFactory } from '@skalenetwork/upgrade-tools'; +import { getAbi } from '@skalenetwork/upgrade-tools'; import { Manifest } from "@openzeppelin/upgrades-core"; import { KeyStorageMock } from '../typechain'; import { Wallet } from 'ethers'; -import { getPublicKey, stringKeccak256 } from '../test/utils/helper'; +import { getPublicKey } from '../test/utils/helper'; +import axios from 'axios'; export function getContractKeyInAbiFile(contract: string) { return contract.replace(/([a-z0-9])(?=[A-Z])/g, '$1_').toLowerCase(); @@ -38,6 +39,16 @@ export async function getManifestFile(): Promise { return (await Manifest.forNetwork(ethers.provider)).file; } +async function getLatestVersionOfSkaleManager(): Promise { + try { + const response = await axios.get('https://raw.githubusercontent.com/skalenetwork/skale-manager/refs/heads/stable/VERSION'); + return response.data.trim(); + } catch (error) { + console.error('Failed to fetch the latest version of SkaleManager:', error); + throw error; + } +} + async function main() { const [ owner,] = await ethers.getSigners(); @@ -57,66 +68,88 @@ async function main() { } const schainName = process.env.CHAIN_NAME_SCHAIN; + const schainHash = ethers.id(schainName); console.log("Deploy ContractManager"); - const contractManagerFactory = await getContractFactory("ContractManager"); + const contractManagerFactory = await ethers.getContractFactory("ContractManager"); const contractManager = await contractManagerFactory.deploy(); - console.log("Contract ContractManager deployed to", contractManager.address); + const contractManagerAddress = await contractManager.getAddress(); + console.log("Contract ContractManager deployed to", contractManagerAddress); console.log("Deploy Schains"); - const schainsFactory = await getContractFactory("Schains"); + const schainsFactory = await ethers.getContractFactory("Schains"); const schains = await schainsFactory.deploy(); - console.log("Contract Schains deployed to", schains.address); + const schainsAddress = await schains.getAddress(); + console.log("Contract Schains deployed to", schainsAddress); console.log("Deploy SchainsInternal"); - const schainsInternalFactory = await getContractFactory("SchainsInternal"); + const schainsInternalFactory = await ethers.getContractFactory("SchainsInternal"); const schainsInternal = await schainsInternalFactory.deploy(); - console.log("Contract SchainsInternal deployed to", schainsInternal.address); + const schainsInternalAddress = await schainsInternal.getAddress(); + console.log("Contract SchainsInternal deployed to", schainsInternalAddress); console.log("Deploy Wallets"); - const walletsFactory = await getContractFactory("Wallets"); + const walletsFactory = await ethers.getContractFactory("Wallets"); const wallets = await walletsFactory.deploy(); - console.log("Contract Wallets deployed to", wallets.address); + const walletsAddress = await wallets.getAddress(); + console.log("Contract Wallets deployed to", walletsAddress); console.log("Deploy SkaleVerifier"); - const skaleVerifierFactory = await getContractFactory("SkaleVerifierMock"); + const skaleVerifierFactory = await ethers.getContractFactory("SkaleVerifierMock"); const skaleVerifier = await skaleVerifierFactory.deploy(); - console.log("Contract SkaleVerifier deployed to", skaleVerifier.address); + const skaleVerifierAddress = await skaleVerifier.getAddress(); + console.log("Contract SkaleVerifier deployed to", skaleVerifierAddress); console.log("Deploy KeyStorage"); - const keyStorageFactory = await getContractFactory("KeyStorageMock"); + const keyStorageFactory = await ethers.getContractFactory("KeyStorageMock"); const keyStorage = await keyStorageFactory.deploy() as KeyStorageMock; - console.log("Contract KeyStorage deployed to", keyStorage.address); + const keyStorageAddress = await keyStorage.getAddress(); + console.log("Contract KeyStorage deployed to", keyStorageAddress); console.log("Deploy Nodes"); - const nodesFactory = await getContractFactory("Nodes"); + const nodesFactory = await ethers.getContractFactory("Nodes"); const nodes = await nodesFactory.deploy(); - console.log("Contract Nodes deployed to", nodes.address); + const nodesAddress = await nodes.getAddress(); + console.log("Contract Nodes deployed to", nodesAddress); + + console.log("Deploy SkaleManager"); + const skaleManagerFactory = await ethers.getContractFactory("SkaleManagerMock"); + const skaleManager = await skaleManagerFactory.deploy(contractManager); + const skaleManagerAddress = await skaleManager.getAddress(); + console.log("Contract SkaleManager deployed to", skaleManagerAddress); console.log("Will set dependencies"); - await schains.addContractManager( contractManager.address ); - console.log("Add ContractManager address", contractManager.address, "as ContractManager to Contract Schains", schains.address, "\n"); - await schainsInternal.addContractManager( contractManager.address ); - console.log("Add ContractManager address", contractManager.address, "as ContractManager to Contract SchainsInternal", schainsInternal.address, "\n"); - await wallets.addContractManager( contractManager.address ); - console.log("Add ContractManager address", contractManager.address, "as ContractManager to Contract Wallets", wallets.address, "\n"); - await contractManager.setContractsAddress( "Schains", schains.address ); - console.log("Set Schains", schains.address, "to ContractManager", contractManager.address, "\n"); - await contractManager.setContractsAddress( "SchainsInternal", schainsInternal.address ); - console.log("Set SchainsInternal", schainsInternal.address, "to ContractManager", contractManager.address, "\n"); - await contractManager.setContractsAddress( "Wallets", wallets.address ); - console.log("Set Wallets", wallets.address, "to ContractManager", contractManager.address, "\n"); - await contractManager.setContractsAddress( "SkaleVerifier", skaleVerifier.address ); - console.log("Set SkaleVerifier", skaleVerifier.address, "to ContractManager", contractManager.address, "\n"); - await contractManager.setContractsAddress( "KeyStorage", keyStorage.address ); - console.log("Set KeyStorage", keyStorage.address, "to ContractManager", contractManager.address, "\n"); - await contractManager.setContractsAddress( "Nodes", nodes.address ); - console.log("Set Nodes", nodes.address, "to ContractManager", contractManager.address, "\n"); + const versionOfSkaleManager = await getLatestVersionOfSkaleManager(); + + await skaleManager.setVersion(versionOfSkaleManager); + console.log("Set version", versionOfSkaleManager, "to SkaleManager", skaleManagerAddress, "\n"); + await contractManager.setContractsAddress("ContractManager", contractManager); + console.log("Set ContractManager", contractManagerAddress, "to ContractManager", contractManagerAddress, "\n"); + await schains.addContractManager(contractManager); + console.log("Add ContractManager address", contractManagerAddress, "as ContractManager to Contract Schains", schainsAddress, "\n"); + await schainsInternal.addContractManager(contractManager); + console.log("Add ContractManager address", contractManagerAddress, "as ContractManager to Contract SchainsInternal", schainsInternalAddress, "\n"); + await wallets.addContractManager(contractManager); + console.log("Add ContractManager address", contractManagerAddress, "as ContractManager to Contract Wallets", walletsAddress, "\n"); + await contractManager.setContractsAddress("Schains", schains); + console.log("Set Schains", schainsAddress, "to ContractManager", contractManagerAddress, "\n"); + await contractManager.setContractsAddress("SchainsInternal", schainsInternal); + console.log("Set SchainsInternal", schainsInternalAddress, "to ContractManager", contractManagerAddress, "\n"); + await contractManager.setContractsAddress("Wallets", wallets); + console.log("Set Wallets", walletsAddress, "to ContractManager", contractManagerAddress, "\n"); + await contractManager.setContractsAddress("SkaleVerifier", skaleVerifier); + console.log("Set SkaleVerifier", skaleVerifierAddress, "to ContractManager", contractManagerAddress, "\n"); + await contractManager.setContractsAddress("KeyStorage", keyStorage); + console.log("Set KeyStorage", keyStorageAddress, "to ContractManager", contractManagerAddress, "\n"); + await contractManager.setContractsAddress("Nodes", nodes); + console.log("Set Nodes", nodesAddress, "to ContractManager", contractManagerAddress, "\n"); + await contractManager.setContractsAddress("SkaleManager", skaleManager); + console.log("Set SkaleManager", skaleManagerAddress, "to ContractManager", contractManagerAddress, "\n"); const nodeAddress1 = new Wallet(process.env.PRIVATE_KEY_FOR_ETHEREUM).connect(ethers.provider); const nodeAddress2 = new Wallet(process.env.PRIVATE_KEY_FOR_SCHAIN).connect(ethers.provider); - await owner.sendTransaction({to: nodeAddress1.address, value: ethers.utils.parseEther("1")}); - await owner.sendTransaction({to: nodeAddress2.address, value: ethers.utils.parseEther("1")}); + await owner.sendTransaction({to: nodeAddress1.address, value: ethers.parseEther("1")}); + await owner.sendTransaction({to: nodeAddress2.address, value: ethers.parseEther("1")}); const nodeCreationParams1 = { port: 1337, @@ -142,7 +175,7 @@ async function main() { console.log("Create Node 1 with address", nodeAddress2.address, "\n"); await schainsInternal.initializeSchain( schainName, owner.address, 1, 1 ); console.log("Initialize Schain", schainName, "with address", owner.address, "\n"); - await schainsInternal.connect(owner).addNodesToSchainsGroups(ethers.utils.id(schainName), [0, 1]); + await schainsInternal.connect(owner).addNodesToSchainsGroups(ethers.id(schainName), [0, 1]); console.log("Add Nodes 0 and 1 to schain", schainName, "\n"); const BLSPublicKey = { x: { @@ -154,20 +187,22 @@ async function main() { b: "14411459380456065006136894392078433460802915485975038137226267466736619639091" } }; - await keyStorage.setBlsCommonPublicKeyForSchain( stringKeccak256(schainName), BLSPublicKey ); - console.log("Set common public key in KeyStorage contract", keyStorage.address, "\n"); - await wallets.rechargeSchainWallet( stringKeccak256(schainName), { value: "10000000000000000000" } ); // originally it was 1000000000000000000 = 1ETH - console.log("Recharge schain wallet in Wallets contract", wallets.address, "\n"); + await keyStorage.setBlsCommonPublicKeyForSchain(schainHash, BLSPublicKey ); + console.log("Set common public key in KeyStorage contract", keyStorageAddress, "\n"); + await wallets.rechargeSchainWallet(schainHash, { value: "10000000000000000000" } ); // originally it was 1000000000000000000 = 1ETH + console.log("Recharge schain wallet in Wallets contract", walletsAddress, "\n"); const jsonObject = { - contract_manager_address: contractManager.address, + contract_manager_address: contractManagerAddress, contract_manager_abi: getAbi(contractManager.interface), - schains_internal_address: schainsInternal.address, + schains_internal_address: schainsInternalAddress, schains_internal_abi: getAbi(schainsInternal.interface), - key_storage_address: keyStorage.address, + key_storage_address: keyStorageAddress, key_storage_abi: getAbi(keyStorage.interface), - wallets_address: wallets.address, - wallets_abi: getAbi(wallets.interface) + wallets_address: walletsAddress, + wallets_abi: getAbi(wallets.interface), + skale_manager_address: skaleManagerAddress, + skale_manager_abi: getAbi(skaleManager.interface), }; await fs.writeFile( "data/skaleManagerComponents.json", JSON.stringify( jsonObject ) ); diff --git a/proxy/migrations/generateManifest.ts b/migrations/generateManifest.ts similarity index 94% rename from proxy/migrations/generateManifest.ts rename to migrations/generateManifest.ts index 08cd6f346..4506cf827 100644 --- a/proxy/migrations/generateManifest.ts +++ b/migrations/generateManifest.ts @@ -135,7 +135,7 @@ export async function importAddresses(manifest: ManifestData, abi: {[ key in str export async function manifestSetup(pathToManifest: string) { const chainId = (await ethers.provider.getNetwork()).chainId; - const manifestName = networkNames[chainId] ?? `unknown-${chainId}`; + const manifestName = networkNames[Number(chainId)] ?? `unknown-${chainId}`; const correctManifestPath = `.openzeppelin/${manifestName}.json`; if (pathToManifest === "" || pathToManifest === correctManifestPath) { await fs.access(correctManifestPath); @@ -148,12 +148,12 @@ export async function manifestSetup(pathToManifest: string) { try { await fs.unlink(correctManifestPath); console.log("Current Manifest file removed"); - } catch (e) { - console.log("Could not remove current manifest file"); + } catch { + console.error("Could not remove current manifest file"); process.exit(1); } - } catch (e) { - console.log("No current Manifest file detected"); + } catch { + console.error("No current Manifest file detected"); } try { await fs.access( pathToManifest ); @@ -161,12 +161,12 @@ export async function manifestSetup(pathToManifest: string) { try { await fs.copyFile( pathToManifest, correctManifestPath ); console.log("New Manifest file setup"); - } catch (e) { - console.log("Could not setup new Manifest file"); + } catch { + console.error("Could not setup new Manifest file"); process.exit(1); } - } catch (e) { - console.log("No new Manifest file detected"); + } catch { + console.error("No new Manifest file detected"); process.exit(1); } } diff --git a/proxy/migrations/hotfixUpgrade.ts b/migrations/hotfixUpgrade.ts similarity index 92% rename from proxy/migrations/hotfixUpgrade.ts rename to migrations/hotfixUpgrade.ts index 9b7f5ec16..abff0c071 100644 --- a/proxy/migrations/hotfixUpgrade.ts +++ b/migrations/hotfixUpgrade.ts @@ -52,15 +52,15 @@ async function main() { const newImplementation = await ( await ethers.getContractFactory("MessageProxyForSchain") ).deploy(); - await newImplementation.deployTransaction.wait(); - console.log(`Deployed on address ${newImplementation.address}`) + await newImplementation.waitForDeployment(); + console.log(`Deployed on address ${await newImplementation.getAddress()}`) console.log("Upgrade a proxy"); const proxyAdmin = (new ethers.Contract(proxyAdminAddress, ProxyAdminArtifacts.abi, ethers.provider)) .connect((await ethers.getSigners())[0]) as ProxyAdmin; - const upgradeTransaction = await proxyAdmin.upgrade(messageProxyAddress, newImplementation.address); + const upgradeTransaction = await proxyAdmin.upgrade(messageProxyAddress, await newImplementation.getAddress()); const receipt = await upgradeTransaction.wait(); - if (receipt.status === 1) { + if (receipt?.status === 1) { console.log("Successfully upgraded"); } else { console.log("Something went wrong"); diff --git a/proxy/migrations/submitTransactions.ts b/migrations/submitTransactions.ts similarity index 75% rename from proxy/migrations/submitTransactions.ts rename to migrations/submitTransactions.ts index 194fe30b1..15aa7bac7 100644 --- a/proxy/migrations/submitTransactions.ts +++ b/migrations/submitTransactions.ts @@ -1,12 +1,13 @@ import { createMultiSendTransaction } from "@skalenetwork/upgrade-tools"; import { promises as fs } from "fs"; -import { UnsignedTransaction } from "ethers"; +import { Transaction } from "ethers"; async function main() { if (!process.env.TRANSACTIONS || !process.env.SAFE) { console.log("Example of usage:"); console.log("SAFE=0x13fD1622F0E7e50A87B79cb296cbAf18362631C0", "TRANSACTIONS=data/transactions-1.8.0-mainnet.json", + "CHAIN_ID=1", "npx hardhat run migrations/submitTransactions.ts --network mainnet"); process.exit(1); } @@ -14,15 +15,19 @@ async function main() { console.log("Private key is not set"); process.exit(1); } - + if (!process.env.CHAIN_ID) { + console.log("Chain ID is not set"); + process.exit(1); + } + const chainId = BigInt(process.env.CHAIN_ID); const safe = process.env.SAFE; let privateKey = process.env.PRIVATE_KEY; if (!privateKey.startsWith("0x")) { privateKey = "0x" + privateKey; } - const safeTransactions = JSON.parse(await fs.readFile(process.env.TRANSACTIONS, "utf-8")) as UnsignedTransaction[]; + const safeTransactions = JSON.parse(await fs.readFile(process.env.TRANSACTIONS, "utf-8")) as Transaction[]; - await createMultiSendTransaction(safe, safeTransactions); + await createMultiSendTransaction(safe, chainId, safeTransactions); console.log("Done"); } diff --git a/proxy/migrations/transferOwnership.ts b/migrations/transferOwnership.ts similarity index 77% rename from proxy/migrations/transferOwnership.ts rename to migrations/transferOwnership.ts index c7010cb2d..62591b64d 100644 --- a/proxy/migrations/transferOwnership.ts +++ b/migrations/transferOwnership.ts @@ -1,10 +1,9 @@ import { contracts, getContractKeyInAbiFile } from "./deployMainnet"; import { ethers } from "hardhat"; -import hre from "hardhat"; import { promises as fs } from "fs"; -import { getManifestAdmin } from "@openzeppelin/hardhat-upgrades/dist/admin"; +import {getAdminAddress } from '@openzeppelin/upgrades-core'; import chalk from "chalk"; -import { SafeMock } from "../typechain"; +import { AccessControlEnumerableUpgradeable, SafeMock } from "../typechain"; function stringValue(value: string | undefined) { if (value) { @@ -14,6 +13,13 @@ function stringValue(value: string | undefined) { } } +async function getProxyAdmin(proxyAdminAddress: string) { + const abi = [ + "function owner() view returns (address)" + ]; + return new ethers.Contract(proxyAdminAddress, abi, ethers.provider); + } + export async function transferOwnership(contractNamesToTransfer: string[]) { if (!process.env.ABI) { @@ -25,7 +31,9 @@ export async function transferOwnership(contractNamesToTransfer: string[]) const newOwner = stringValue(process.env.NEW_OWNER); const abi = JSON.parse(await fs.readFile(abiFilename, "utf-8")); - const proxyAdmin = await getManifestAdmin(hre); + const addressOfAnyContract = abi[getContractKeyInAbiFile(contractNamesToTransfer[0]) + "_address"]; + const proxyAdminAddress = await getAdminAddress(ethers.provider, addressOfAnyContract); + const proxyAdmin = await getProxyAdmin(proxyAdminAddress); const [ deployer ] = await ethers.getSigners(); @@ -42,7 +50,7 @@ export async function transferOwnership(contractNamesToTransfer: string[]) const contractFactory = await ethers.getContractFactory(contractName); const _contract = contractName; const contractAddress = abi[getContractKeyInAbiFile(_contract) + "_address"]; - const contract = contractFactory.attach(contractAddress); + const contract = contractFactory.attach(contractAddress) as AccessControlEnumerableUpgradeable; console.log(chalk.blue(`Grant access to ${contractName}`)); await (await contract.grantRole(await contract.DEFAULT_ADMIN_ROLE(), newOwner)).wait(); } @@ -51,7 +59,7 @@ export async function transferOwnership(contractNamesToTransfer: string[]) const contractFactory = await ethers.getContractFactory(contractName); const _contract = contractName; const contractAddress = abi[getContractKeyInAbiFile(_contract) + "_address"]; - const contract = contractFactory.attach(contractAddress); + const contract = contractFactory.attach(contractAddress) as AccessControlEnumerableUpgradeable; console.log(chalk.blue(`Revoke role on ${contractName}`)); await (await contract.revokeRole(await contract.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); } @@ -59,8 +67,8 @@ export async function transferOwnership(contractNamesToTransfer: string[]) const safeMockFactory = await ethers.getContractFactory("SafeMock"); const safeMock = await safeMockFactory.attach(adminOwner) as SafeMock; try { - await (await safeMock.transferProxyAdminOwnership(proxyAdmin.address, deployer.address)).wait(); - } catch (e) { + await (await safeMock.transferProxyAdminOwnership(await proxyAdmin.getAddress(), deployer.address)).wait(); + } catch { console.log(chalk.red("Could not run transferProxyAdminOwnership in SafeMock")); process.exit(1); } diff --git a/proxy/migrations/upgradeMainnet.ts b/migrations/upgradeMainnet.ts similarity index 60% rename from proxy/migrations/upgradeMainnet.ts rename to migrations/upgradeMainnet.ts index 0dad5177a..226646d10 100644 --- a/proxy/migrations/upgradeMainnet.ts +++ b/migrations/upgradeMainnet.ts @@ -1,30 +1,44 @@ import chalk from "chalk"; import { ethers } from "hardhat"; -import { promises as fs } from "fs"; -import { AutoSubmitter, Upgrader } from "@skalenetwork/upgrade-tools"; -import { SkaleABIFile } from "@skalenetwork/upgrade-tools/dist/src/types/SkaleABIFile"; -import { contracts, contractsToDeploy, getContractKeyInAbiFile } from "./deployMainnet"; +import { promises as fs } from 'fs'; +import { Interface, Transaction } from "ethers"; +import { getAbi, getVersion, Submitter, Upgrader } from "@skalenetwork/upgrade-tools"; +import { skaleContracts, Instance } from "@skalenetwork/skale-contracts-ethers-v6"; import { MessageProxyForMainnet } from "../typechain"; -import { Interface } from "@ethersproject/abi"; +import { contracts, getContractKeyInAbiFile } from "./deployMainnet"; +async function getImaMainnetInstance() { + if (!process.env.TARGET) { + console.log(chalk.red("Specify desired mainnet-ima instance")); + console.log(chalk.red("Set instance alias or MessageProxyForMainnet address to TARGET environment variable")); + process.exit(1); + } + const network = await skaleContracts.getNetworkByProvider(ethers.provider); + const project = network.getProject("mainnet-ima"); + return await project.getInstance(process.env.TARGET); +} + class ImaMainnetUpgrader extends Upgrader { constructor( targetVersion: string, - abi: SkaleABIFile, + instance: Instance, contractNamesToUpgrade: string[], - submitter = new AutoSubmitter()) { + submitter?: Submitter) { super( - "proxyMainnet", - targetVersion, - abi, - contractNamesToUpgrade, - submitter); + { + contractNamesToUpgrade, + instance, + name: "proxyMainnet", + version: targetVersion, + }, + submitter + ); } - async getMessageProxyForMainnet() { - return await ethers.getContractAt("MessageProxyForMainnet", this.abi.message_proxy_mainnet_address as string) as MessageProxyForMainnet; + getMessageProxyForMainnet = async () => { + return await this.instance.getContract("MessageProxyForMainnet") as MessageProxyForMainnet; } getDeployedVersion = async () => { @@ -38,10 +52,10 @@ class ImaMainnetUpgrader extends Upgrader { setVersion = async (newVersion: string) => { const messageProxyForMainnet = await this.getMessageProxyForMainnet(); - this.transactions.push({ - to: messageProxyForMainnet.address, + this.transactions.push(Transaction.from({ + to: await messageProxyForMainnet.getAddress(), data: messageProxyForMainnet.interface.encodeFunctionData("setVersion", [newVersion]) - }); + })); } // deployNewContracts = () => { }; @@ -89,22 +103,22 @@ class ImaMainnetUpgrader extends Upgrader { contractManagerInterface, ethers.provider ) - for (const contractName of contractsToDeploy) { + for (const contractName of contracts) { try { const contractAddress = await contractManager.getContract(contractName); console.log(`Address of ${contractName} is set to ${contractAddress}`); } catch { // getContract failed because the contract is not set - const contractAddress = this.abi[`${getContractKeyInAbiFile(contractName)}_address`] as string; - this.transactions.push( + const contractAddress = await this.instance.getContract(contractName); + this.transactions.push(Transaction.from( { - to: contractManager.address, + to: await contractManager.getAddress(), data: contractManager.interface.encodeFunctionData( "setContractsAddress", [contractAddress] ) } - ) + )) console.log(`Set ${contractName} address to ${contractAddress}`); } } @@ -118,22 +132,32 @@ class ImaMainnetUpgrader extends Upgrader { } } -async function getImaMainnetAbiAndAddress(): Promise { +async function updateAbi() { if (!process.env.ABI) { console.log(chalk.red("Set path to file with ABI and addresses to ABI environment variables")); process.exit(1); } + const network = await ethers.provider.getNetwork(); + const version = await getVersion(); const abiFilename = process.env.ABI; - return JSON.parse(await fs.readFile(abiFilename, "utf-8")); + const abi = JSON.parse(await fs.readFile(abiFilename, "utf-8")); + for (const contract of contracts) { + const contractInterface = (await ethers.getContractFactory(contract)).interface; + abi[getContractKeyInAbiFile(contract) + "_abi"] = getAbi(contractInterface); + } + const newAbiFilename = `mainnet-ima-${version}-${network.name}.json`; + await fs.writeFile(newAbiFilename, JSON.stringify(abi, null, 4)); + console.log(chalk.green(`ABI updated and saved to ${newAbiFilename}`)); } async function main() { const upgrader = new ImaMainnetUpgrader( "2.1.0", - await getImaMainnetAbiAndAddress(), + await getImaMainnetInstance(), contracts ); await upgrader.upgrade(); + await updateAbi(); } if (require.main === module) { diff --git a/migrations/upgradeSchain.ts b/migrations/upgradeSchain.ts new file mode 100644 index 000000000..57f8ea942 --- /dev/null +++ b/migrations/upgradeSchain.ts @@ -0,0 +1,111 @@ +import chalk from "chalk"; +import { ethers } from "hardhat"; +import { promises as fs } from "fs"; +import { Transaction } from "ethers"; +import { getAbi, getVersion, Submitter, Upgrader } from "@skalenetwork/upgrade-tools"; +import { skaleContracts, Instance } from "@skalenetwork/skale-contracts-ethers-v6"; +import { contracts, getContractKeyInAbiFile } from "./deploySchain"; +import { manifestSetup } from "./generateManifest"; +import { MessageProxyForSchain } from "../typechain"; + + +async function getImaSchainInstance() { + if (!process.env.TARGET) { + console.log(chalk.red("Specify desired schain-ima instance")); + console.log(chalk.red("Set instance alias or MessageProxyForSchain address to TARGET environment variable")); + process.exit(1); + } + const network = await skaleContracts.getNetworkByProvider(ethers.provider); + const project = network.getProject("schain-ima"); + return await project.getInstance(process.env.TARGET); +} +class ImaSchainUpgrader extends Upgrader { + + constructor( + targetVersion: string, + instance: Instance, + contractNamesToUpgrade: string[], + submitter?: Submitter) { + super( + { + contractNamesToUpgrade, + instance, + name: "proxySchain", + version: targetVersion, + }, + submitter + ); + } + + async getMessageProxyForSchain() { + return await this.instance.getContract("MessageProxyForSchain") as MessageProxyForSchain; + + } + + getDeployedVersion = async () => { + const messageProxyForSchain = await this.getMessageProxyForSchain(); + try { + return await messageProxyForSchain.version(); + } catch { + console.log(chalk.red("Can't read deployed version")); + } + } + + setVersion = async (newVersion: string) => { + const messageProxyForSchain = await this.getMessageProxyForSchain(); + this.transactions.push(Transaction.from({ + to: await messageProxyForSchain.getAddress(), + data: messageProxyForSchain.interface.encodeFunctionData("setVersion", [newVersion]) + })); + } + + // deployNewContracts = () => { }; + + // initialize = async () => { }; + + _getContractKeyInAbiFile(contract: string) { + if (contract === "MessageProxyForSchain") { + return "message_proxy_chain"; + } + return contract.replace(/([a-z0-9])(?=[A-Z])/g, '$1_').toLowerCase(); + } +} + +async function updateAbi(contracts: string[]) { + if (!process.env.ABI) { + console.log(chalk.red("Set path to file with ABI and addresses to ABI environment variables")); + process.exit(1); + } + const network = await ethers.provider.getNetwork(); + const version = await getVersion(); + const abiFilename = process.env.ABI; + const abi = JSON.parse(await fs.readFile(abiFilename, "utf-8")); + for (const contract of contracts) { + const contractInterface = (await ethers.getContractFactory(contract)).interface; + abi[getContractKeyInAbiFile(contract) + "_abi"] = getAbi(contractInterface); + } + const newAbiFilename = `schain-ima-${version}-${network.name}.json`; + await fs.writeFile(newAbiFilename, JSON.stringify(abi, null, 4)); + console.log(chalk.green(`ABI updated and saved to ${newAbiFilename}`)); +} + +async function main() { + const pathToManifest: string = process.env.MANIFEST || ""; + await manifestSetup(pathToManifest); + const upgrader = new ImaSchainUpgrader( + "2.1.0", + await getImaSchainInstance(), + contracts + ); + await upgrader.upgrade(); + updateAbi(contracts); +} + +if (require.main === module) { + main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); +} diff --git a/package.json b/package.json index 9c973e494..173b16fdd 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,64 @@ { - "name": "skale-ima", + "name": "skale-ima-proxy", "private": true, "license": "AGPL-3.0", "author": "SKALE Labs and contributors", "scripts": { - "lint-check": "eslint ./test/*.*js", - "lint-fix": "eslint ./test/*.*js --fix", - "postinstall": "./postinstall.sh", - "check-outdated": "yarn outdated", - "upgrade-to-latest": "yarn upgrade --latest" + "compile": "npx hardhat compile", + "cleanCompile": "npx hardhat clean && yarn compile", + "deploy-to-both-chains": "yarn deploy-to-mainnet && yarn deploy-to-schain", + "deploy-to-mainnet": "VERSION=$(cat ./VERSION) npx hardhat run migrations/deployMainnet.ts --network mainnet", + "deploy-to-schain": "VERSION=$(cat ./VERSION) npx hardhat run migrations/deploySchain.ts --network schain", + "deploy-skale-manager-components": "npx hardhat run migrations/deploySkaleManagerComponents.ts --network mainnet", + "eslint": "npx eslint .", + "lint": "npx solhint \"contracts/**/*.sol\"", + "prepare": "yarn cleanCompile", + "test": "yarn tsc && npx hardhat test", + "tsc": "tsc --noEmit", + "slither": "slither .", + "fullCheck": "yarn lint && yarn tsc && yarn eslint && yarn slither", + "hooks": "git config core.hooksPath .githooks", + "no-hooks": "git config core.hooksPath .git/hooks" + }, + "dependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@openzeppelin/contracts-upgradeable": "^4.7.1", + "@openzeppelin/hardhat-upgrades": "^3.1.1", + "@safe-global/api-kit": "2.5.4", + "@skalenetwork/etherbase-interfaces": "^0.0.1-develop.20", + "@skalenetwork/ima-interfaces": "2.0.0", + "@skalenetwork/skale-manager-interfaces": "2.0.0", + "@skalenetwork/upgrade-tools": "3.0.0-develop.34", + "axios": "^0.21.4", + "dotenv": "^16.0.0", + "ethers": "^6.1.0", + "hardhat": "^2.22.15" }, - "dependencies": {}, "devDependencies": { - "eslint": "^6.8.0", - "eslint-config-standard": "^14.1.1", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-standard": "^4.0.1" + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", + "@nomicfoundation/hardhat-verify": "^1.1.1", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", + "@types/chai": "^4.2.12", + "@types/chai-almost": "^1.0.1", + "@types/chai-as-promised": "^7.1.3", + "@types/elliptic": "^6.4.14", + "@types/minimist": "^1.2.0", + "@types/mocha": "^9.1.0", + "@types/sinon-chai": "^3.2.5", + "@typescript-eslint/eslint-plugin": "^8.14.0", + "@typescript-eslint/parser": "^8.14.0", + "chai": "^4.2.0", + "chai-almost": "^1.0.1", + "chai-as-promised": "^7.1.1", + "cspell": "^8.14.4", + "eslint": "^8.46.0", + "ganache": "7.9.2", + "solhint": "3.3.6", + "solidity-coverage": "^0.8.4", + "ts-generator": "^0.1.1", + "ts-node": "^8.10.2", + "typechain": "^8.3.1", + "typescript": "^5.1.6" } } diff --git a/postinstall.sh b/postinstall.sh index 5e80d5390..e4829c70a 100755 --- a/postinstall.sh +++ b/postinstall.sh @@ -5,7 +5,7 @@ DIRECTORY_WITH_TESTS=$DIRECTORY_OF_THIS_SCRIPT/test DIRECTORY_WITH_TEST_TOKENS=$DIRECTORY_OF_THIS_SCRIPT/test-tokens echo " " -if [ -d "$DIRECTORY_WITH_TESTS" ] +if [ -d "$DIRECTORY_WITH_TESTS" ] then echo " " echo "----- installing in test -------------------------------------------------------------------" @@ -14,24 +14,24 @@ then yarn install cd .. else - echo "We do not have directory with tests at path $DIRECTORY_WITH_TESTS" + echo "We do not have directory with tests at path $DIRECTORY_WITH_TESTS" fi echo " " echo "----- installing in proxy ------------------------------------------------------------------" echo " " -cd ./proxy +cd ./ yarn install cd .. -if [ -d "$DIRECTORY_WITH_TEST_TOKENS" ] +if [ -d "$DIRECTORY_WITH_TEST_TOKENS" ] then echo " " echo "----- installing in test-tokens ------------------------------------------------------------" echo " " cd ./test-tokens - yarn install + yarn install cd .. else - echo "We do not have directory with test tokens at path $DIRECTORY_WITH_TEST_TOKENS" + echo "We do not have directory with test tokens at path $DIRECTORY_WITH_TEST_TOKENS" fi diff --git a/proxy/predeployed/LICENSE b/predeployed/LICENSE similarity index 100% rename from proxy/predeployed/LICENSE rename to predeployed/LICENSE diff --git a/proxy/predeployed/MANIFEST.in b/predeployed/MANIFEST.in similarity index 100% rename from proxy/predeployed/MANIFEST.in rename to predeployed/MANIFEST.in diff --git a/proxy/predeployed/README.md b/predeployed/README.md similarity index 100% rename from proxy/predeployed/README.md rename to predeployed/README.md diff --git a/proxy/predeployed/pyproject.toml b/predeployed/pyproject.toml similarity index 100% rename from proxy/predeployed/pyproject.toml rename to predeployed/pyproject.toml diff --git a/proxy/predeployed/scripts/build_package.sh b/predeployed/scripts/build_package.sh similarity index 100% rename from proxy/predeployed/scripts/build_package.sh rename to predeployed/scripts/build_package.sh diff --git a/proxy/predeployed/scripts/generate_abi.py b/predeployed/scripts/generate_abi.py similarity index 100% rename from proxy/predeployed/scripts/generate_abi.py rename to predeployed/scripts/generate_abi.py diff --git a/proxy/predeployed/scripts/generate_package_version.py b/predeployed/scripts/generate_package_version.py similarity index 100% rename from proxy/predeployed/scripts/generate_package_version.py rename to predeployed/scripts/generate_package_version.py diff --git a/proxy/predeployed/scripts/prepare_artifacts.py b/predeployed/scripts/prepare_artifacts.py similarity index 100% rename from proxy/predeployed/scripts/prepare_artifacts.py rename to predeployed/scripts/prepare_artifacts.py diff --git a/proxy/predeployed/scripts/publish_package.sh b/predeployed/scripts/publish_package.sh similarity index 100% rename from proxy/predeployed/scripts/publish_package.sh rename to predeployed/scripts/publish_package.sh diff --git a/proxy/predeployed/setup.cfg b/predeployed/setup.cfg similarity index 100% rename from proxy/predeployed/setup.cfg rename to predeployed/setup.cfg diff --git a/proxy/predeployed/src/ima_predeployed/__init__.py b/predeployed/src/ima_predeployed/__init__.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/__init__.py rename to predeployed/src/ima_predeployed/__init__.py diff --git a/proxy/predeployed/src/ima_predeployed/addresses.py b/predeployed/src/ima_predeployed/addresses.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/addresses.py rename to predeployed/src/ima_predeployed/addresses.py diff --git a/proxy/predeployed/src/ima_predeployed/artifacts/.gitkeep b/predeployed/src/ima_predeployed/artifacts/.gitkeep similarity index 100% rename from proxy/predeployed/src/ima_predeployed/artifacts/.gitkeep rename to predeployed/src/ima_predeployed/artifacts/.gitkeep diff --git a/proxy/predeployed/src/ima_predeployed/contract_generator.py b/predeployed/src/ima_predeployed/contract_generator.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contract_generator.py rename to predeployed/src/ima_predeployed/contract_generator.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/__init__.py b/predeployed/src/ima_predeployed/contracts/__init__.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/__init__.py rename to predeployed/src/ima_predeployed/contracts/__init__.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/admin_upgradeability_proxy.py b/predeployed/src/ima_predeployed/contracts/admin_upgradeability_proxy.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/admin_upgradeability_proxy.py rename to predeployed/src/ima_predeployed/contracts/admin_upgradeability_proxy.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/community_locker.py b/predeployed/src/ima_predeployed/contracts/community_locker.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/community_locker.py rename to predeployed/src/ima_predeployed/contracts/community_locker.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/erc1155_on_chain.py b/predeployed/src/ima_predeployed/contracts/erc1155_on_chain.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/erc1155_on_chain.py rename to predeployed/src/ima_predeployed/contracts/erc1155_on_chain.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/erc20_on_chain.py b/predeployed/src/ima_predeployed/contracts/erc20_on_chain.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/erc20_on_chain.py rename to predeployed/src/ima_predeployed/contracts/erc20_on_chain.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/erc721_on_chain.py b/predeployed/src/ima_predeployed/contracts/erc721_on_chain.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/erc721_on_chain.py rename to predeployed/src/ima_predeployed/contracts/erc721_on_chain.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/eth_erc20.py b/predeployed/src/ima_predeployed/contracts/eth_erc20.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/eth_erc20.py rename to predeployed/src/ima_predeployed/contracts/eth_erc20.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/key_storage.py b/predeployed/src/ima_predeployed/contracts/key_storage.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/key_storage.py rename to predeployed/src/ima_predeployed/contracts/key_storage.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/message_proxy_for_schain.py b/predeployed/src/ima_predeployed/contracts/message_proxy_for_schain.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/message_proxy_for_schain.py rename to predeployed/src/ima_predeployed/contracts/message_proxy_for_schain.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/proxy_admin.py b/predeployed/src/ima_predeployed/contracts/proxy_admin.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/proxy_admin.py rename to predeployed/src/ima_predeployed/contracts/proxy_admin.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager.py b/predeployed/src/ima_predeployed/contracts/token_manager.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager.py rename to predeployed/src/ima_predeployed/contracts/token_manager.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc1155.py b/predeployed/src/ima_predeployed/contracts/token_manager_erc1155.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc1155.py rename to predeployed/src/ima_predeployed/contracts/token_manager_erc1155.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc20.py b/predeployed/src/ima_predeployed/contracts/token_manager_erc20.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc20.py rename to predeployed/src/ima_predeployed/contracts/token_manager_erc20.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc721.py b/predeployed/src/ima_predeployed/contracts/token_manager_erc721.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc721.py rename to predeployed/src/ima_predeployed/contracts/token_manager_erc721.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc721_with_metadata.py b/predeployed/src/ima_predeployed/contracts/token_manager_erc721_with_metadata.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager_erc721_with_metadata.py rename to predeployed/src/ima_predeployed/contracts/token_manager_erc721_with_metadata.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager_eth.py b/predeployed/src/ima_predeployed/contracts/token_manager_eth.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager_eth.py rename to predeployed/src/ima_predeployed/contracts/token_manager_eth.py diff --git a/proxy/predeployed/src/ima_predeployed/contracts/token_manager_linker.py b/predeployed/src/ima_predeployed/contracts/token_manager_linker.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/contracts/token_manager_linker.py rename to predeployed/src/ima_predeployed/contracts/token_manager_linker.py diff --git a/proxy/predeployed/src/ima_predeployed/generator.py b/predeployed/src/ima_predeployed/generator.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/generator.py rename to predeployed/src/ima_predeployed/generator.py diff --git a/proxy/predeployed/src/ima_predeployed/upgradeable_contract_generator.py b/predeployed/src/ima_predeployed/upgradeable_contract_generator.py similarity index 100% rename from proxy/predeployed/src/ima_predeployed/upgradeable_contract_generator.py rename to predeployed/src/ima_predeployed/upgradeable_contract_generator.py diff --git a/predeployed/test/base_genesis.json b/predeployed/test/base_genesis.json new file mode 100644 index 000000000..79b0724b4 --- /dev/null +++ b/predeployed/test/base_genesis.json @@ -0,0 +1,40 @@ +{ + "config": { + "chainId": 210, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true + }, + "nonce": "0x0", + "timestamp": "0x0", + "extraData": "0x", + "gasLimit": "0xaf79e0", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0xd2001DAb6898127Be2F167B548691C87251D13C3", + "alloc": { + "0xd2001DAb6898127Be2F167B548691C87251D13C3": { + "balance": "1000000000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0x3b9aca00", + "excessBlobGas": null, + "blobGasUsed": null +} diff --git a/proxy/predeployed/test/config.json b/predeployed/test/config.json similarity index 100% rename from proxy/predeployed/test/config.json rename to predeployed/test/config.json diff --git a/proxy/predeployed/test/contracts/admin_upgradeability_proxy.py b/predeployed/test/contracts/admin_upgradeability_proxy.py similarity index 100% rename from proxy/predeployed/test/contracts/admin_upgradeability_proxy.py rename to predeployed/test/contracts/admin_upgradeability_proxy.py diff --git a/proxy/predeployed/test/contracts/community_locker.py b/predeployed/test/contracts/community_locker.py similarity index 100% rename from proxy/predeployed/test/contracts/community_locker.py rename to predeployed/test/contracts/community_locker.py diff --git a/proxy/predeployed/test/contracts/eth_erc20.py b/predeployed/test/contracts/eth_erc20.py similarity index 100% rename from proxy/predeployed/test/contracts/eth_erc20.py rename to predeployed/test/contracts/eth_erc20.py diff --git a/proxy/predeployed/test/contracts/key_storage.py b/predeployed/test/contracts/key_storage.py similarity index 100% rename from proxy/predeployed/test/contracts/key_storage.py rename to predeployed/test/contracts/key_storage.py diff --git a/proxy/predeployed/test/contracts/message_proxy_for_schain.py b/predeployed/test/contracts/message_proxy_for_schain.py similarity index 100% rename from proxy/predeployed/test/contracts/message_proxy_for_schain.py rename to predeployed/test/contracts/message_proxy_for_schain.py diff --git a/proxy/predeployed/test/contracts/token_manager_erc1155.py b/predeployed/test/contracts/token_manager_erc1155.py similarity index 100% rename from proxy/predeployed/test/contracts/token_manager_erc1155.py rename to predeployed/test/contracts/token_manager_erc1155.py diff --git a/proxy/predeployed/test/contracts/token_manager_erc20.py b/predeployed/test/contracts/token_manager_erc20.py similarity index 100% rename from proxy/predeployed/test/contracts/token_manager_erc20.py rename to predeployed/test/contracts/token_manager_erc20.py diff --git a/proxy/predeployed/test/contracts/token_manager_erc721.py b/predeployed/test/contracts/token_manager_erc721.py similarity index 100% rename from proxy/predeployed/test/contracts/token_manager_erc721.py rename to predeployed/test/contracts/token_manager_erc721.py diff --git a/proxy/predeployed/test/contracts/token_manager_erc721_with_metadata.py b/predeployed/test/contracts/token_manager_erc721_with_metadata.py similarity index 100% rename from proxy/predeployed/test/contracts/token_manager_erc721_with_metadata.py rename to predeployed/test/contracts/token_manager_erc721_with_metadata.py diff --git a/proxy/predeployed/test/contracts/token_manager_eth.py b/predeployed/test/contracts/token_manager_eth.py similarity index 100% rename from proxy/predeployed/test/contracts/token_manager_eth.py rename to predeployed/test/contracts/token_manager_eth.py diff --git a/proxy/predeployed/test/contracts/token_manager_linker.py b/predeployed/test/contracts/token_manager_linker.py similarity index 100% rename from proxy/predeployed/test/contracts/token_manager_linker.py rename to predeployed/test/contracts/token_manager_linker.py diff --git a/proxy/predeployed/test/generate_genesis.py b/predeployed/test/generate_genesis.py similarity index 100% rename from proxy/predeployed/test/generate_genesis.py rename to predeployed/test/generate_genesis.py diff --git a/proxy/predeployed/test/prepare_environment.sh b/predeployed/test/prepare_environment.sh similarity index 100% rename from proxy/predeployed/test/prepare_environment.sh rename to predeployed/test/prepare_environment.sh diff --git a/proxy/predeployed/test/requirements.txt b/predeployed/test/requirements.txt similarity index 72% rename from proxy/predeployed/test/requirements.txt rename to predeployed/test/requirements.txt index 199a75070..9d9409bd4 100644 --- a/proxy/predeployed/test/requirements.txt +++ b/predeployed/test/requirements.txt @@ -1 +1,2 @@ predeployed-generator>=1.2.0 +setuptools diff --git a/proxy/predeployed/test/test.py b/predeployed/test/test.py similarity index 100% rename from proxy/predeployed/test/test.py rename to predeployed/test/test.py diff --git a/proxy/predeployed/test/test.sh b/predeployed/test/test.sh similarity index 100% rename from proxy/predeployed/test/test.sh rename to predeployed/test/test.sh diff --git a/proxy/predeployed/test/test_generator.py b/predeployed/test/test_generator.py similarity index 100% rename from proxy/predeployed/test/test_generator.py rename to predeployed/test/test_generator.py diff --git a/proxy/predeployed/test/tools.py b/predeployed/test/tools.py similarity index 100% rename from proxy/predeployed/test/tools.py rename to predeployed/test/tools.py diff --git a/proxy/.githooks/pre-commit b/proxy/.githooks/pre-commit deleted file mode 100755 index 7e2979a80..000000000 --- a/proxy/.githooks/pre-commit +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -set -e - -cd proxy -yarn fullcheck -cd .. diff --git a/proxy/.openzeppelin/project.json b/proxy/.openzeppelin/project.json deleted file mode 100644 index a976bf001..000000000 --- a/proxy/.openzeppelin/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "manifestVersion": "2.2", - "contracts": { - "MessageProxyForMainnet": "MessageProxyForMainnet", - "Linker": "Linker", - "DepositBoxEth": "DepositBoxEth", - "DepositBoxERC20": "DepositBoxERC20", - "DepositBoxERC721": "DepositBoxERC721", - "CommunityPool": "CommunityPool" - }, - "dependencies": {}, - "name": "skale-ima-proxy", - "version": "1.0.0", - "compiler": { - "compilerSettings": { - "optimizer": { - "enabled": true, - "runs": "200" - } - }, - "typechain": { - "enabled": false - }, - "manager": "openzeppelin", - "artifactsDir": "build/contracts", - "contractsDir": "contracts", - "solcVersion": "0.6.12" - }, - "telemetryOptIn": false -} diff --git a/proxy/README.md b/proxy/README.md deleted file mode 100644 index 2324914ae..000000000 --- a/proxy/README.md +++ /dev/null @@ -1,124 +0,0 @@ - - -[![codecov](https://codecov.io/gh/skalenetwork/IMA/branch/develop/graph/badge.svg?token=rprj0137UA)](https://codecov.io/gh/skalenetwork/IMA) - -# SKALE IMA Proxy - -SKALE Interchain Messaging Smart Contracts - -Proxy is a library with smart contracts for the SKALE Interchain Messaging Agent. This system allows transferring ETH, ERC20 and ERC721 and is based on the Message Proxy system. - -Smart contract language - Solidity 0.5.10 -NodeJS version - 10.16.0 -NPM version - 6.9.0 - -## Message Proxy system - -This system allows sending and receiving messages from other chains. `MessageProxy.sol` contract needs to be deployed to Mainnet, and deployed to each SKALE chain to use it with the SKALE Interchain Messaging Agent. -You can use MessageProxy contract separately by Interchain Messaging Smart Contracts: - -1) Add interface: - -```solidity -interface Proxy { - function postOutgoingMessage( - string calldata targetSchainName, - address targetContract, - uint256 amount, - address to, - bytes calldata data - ) - external; -} -``` - -2) Write `postMessage` function, which will receive and process messages from other chains: - -```solidity -function postMessage( - address sender, - string memory fromSchainName, - address payable to, - uint256 amount, - bytes memory data -) - public -{ - ... -} -``` - -3) Add the address of MessageProxy on some chain: - Data of Smart contracts stores in `data` folder - -4) Then continue developing your dApp - -## Ether clone on SKALE chain - -There is a Wrapped Ether clone(EthERC20.sol) on SKALE chains - it is an ERC20 token and inherits the known ERC-20 approve issue. Please find more details here https://blog.smartdec.net/erc20-approve-issue-in-simple-words-a41aaf47bca6 - -## Interchain Messaging Agent system - -This system sends and receives ETH, ERC20, and ERC721 tokens from other chains. -It consists of 3 additional smart contracts (not including MessageProxy contract): - -1) `DepositBox.sol` - contract only on a mainnet: DepositBox can transfer ETH and ERC20, ERC721 tokens to other chains. \- `deposit(string memory schainName, address to)` - transfer ETH. ... -2) `TokenManager.sol` -3) `TokenFactory.sol` - -## Install - -1) Clone this repo -2) run `npm install` -3) run `npm start`, this command will compile contracts - -## Deployment - -Configure your networks for SKALE chain and mainnet in `truffle-config.js` - -There are several example networks in comments. - -The `.env` file should include the following variables: - -```bash -URL_W3_ETHEREUM="your mainnet RPC url, it also can be an infura endpoint" -URL_W3_S_CHAIN="your SKALE chain RPC url, it also can be an infura endpoint" -CHAIN_NAME_SCHAIN="your SKALE chain name" -PRIVATE_KEY_FOR_ETHEREUM="your private key for mainnet" -PRIVATE_KEY_FOR_SCHAIN="your private key for SKALE chain" -ACCOUNT_FOR_ETHEREUM="your account for mainnet" -ACCOUNT_FOR_SCHAIN="your account for SKALE chain" -NETWORK_FOR_ETHEREUM="your created network for mainnet" -NETWORK_FOR_SCHAIN="your created network for SKALE chain" -``` - -- deploy only to your mainnet: - -```bash -npm run deploy-to-mainnet -``` - -- deploy only to your schain: - -```bash -npm run deploy-to-schain -``` - -- deploy only to your mainnet and to schain: - -```bash -npm run deploy-to-both -``` - -### Generate IMA data file for skale-node - -Results will be saved to `[RESULTS_FOLDER]/ima_data.json` - -- `ARTIFACTS_FOLDER` - path to `build/contracts` folder -- `RESULTS_FOLDER` - path to the folder where `ima_data.json` will be saved - -```bash -cd proxy -npm run compile -python ima_datafile_generator.py [ARTIFACTS_FOLDER] [RESULTS_FOLDER] -``` diff --git a/proxy/migrations/deployMainnet.ts b/proxy/migrations/deployMainnet.ts deleted file mode 100644 index db2fe6b45..000000000 --- a/proxy/migrations/deployMainnet.ts +++ /dev/null @@ -1,255 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only - -/** - * @license - * SKALE IMA - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -/** - * @file 1_migration_to_mainnet.js - * @copyright SKALE Labs 2019-Present - */ -import { promises as fs } from 'fs'; -import { Interface } from "ethers/lib/utils"; -import { ethers, upgrades } from "hardhat"; -import { MessageProxyForMainnet, Linker } from "../typechain"; -import { getAbi, getContractFactory, verifyProxy, getVersion } from '@skalenetwork/upgrade-tools'; -import { Manifest } from "@openzeppelin/upgrades-core"; -import { SkaleABIFile } from '@skalenetwork/upgrade-tools/dist/src/types/SkaleABIFile'; - -export function getContractKeyInAbiFile(contract: string) { - if (contract === "MessageProxyForMainnet") { - return "message_proxy_mainnet"; - } - return contract.replace(/([a-z0-9])(?=[A-Z])/g, '$1_').toLowerCase(); -} - -export async function getManifestFile(): Promise { - return (await Manifest.forNetwork(ethers.provider)).file; -} - -async function getContractManager() { - const defaultFilePath = "data/skaleManagerComponents.json"; - const jsonData = JSON.parse(await fs.readFile(defaultFilePath)) as SkaleABIFile; - try { - const contractManagerAddress = jsonData.contract_manager_address as string; - const contractManagerABI = jsonData.contract_manager_abi as []; - return { address: contractManagerAddress, abi: contractManagerABI }; - } catch (e) { - console.log(e); - process.exit( 126 ); - } -} - -export const contractsToDeploy = [ - "DepositBoxEth", - "DepositBoxERC20", - "DepositBoxERC721", - "DepositBoxERC1155", - "DepositBoxERC721WithMetadata" -] - -export const contracts = [ - "MessageProxyForMainnet", - "Linker", - "CommunityPool", - "DepositBoxEth", - "DepositBoxERC20", - "DepositBoxERC721", - "DepositBoxERC1155", - "DepositBoxERC721WithMetadata" -] - -async function main() { - const [ owner,] = await ethers.getSigners(); - const deployed = new Map(); - - const contractManager = await getContractManager(); - const version = await getVersion(); - - const messageProxyForMainnetName = "MessageProxyForMainnet"; - console.log("Deploy", messageProxyForMainnetName); - const messageProxyForMainnetFactory = await getContractFactory(messageProxyForMainnetName); - const messageProxyForMainnet = ( - await upgrades.deployProxy(messageProxyForMainnetFactory, [contractManager?.address], { initializer: 'initialize(address)' }) - ) as MessageProxyForMainnet; - await messageProxyForMainnet.deployTransaction.wait(); - console.log("Proxy Contract", messageProxyForMainnetName, "deployed to", messageProxyForMainnet.address); - deployed.set( - messageProxyForMainnetName, - { - address: messageProxyForMainnet.address, - interface: messageProxyForMainnet.interface - } - ); - await verifyProxy(messageProxyForMainnetName, messageProxyForMainnet.address, []); - const extraContractRegistrarRole = await messageProxyForMainnet.EXTRA_CONTRACT_REGISTRAR_ROLE(); - await (await messageProxyForMainnet.grantRole(extraContractRegistrarRole, owner.address)).wait(); - - try { - console.log(`Set version ${version}`) - await (await (messageProxyForMainnet as MessageProxyForMainnet).setVersion(version)).wait(); - } catch { - console.log("Failed to set ima version on mainnet"); - } - - const linkerName = "Linker"; - console.log("Deploy", linkerName); - const linkerFactory = await getContractFactory(linkerName); - const linker = ( - await upgrades.deployProxy(linkerFactory, [contractManager?.address, deployed.get(messageProxyForMainnetName)?.address], { initializer: 'initialize(address,address)' }) - ) as Linker; - await linker.deployTransaction.wait(); - await (await linker.registerMainnetContract(linker.address)).wait(); - await (await messageProxyForMainnet.registerExtraContractForAll(linker.address)).wait(); - const chainConnectorRole = await messageProxyForMainnet.CHAIN_CONNECTOR_ROLE(); - await (await messageProxyForMainnet.grantRole(chainConnectorRole, linker.address)).wait(); - console.log("Proxy Contract", linkerName, "deployed to", linker.address); - deployed.set( - linkerName, - { - address: linker.address, - interface: linker.interface - } - ); - await verifyProxy(linkerName, linker.address, []); - - const communityPoolName = "CommunityPool"; - const communityPoolFactory = await getContractFactory(communityPoolName); - const communityPool = - await upgrades.deployProxy( - communityPoolFactory, - [ - contractManager?.address, - deployed.get(linkerName)?.address, - deployed.get(messageProxyForMainnetName)?.address - ], - { - initializer: 'initialize(address,address,address)' - } - ); - await communityPool.deployTransaction.wait(); - await (await linker.registerMainnetContract(communityPool.address)).wait(); - await (await messageProxyForMainnet.registerExtraContractForAll(communityPool.address)).wait(); - await (await messageProxyForMainnet.setCommunityPool(communityPool.address)).wait(); - console.log("Proxy Contract", communityPoolName, "deployed to", communityPool.address); - deployed.set( - communityPoolName, - { - address: communityPool.address, - interface: communityPool.interface - } - ); - await verifyProxy(communityPoolName, communityPool.address, []); - - for (const contract of contractsToDeploy) { - const contractFactory = await getContractFactory(contract); - console.log("Deploy", contract); - const proxy = await upgrades.deployProxy( - contractFactory, - [ - contractManager?.address, - deployed.get(linkerName)?.address, - deployed.get(messageProxyForMainnetName)?.address - ], - { - initializer: 'initialize(address,address,address)' - } - ); - await proxy.deployTransaction.wait(); - const contractName = contract; - // // TODO: remove if - after adding tests to agent - // if (contractName !== "DepositBoxERC1155") { - console.log("Register", contract, "as", contractName, "=>", proxy.address); - await (await linker.registerMainnetContract(proxy.address)).wait(); - await (await messageProxyForMainnet.registerExtraContractForAll(proxy.address)).wait(); - console.log( "Contract", contractName, "with address", proxy.address, "is registered as DepositBox in Linker" ); - deployed.set( - contractName, - { - address: proxy.address, - interface: proxy.interface - } - ); - await verifyProxy(contract, proxy.address, []); - } - - console.log("Store ABIs"); - - const outputObject: {[k: string]: string | []} = {}; - for (const contract of contracts) { - const contractKey = getContractKeyInAbiFile(contract); - const deployedContract = deployed.get(contract); - if (deployedContract === undefined) { - throw Error(`Contract ${contract} was not found`); - } - outputObject[contractKey + "_address"] = deployedContract.address; - outputObject[contractKey + "_abi"] = getAbi(deployedContract.interface); - } - const deployedDepositBoxERC721WithMetadata = deployed.get("DepositBoxERC721WithMetadata"); - if (deployedDepositBoxERC721WithMetadata === undefined) { - throw new Error("DepositBoxERC721WithMetadata was not found"); - } - outputObject[getContractKeyInAbiFile("DepositBoxERC721WithMetadata") + "_address"] = deployedDepositBoxERC721WithMetadata.address; - outputObject[getContractKeyInAbiFile("DepositBoxERC721WithMetadata") + "_abi"] = getAbi(deployedDepositBoxERC721WithMetadata.interface); - - await fs.writeFile("data/proxyMainnet.json", JSON.stringify(outputObject, null, 4)); - - if( contractManager?.address !== null && contractManager?.address !== "" && contractManager?.address !== "0x0000000000000000000000000000000000000000" ) { - // register MessageProxy in ContractManager - if( contractManager?.abi !== undefined ) { - if( await ethers.provider.getCode( contractManager?.address) !== "0x") { - const contractManagerInst = new ethers.Contract(contractManager?.address, contractManager?.abi, owner); - if (await contractManagerInst.owner() !== owner.address) { - console.log( "Owner of ContractManager is not the same of the deployer" ); - } else { - try { - await contractManagerInst.setContractsAddress( "MessageProxyForMainnet", deployed.get( "MessageProxyForMainnet" )?.address); - await contractManagerInst.setContractsAddress( "CommunityPool", deployed.get( "CommunityPool" )?.address); - for (const contractName of contractsToDeploy) { - const contractAddress = deployed.get(contractName); - if (contractAddress === undefined) { - throw new Error(`${contractName} was not found`); - } - await contractManagerInst.setContractsAddress( contractName, contractAddress); - } - console.log( "Successfully registered MessageProxy in ContractManager" ); - } catch ( error ) { - console.log( "Registration of MessageProxy is failed on ContractManager. Please redo it by yourself!\nError:", error ); - } - } - } else - console.log( "Contract Manager address is not a contract" ); - - } else - console.log( "Please provide an abi of ContractManager" ); - - } else - console.log( "Please provide an address of ContractManager" ); - - console.log( "Registration is completed!" ); - - console.log("Done"); -} - -if (require.main === module) { - main() - .then(() => process.exit(0)) - .catch(error => { - console.error(error); - process.exit(1); - }); -} diff --git a/proxy/migrations/upgradeSchain.ts b/proxy/migrations/upgradeSchain.ts deleted file mode 100644 index 3c446c1fe..000000000 --- a/proxy/migrations/upgradeSchain.ts +++ /dev/null @@ -1,85 +0,0 @@ -import chalk from "chalk"; -import { ethers } from "hardhat"; -import { promises as fs } from "fs"; -import { AutoSubmitter, Upgrader } from "@skalenetwork/upgrade-tools"; -import { SkaleABIFile } from "@skalenetwork/upgrade-tools/dist/src/types/SkaleABIFile"; -import { contracts } from "./deploySchain"; -import { manifestSetup } from "./generateManifest"; -import { MessageProxyForSchain } from "../typechain"; - -class ImaSchainUpgrader extends Upgrader { - - constructor( - targetVersion: string, - abi: SkaleABIFile, - contractNamesToUpgrade: string[], - submitter = new AutoSubmitter()) { - super( - "proxySchain", - targetVersion, - abi, - contractNamesToUpgrade, - submitter); - } - - async getMessageProxyForSchain() { - return await ethers.getContractAt("MessageProxyForSchain", this.abi.message_proxy_chain_address as string) as MessageProxyForSchain; - } - - getDeployedVersion = async () => { - const messageProxyForSchain = await this.getMessageProxyForSchain(); - try { - return await messageProxyForSchain.version(); - } catch { - console.log(chalk.red("Can't read deployed version")); - } - } - - setVersion = async (newVersion: string) => { - const messageProxyForSchain = await this.getMessageProxyForSchain(); - this.transactions.push({ - to: messageProxyForSchain.address, - data: messageProxyForSchain.interface.encodeFunctionData("setVersion", [newVersion]) - }); - } - - // deployNewContracts = () => { }; - - // initialize = async () => { }; - - _getContractKeyInAbiFile(contract: string) { - if (contract === "MessageProxyForSchain") { - return "message_proxy_chain"; - } - return contract.replace(/([a-z0-9])(?=[A-Z])/g, '$1_').toLowerCase(); - } -} - -async function getImaSchainAbiAndAddress(): Promise { - if (!process.env.ABI) { - console.log(chalk.red("Set path to file with ABI and addresses to ABI environment variables")); - process.exit(1); - } - const abiFilename = process.env.ABI; - return JSON.parse(await fs.readFile(abiFilename, "utf-8")); -} - -async function main() { - const pathToManifest: string = process.env.MANIFEST || ""; - await manifestSetup(pathToManifest); - const upgrader = new ImaSchainUpgrader( - "2.1.0", - await getImaSchainAbiAndAddress(), - contracts - ); - await upgrader.upgrade(); -} - -if (require.main === module) { - main() - .then(() => process.exit(0)) - .catch(error => { - console.error(error); - process.exit(1); - }); -} diff --git a/proxy/package.json b/proxy/package.json deleted file mode 100644 index 45dd74230..000000000 --- a/proxy/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "skale-ima-proxy", - "private": true, - "license": "AGPL-3.0", - "author": "SKALE Labs and contributors", - "scripts": { - "compile": "npx hardhat compile", - "cleanCompile": "npx hardhat clean && yarn compile", - "deploy-to-both-chains": "yarn deploy-to-mainnet && yarn deploy-to-schain", - "deploy-to-mainnet": "VERSION=$(cat ../VERSION) npx hardhat run migrations/deployMainnet.ts --network mainnet", - "deploy-to-schain": "VERSION=$(cat ../VERSION) npx hardhat run migrations/deploySchain.ts --network schain", - "deploy-skale-manager-components": "npx hardhat run migrations/deploySkaleManagerComponents.ts --network mainnet", - "eslint": "npx eslint .", - "lint": "npx solhint \"contracts/**/*.sol\"", - "prepare": "yarn cleanCompile", - "test": "yarn tsc && npx hardhat test", - "tsc": "tsc --noEmit", - "slither": "slither .", - "fullcheck": "yarn lint && yarn tsc && yarn eslint && yarn slither", - "hooks": "git config core.hooksPath proxy/.githooks", - "no-hooks": "git config core.hooksPath .git/hooks" - }, - "dependencies": { - "@nomiclabs/hardhat-ethers": "^2.1.0", - "@openzeppelin/contracts-upgradeable": "^4.7.1", - "@openzeppelin/hardhat-upgrades": "^1.14.0", - "@skalenetwork/etherbase-interfaces": "^0.0.1-develop.20", - "@skalenetwork/ima-interfaces": "2.0.0", - "@skalenetwork/skale-manager-interfaces": "2.0.0", - "@skalenetwork/upgrade-tools": "^2.0.2", - "axios": "^0.21.4", - "dotenv": "^16.0.0", - "ethers": "^5.7.2", - "hardhat": "2.11.0 - 2.16.1" - }, - "devDependencies": { - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@nomiclabs/hardhat-waffle": "^2.0.2", - "@typechain/ethers-v5": "^11.1.1", - "@typechain/hardhat": "^7.0.0", - "@types/chai": "^4.2.12", - "@types/chai-almost": "^1.0.1", - "@types/chai-as-promised": "^7.1.3", - "@types/elliptic": "^6.4.14", - "@types/minimist": "^1.2.0", - "@types/mocha": "^9.1.0", - "@types/sinon-chai": "^3.2.5", - "@typescript-eslint/eslint-plugin": "^6.2.1", - "@typescript-eslint/parser": "^6.2.1", - "chai": "^4.2.0", - "chai-almost": "^1.0.1", - "chai-as-promised": "^7.1.1", - "eslint": "^8.46.0", - "ethereum-waffle": "^4.0.10", - "ganache": "7.9.2", - "solhint": "3.3.6", - "solidity-coverage": "^0.8.4", - "ts-generator": "^0.1.1", - "ts-node": "^8.10.2", - "typechain": "^8.3.1", - "typescript": "^5.1.6" - } -} diff --git a/proxy/predeployed/test/base_genesis.json b/proxy/predeployed/test/base_genesis.json deleted file mode 100644 index 3b73a843a..000000000 --- a/proxy/predeployed/test/base_genesis.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "config": { - "chainId": 210, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "clique": { - "period": 5, - "epoch": 30000 - } - }, - "nonce": "0x0000000000000033", - "timestamp": "0x0", - "gasLimit": "0x8000000", - "difficulty": "0x100", - "coinbase": "0xd2001DAb6898127Be2F167B548691C87251D13C3", - "extradata": "0x0000000000000000000000000000000000000000000000000000000000000000d2001DAb6898127Be2F167B548691C87251D13C30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "alloc": { - "0xd2001DAb6898127Be2F167B548691C87251D13C3": { - "balance": "1000000000000000000" - } - } -} diff --git a/proxy/scripts/test_upgrade.sh b/proxy/scripts/test_upgrade.sh deleted file mode 100755 index ad27f2259..000000000 --- a/proxy/scripts/test_upgrade.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [ -z "$GITHUB_WORKSPACE" ] -then - GITHUB_WORKSPACE="$(dirname "$(dirname "$(dirname "$(realpath "$0")")")")" -fi - -if [ -z "$GITHUB_REPOSITORY" ] -then - GITHUB_REPOSITORY="skalenetwork/IMA" -fi - - -DEPLOYED_TAG="$(cat "$GITHUB_WORKSPACE"/proxy/DEPLOYED)" -VERSION_TAG="$(cat "$GITHUB_WORKSPACE"/VERSION)" -DEPLOYED_VERSION="$(echo "$DEPLOYED_TAG" | cut -d '-' -f 1)" -DEPLOYED_DIR=$GITHUB_WORKSPACE/deployed-IMA/ - - -git clone --branch "$DEPLOYED_TAG" "https://github.com/$GITHUB_REPOSITORY.git" "$DEPLOYED_DIR" - -ACCOUNTS_FILENAME="$DEPLOYED_DIR/proxy/generatedAccounts.json" -GANACHE=$(npx ganache \ - --😈 \ - --miner.blockGasLimit 12000000 \ - --logging.quiet \ - --chain.allowUnlimitedContractSize \ - --wallet.accountKeysPath "$ACCOUNTS_FILENAME" \ -) - -cd "$DEPLOYED_DIR/proxy" -yarn install -PRIVATE_KEY_FOR_ETHEREUM=$(cat "$ACCOUNTS_FILENAME" | jq -r '.private_keys | to_entries | .[8].value') -PRIVATE_KEY_FOR_SCHAIN=$(cat "$ACCOUNTS_FILENAME" | jq -r '.private_keys | to_entries | .[9].value') -URL_W3_S_CHAIN="http://127.0.0.1:8545" - -CHAIN_NAME_SCHAIN="Test" \ -VERSION="$DEPLOYED_VERSION" \ -PRIVATE_KEY_FOR_ETHEREUM="$PRIVATE_KEY_FOR_ETHEREUM" \ -PRIVATE_KEY_FOR_SCHAIN="$PRIVATE_KEY_FOR_SCHAIN" \ -npx hardhat run migrations/deploySkaleManagerComponents.ts --network localhost -VERSION="$DEPLOYED_VERSION" npx hardhat run migrations/deployMainnet.ts --network localhost - -CHAIN_NAME_SCHAIN="Test" \ -VERSION="$DEPLOYED_VERSION" \ -URL_W3_S_CHAIN="$URL_W3_S_CHAIN" \ -PRIVATE_KEY_FOR_SCHAIN="$PRIVATE_KEY_FOR_SCHAIN" \ -npx hardhat run migrations/deploySchain.ts --network schain - -ABI_FILENAME_SCHAIN="proxySchain_Test.json" -ABI="data/$ABI_FILENAME_SCHAIN" \ -MANIFEST=".openzeppelin/unknown-1337.json" \ -VERSION="$DEPLOYED_VERSION" \ -npx hardhat run migrations/changeManifest.ts --network localhost - -cp .openzeppelin/unknown-*.json "$GITHUB_WORKSPACE/proxy/.openzeppelin" -cp ./data/skaleManagerComponents.json "$GITHUB_WORKSPACE/proxy/data/" -cp "./data/ima-schain-$DEPLOYED_VERSION-manifest.json" "$GITHUB_WORKSPACE/proxy/data/" -ABI_FILENAME_MAINNET="proxyMainnet.json" -cp "data/$ABI_FILENAME_MAINNET" "$GITHUB_WORKSPACE/proxy/data" -cp "data/$ABI_FILENAME_SCHAIN" "$GITHUB_WORKSPACE/proxy/data" -cd "$GITHUB_WORKSPACE" -rm -r --interactive=never "$DEPLOYED_DIR" -cd proxy - -ABI="data/$ABI_FILENAME_MAINNET" \ -TEST_UPGRADE=true \ -ALLOW_NOT_ATOMIC_UPGRADE="OK" \ -VERSION=$VERSION_TAG \ -npx hardhat run migrations/upgradeMainnet.ts --network localhost - -VERSION="$(git describe --tags | echo "$VERSION_TAG")" -echo "$VERSION" -mv "data/proxyMainnet-$VERSION-localhost-abi.json" "data/proxyMainnet.json" - -ABI="data/$ABI_FILENAME_SCHAIN" \ -MANIFEST="data/ima-schain-$DEPLOYED_VERSION-manifest.json" \ -CHAIN_NAME_SCHAIN="Test" \ -ALLOW_NOT_ATOMIC_UPGRADE="OK" \ -VERSION=$VERSION_TAG \ -URL_W3_S_CHAIN="$URL_W3_S_CHAIN" \ -PRIVATE_KEY_FOR_SCHAIN="$PRIVATE_KEY_FOR_SCHAIN" \ -npx hardhat run migrations/upgradeSchain.ts --network schain - -npx ganache instances stop "$GANACHE" diff --git a/proxy/yarn.lock b/proxy/yarn.lock deleted file mode 100644 index 73b7af7b1..000000000 --- a/proxy/yarn.lock +++ /dev/null @@ -1,7321 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@aws-crypto/sha256-js@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" - integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== - dependencies: - "@aws-crypto/util" "^1.2.2" - "@aws-sdk/types" "^3.1.0" - tslib "^1.11.1" - -"@aws-crypto/util@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" - integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== - dependencies: - "@aws-sdk/types" "^3.1.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" - -"@aws-sdk/types@^3.1.0": - version "3.378.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.378.0.tgz#93a811ccdf15c81b1947f1cd67922c4690792189" - integrity sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w== - dependencies: - "@smithy/types" "^2.0.2" - tslib "^2.5.0" - -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== - dependencies: - tslib "^2.3.1" - -"@babel/code-frame@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.5": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@chainsafe/as-sha256@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" - integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== - -"@chainsafe/persistent-merkle-tree@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" - integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/persistent-merkle-tree@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" - integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - -"@chainsafe/ssz@^0.10.0": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" - integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.5.0" - -"@chainsafe/ssz@^0.9.2": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" - integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== - dependencies: - "@chainsafe/as-sha256" "^0.3.1" - "@chainsafe/persistent-merkle-tree" "^0.4.2" - case "^1.6.3" - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.6.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" - integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== - -"@eslint/eslintrc@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" - integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@^8.46.0": - version "8.46.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" - integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== - -"@ethereum-waffle/chai@4.0.10": - version "4.0.10" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" - integrity sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw== - dependencies: - "@ethereum-waffle/provider" "4.0.5" - debug "^4.3.4" - json-bigint "^1.0.0" - -"@ethereum-waffle/compiler@4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz#069e2df24b879b8a7b78857bad6f8bf6ebc8a5b1" - integrity sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw== - dependencies: - "@resolver-engine/imports" "^0.3.3" - "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^10.0.0" - "@types/mkdirp" "^0.5.2" - "@types/node-fetch" "^2.6.1" - mkdirp "^0.5.1" - node-fetch "^2.6.7" - -"@ethereum-waffle/ens@4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-4.0.3.tgz#4a46ac926414f3c83b4e8cc2562c8e2aee06377a" - integrity sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw== - -"@ethereum-waffle/mock-contract@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" - integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== - -"@ethereum-waffle/provider@4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-4.0.5.tgz#8a65dbf0263f4162c9209608205dee1c960e716b" - integrity sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw== - dependencies: - "@ethereum-waffle/ens" "4.0.3" - "@ganache/ethereum-options" "0.1.4" - debug "^4.3.4" - ganache "7.4.3" - -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" - integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== - dependencies: - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - ethereumjs-util "^7.1.5" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/blockchain@^5.5.0": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" - integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" - integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": - 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/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" - integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== - dependencies: - "@ethereumjs/common" "^2.6.0" - ethereumjs-util "^7.1.3" - -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - -"@ethereumjs/vm@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" - integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== - dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^2.2.0" - ethereumjs-util "^7.1.3" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.2" - rustbn.js "~0.2.0" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - 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/abi@^5.1.2": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" - integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.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" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-provider@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" - integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.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" - 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/abstract-signer@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" - integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@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" - 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/address@^5.0.2", "@ethersproject/address@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" - integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp" "^5.4.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" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/base64@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" - integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== - dependencies: - "@ethersproject/bytes" "^5.4.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" - 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": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bignumber@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" - integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" - -"@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" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/bytes@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" - integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== - dependencies: - "@ethersproject/logger" "^5.4.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" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/constants@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" - integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - -"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - 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", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - 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/hash@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" - integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.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" - 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", "@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" - 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", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/keccak256@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" - integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - js-sha3 "0.5.7" - -"@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" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/logger@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" - integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/networks@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" - integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== - dependencies: - "@ethersproject/logger" "^5.4.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" - 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": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/properties@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" - integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - 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.0" - "@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.0" - bech32 "1.1.4" - ws "7.4.6" - -"@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" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^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" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" - integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.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" - 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": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - 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/signing-key@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" - integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - 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", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/strings@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" - integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - 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/transactions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" - integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - 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": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - 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", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - 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/web@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" - integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== - dependencies: - "@ethersproject/base64" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.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" - 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" - -"@ganache/ethereum-address@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" - integrity sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw== - dependencies: - "@ganache/utils" "0.1.4" - -"@ganache/ethereum-options@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz#6a559abb44225e2b8741a8f78a19a46714a71cd6" - integrity sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw== - dependencies: - "@ganache/ethereum-address" "0.1.4" - "@ganache/ethereum-utils" "0.1.4" - "@ganache/options" "0.1.4" - "@ganache/utils" "0.1.4" - bip39 "3.0.4" - seedrandom "3.0.5" - -"@ganache/ethereum-utils@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz#fae4b5b9e642e751ff1fa0cd7316c92996317257" - integrity sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg== - dependencies: - "@ethereumjs/common" "2.6.0" - "@ethereumjs/tx" "3.4.0" - "@ethereumjs/vm" "5.6.0" - "@ganache/ethereum-address" "0.1.4" - "@ganache/rlp" "0.1.4" - "@ganache/utils" "0.1.4" - emittery "0.10.0" - ethereumjs-abi "0.6.8" - ethereumjs-util "7.1.3" - -"@ganache/options@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/options/-/options-0.1.4.tgz#325b07e6de85094667aaaaf3d653e32404a04b78" - integrity sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw== - dependencies: - "@ganache/utils" "0.1.4" - bip39 "3.0.4" - seedrandom "3.0.5" - -"@ganache/rlp@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/rlp/-/rlp-0.1.4.tgz#f4043afda83e1a14a4f80607b103daf166a9b374" - integrity sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ== - dependencies: - "@ganache/utils" "0.1.4" - rlp "2.2.6" - -"@ganache/utils@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/utils/-/utils-0.1.4.tgz#25d60d7689e3dda6a8a7ad70e3646f07c2c39a1f" - integrity sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w== - dependencies: - emittery "0.10.0" - keccak "3.0.1" - seedrandom "3.0.5" - optionalDependencies: - "@trufflesuite/bigint-buffer" "1.1.9" - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@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" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - 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" - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - 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" - 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": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@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" - integrity sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - -"@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" - integrity sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-ethash" "3.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-trie" "6.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz#4702d82df35b07b5407583b54a45bf728e46a2f0" - integrity sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.1" - crc-32 "^1.2.0" - -"@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" - integrity sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@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" - integrity sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ== - dependencies: - "@ethersproject/providers" "^5.7.1" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-tx" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@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" - 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" - integrity sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - ethers "^5.7.1" - js-sdsl "^4.1.4" - -"@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" - integrity sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@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" - integrity sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w== - dependencies: - "@chainsafe/ssz" "^0.9.2" - "@ethersproject/providers" "^5.7.2" - "@nomicfoundation/ethereumjs-common" "4.0.1" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - "@nomicfoundation/ethereumjs-util" "9.0.1" - ethereum-cryptography "0.1.3" - -"@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" - integrity sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA== - dependencies: - "@chainsafe/ssz" "^0.10.0" - "@nomicfoundation/ethereumjs-rlp" "5.0.1" - ethereum-cryptography "0.1.3" - -"@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" - integrity sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ== - dependencies: - "@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" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" - integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" - integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" - integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" - integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" - integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" - integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" - integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" - integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" - integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" - integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" - integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== - 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" - -"@nomiclabs/hardhat-ethers@^2.1.0": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" - integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== - -"@nomiclabs/hardhat-etherscan@^3.1.0": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz#72e3d5bd5d0ceb695e097a7f6f5ff6fcbf062b9a" - integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^8.1.0" - chalk "^2.4.2" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.11" - semver "^6.3.0" - table "^6.8.0" - undici "^5.14.0" - -"@nomiclabs/hardhat-waffle@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" - integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== - -"@openzeppelin/contracts-upgradeable@^4.4.2": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.0.tgz#26688982f46969018e3ed3199e72a07c8d114275" - integrity sha512-5GeFgqMiDlqGT8EdORadp1ntGF0qzWZLmEY7Wbp/yVhN7/B3NNzCxujuI77ktlyG81N3CUZP8cZe3ZAQ/cW10w== - -"@openzeppelin/contracts-upgradeable@^4.7.1": - version "4.7.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.1.tgz#f63fc384255d6ac139e0a2561aa207fd7c14183c" - integrity sha512-5EFiZld3DYFd8aTL8eeMnhnaWh1/oXLXFNuFMrgF3b1DNPshF3LCyO7VR6lc+gac2URJ0BlVcZoCfkk/3MoEfg== - -"@openzeppelin/defender-base-client@^1.46.0": - version "1.47.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.47.1.tgz#2044fd048d73778a42eb0c5ae6f1370d0ab4bac9" - integrity sha512-xnopi1tZIh1zY9KF3mo9S2YgMP0I3T11r6jiO1teAw6M0U5Fx2SCjfCVoKV7CLAQGH1VHmAZ7w2CmcEsFvlQng== - dependencies: - amazon-cognito-identity-js "^6.0.1" - async-retry "^1.3.3" - axios "^1.4.0" - lodash "^4.17.19" - node-fetch "^2.6.0" - -"@openzeppelin/hardhat-upgrades@^1.14.0": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.28.0.tgz#6361f313a8a879d8a08a5e395acf0933bc190950" - integrity sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ== - dependencies: - "@openzeppelin/defender-base-client" "^1.46.0" - "@openzeppelin/platform-deploy-client" "^0.8.0" - "@openzeppelin/upgrades-core" "^1.27.0" - chalk "^4.1.0" - debug "^4.1.1" - proper-lockfile "^4.1.1" - -"@openzeppelin/platform-deploy-client@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.8.0.tgz#af6596275a19c283d6145f0128cc1247d18223c1" - integrity sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA== - dependencies: - "@ethersproject/abi" "^5.6.3" - "@openzeppelin/defender-base-client" "^1.46.0" - axios "^0.21.2" - lodash "^4.17.19" - node-fetch "^2.6.0" - -"@openzeppelin/upgrades-core@^1.27.0": - version "1.27.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.27.3.tgz#d5578e3a3ccd18a61fc585945be67951480238b5" - integrity sha512-IqlSMUkno1XKF4L46aUqZ4BqHxj4dF0BRGrFcKeG2Q0vrsKoazhY67JG9bO+wMYG4zxl6jgmG0bd5ef9HLcLmw== - dependencies: - cbor "^8.0.0" - chalk "^4.1.0" - compare-versions "^6.0.0" - debug "^4.1.1" - ethereumjs-util "^7.0.3" - minimist "^1.2.7" - proper-lockfile "^4.1.1" - solidity-ast "^0.4.15" - -"@resolver-engine/core@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" - integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== - dependencies: - debug "^3.1.0" - is-url "^1.2.4" - request "^2.85.0" - -"@resolver-engine/fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" - integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports-fs@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" - integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== - dependencies: - "@resolver-engine/fs" "^0.3.3" - "@resolver-engine/imports" "^0.3.3" - debug "^3.1.0" - -"@resolver-engine/imports@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" - integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== - dependencies: - "@resolver-engine/core" "^0.3.3" - debug "^3.1.0" - hosted-git-info "^2.6.0" - path-browserify "^1.0.0" - url "^0.11.0" - -"@safe-global/safe-core-sdk-types@^1.9.0", "@safe-global/safe-core-sdk-types@^1.9.2": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-1.10.1.tgz#94331b982671d2f2b8cc23114c58baf63d460c81" - integrity sha512-BKvuYTLOlY16Rq6qCXglmnL6KxInDuXMFqZMaCzwDKiEh+uoHu3xCumG5tVtWOkCgBF4XEZXMqwZUiLcon7IsA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/contracts" "^5.7.0" - "@safe-global/safe-deployments" "^1.20.2" - web3-core "^1.8.1" - web3-utils "^1.8.1" - -"@safe-global/safe-core-sdk-utils@^1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-utils/-/safe-core-sdk-utils-1.7.4.tgz#810d36cf9629129a28eb1b9c6e690b163834b572" - integrity sha512-ITocwSWlFUA1K9VMP/eJiMfgbP/I9qDxAaFz7ukj5N5NZD3ihVQZkmqML6hjse5UhrfjCnfIEcLkNZhtB2XC2Q== - dependencies: - "@safe-global/safe-core-sdk-types" "^1.9.2" - semver "^7.3.8" - web3-utils "^1.8.1" - -"@safe-global/safe-core-sdk@^3.3.2": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk/-/safe-core-sdk-3.3.4.tgz#d404287f9b910feab3e692243aaf62494ff2d2a9" - integrity sha512-tgcK7VWo66Z8632xaYDzUHQ8InPOaI10ELk1wCrO/C3QjPwxjIozbMGOMzF4RZPCSJX2YAHowAvOgmEukgSkxA== - dependencies: - "@ethersproject/solidity" "^5.7.0" - "@safe-global/safe-core-sdk-types" "^1.9.2" - "@safe-global/safe-core-sdk-utils" "^1.7.4" - "@safe-global/safe-deployments" "^1.25.0" - ethereumjs-util "^7.1.5" - semver "^7.3.8" - web3-utils "^1.8.1" - -"@safe-global/safe-deployments@^1.20.2", "@safe-global/safe-deployments@^1.25.0": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.26.0.tgz#b83615b3b5a66e736e08f8ecf2801ed988e9e007" - integrity sha512-Tw89O4/paT19ieMoiWQbqRApb0Bef/DxweS9rxodXAM5EQModkbyFXGZca+YxXE67sLvWjLr2jJUOxwze8mhGw== - dependencies: - semver "^7.3.7" - -"@safe-global/safe-ethers-lib@^1.9.2": - version "1.9.4" - resolved "https://registry.yarnpkg.com/@safe-global/safe-ethers-lib/-/safe-ethers-lib-1.9.4.tgz#049989a302c6f2010c574cf3a834b0cfb9cf67c5" - integrity sha512-WhzcmNun0s0VxeVQKRqaapV0vEpdm76zZBR2Du+S+58u1r57OjZkOSL2Gru0tdwkt3FIZZtE3OhDu09M70pVkA== - dependencies: - "@safe-global/safe-core-sdk-types" "^1.9.2" - "@safe-global/safe-core-sdk-utils" "^1.7.4" - ethers "5.7.2" - -"@safe-global/safe-service-client@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@safe-global/safe-service-client/-/safe-service-client-2.0.2.tgz#85e00017cb7f63d4cc9c9bf9702bd9cb7b27e62e" - integrity sha512-UFmA53EMRU++2mzo547+tCWaw2BknpbuMDjR786pPgm5dhB4ADattTdV7pYqYBMWn4uGoGgb2kaImEq097bATQ== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@safe-global/safe-core-sdk-types" "^1.9.2" - node-fetch "^2.6.6" - -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - 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" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@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" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== - dependencies: - "@noble/hashes" "~1.2.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" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - 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.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - 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" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@skalenetwork/etherbase-interfaces@^0.0.1-develop.20": - version "0.0.1-develop.20" - resolved "https://registry.yarnpkg.com/@skalenetwork/etherbase-interfaces/-/etherbase-interfaces-0.0.1-develop.20.tgz#33f61e18d695fd47063aa39dce4df335d26b9528" - integrity sha512-j3xnuQtOtjvjAoUMJgSUFxRa9/Egkg1RyA8r6PjcEb33VksE4LWLBy0PNFUFehLZv48595JROTcViGeXXwg5HQ== - -"@skalenetwork/ima-interfaces@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@skalenetwork/ima-interfaces/-/ima-interfaces-2.0.0.tgz#93cb73a5200f7d9753a44c1be3e15156e7ceaf9c" - integrity sha512-Kqm45GHQl56H4pqdWHIcTUfFrE60LAUKI3j2CecebN0T9rKa0DDokvE42VDa3PfK2z6XIJxh7SkF+i6NsLbpjA== - dependencies: - "@skalenetwork/skale-manager-interfaces" "^0.1.2" - -"@skalenetwork/skale-manager-interfaces@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@skalenetwork/skale-manager-interfaces/-/skale-manager-interfaces-2.0.0.tgz#afb63131e5c498cfa69219567f9f52b85f0856c9" - integrity sha512-Pge3p4vpeNaXHjwntX+8b38NEcT81a67I32bbnU+l1uSo4kmyXd0VblHMO84H1Azr9TzF3ZmNCG+GI2yntSx2w== - -"@skalenetwork/skale-manager-interfaces@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@skalenetwork/skale-manager-interfaces/-/skale-manager-interfaces-0.1.2.tgz#88e543c8cc298cd0cc9559892d746d2d74786da8" - integrity sha512-gapSQJahwWMlTB/xp/kMzB6k+9+Skx/N0fvEloiW4CUrkGkSa8+fj16YmUXX45p1hOc45W+JydiJPNgZtx32Dg== - -"@skalenetwork/upgrade-tools@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@skalenetwork/upgrade-tools/-/upgrade-tools-2.0.2.tgz#533a2d43d43706fc1898e003523464cee49ec11e" - integrity sha512-by5I3TM7RBi4G8FsicwxQE13rqx+XbPYf75x+CJnTELAFxg5UqMaPArG+YlHT2kBjl6O5OsESkCRtwbPcbIjsg== - dependencies: - "@openzeppelin/contracts-upgradeable" "^4.4.2" - "@safe-global/safe-core-sdk" "^3.3.2" - "@safe-global/safe-core-sdk-types" "^1.9.0" - "@safe-global/safe-ethers-lib" "^1.9.2" - "@safe-global/safe-service-client" "^2.0.0" - axios "^0.27.2" - ethereumjs-util "^7.1.4" - -"@smithy/types@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.0.2.tgz#49d42724c909e845bfd80a2e195740614ce497f3" - integrity sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw== - dependencies: - tslib "^2.5.0" - -"@solidity-parser/parser@^0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.13.2.tgz#b6c71d8ca0b382d90a7bbed241f9bc110af65cbe" - integrity sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@solidity-parser/parser@^0.16.0": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" - integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@trufflesuite/bigint-buffer@1.1.10": - version "1.1.10" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" - integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== - dependencies: - node-gyp-build "4.4.0" - -"@trufflesuite/bigint-buffer@1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" - integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== - dependencies: - node-gyp-build "4.3.0" - -"@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0": - version "20.30.0-unofficial.0" - resolved "https://registry.yarnpkg.com/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.30.0-unofficial.0.tgz#2fbc2f8ef7e82fbeea6abaf7e8a9d42a02b479d3" - integrity sha512-r5X0aOQcuT6pLwTRLD+mPnAM/nlKtvIK4Z+My++A8tTOR0qTjNRx8UB8jzRj3D+p9PMAp5LnpCUUGmz7/TppwA== - dependencies: - ws "8.13.0" - optionalDependencies: - bufferutil "4.0.7" - utf-8-validate "6.0.3" - -"@typechain/ethers-v5@^10.0.0": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" - integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== - dependencies: - lodash "^4.17.15" - ts-essentials "^7.0.1" - -"@typechain/ethers-v5@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-11.1.1.tgz#23a358135a302140cf89a186592464dd6bbf1f98" - integrity sha512-D9WyUrCJ4Z5Gg8T00HWLpuqn1CqSDXlCiUOOpLaWoCbnZrE2jSIOUwR9blBZNo6LE5058e3niVu6xk205Et7tg== - dependencies: - lodash "^4.17.15" - ts-essentials "^7.0.1" - -"@typechain/hardhat@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-7.0.0.tgz#ffa7465328150e793007fee616ae7b76ed20784d" - integrity sha512-XB79i5ewg9Met7gMVGfgVkmypicbnI25T5clJBEooMoW2161p4zvKFpoS2O+lBppQyMrPIZkdvl2M3LMDayVcA== - dependencies: - fs-extra "^9.1.0" - -"@types/abstract-leveldown@*": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz#bb16403c17754b0c4d5772d71d03b924a03d4c80" - integrity sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ== - -"@types/bn.js@*": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - -"@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" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" - integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== - dependencies: - "@types/node" "*" - -"@types/chai-almost@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/chai-almost/-/chai-almost-1.0.1.tgz#e8a2de03b53c22e9a2dd2c85ef98bde5f19b685c" - integrity sha512-UwJTbGAP8Jc84JwpSeCEiE50LBvE7MD4pWYsWdwgZG/umPjUlAYCEMK4WnzbEQO/08HH2jDJ+Ikm9CPzHWdGGQ== - dependencies: - "@types/chai" "*" - -"@types/chai-as-promised@^7.1.3": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" - integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.2.12": - version "4.2.22" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.22.tgz#47020d7e4cf19194d43b5202f35f75bd2ad35ce7" - integrity sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ== - -"@types/elliptic@^6.4.14": - version "6.4.14" - resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" - integrity sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ== - dependencies: - "@types/bn.js" "*" - -"@types/glob@^7.1.1": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/json-schema@^7.0.12": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - -"@types/lru-cache@5.1.1", "@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" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/mkdirp@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" - integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== - dependencies: - "@types/node" "*" - -"@types/mocha@^9.1.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== - -"@types/node-fetch@^2.6.1": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" - integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "20.4.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" - integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== - -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - -"@types/node@^12.12.6": - version "12.20.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.27.tgz#4141fcad57c332a120591de883e26fe4bb14aaea" - integrity sha512-qZdePUDSLAZRXXV234bLBEUM0nAQjoxbcSwp1rqSMUe1rZ47mwU6OjciR/JvF1Oo8mc0ys6GE0ks0HGgqAZoGg== - -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.1.1": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.0.tgz#900b13362610ccd3570fb6eefb911a6732973d00" - integrity sha512-WHRsy5nMpjXfU9B0LqOqPT06EI2+8Xv5NERy0pLxJLbU98q7uhcGogQzfX+rXpU7S5mgHsLxHrLCufZcV/P8TQ== - -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" - -"@types/resolve@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - 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" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -"@types/seedrandom@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" - integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== - -"@types/semver@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== - -"@types/sinon-chai@^3.2.5": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.5.tgz#df21ae57b10757da0b26f512145c065f2ad45c48" - integrity sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "10.0.5" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.5.tgz#01e7037ac0c6c5c54c1606463421ad5c6afc43e7" - integrity sha512-BrAUy0yq3n84XOykYGvGbDir9nBIYwQm2NdBNQT0DbtDLqh/5nMUsjz5XfwrefFNLPE9B6g8yLOZREpvw0J40A== - dependencies: - "@sinonjs/fake-timers" "^7.1.0" - -"@typescript-eslint/eslint-plugin@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.1.tgz#41b79923fee46a745a3a50cba1c33c622aa3c79a" - integrity sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.2.1" - "@typescript-eslint/type-utils" "6.2.1" - "@typescript-eslint/utils" "6.2.1" - "@typescript-eslint/visitor-keys" "6.2.1" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.4" - natural-compare "^1.4.0" - natural-compare-lite "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/parser@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.2.1.tgz#e18a31eea1cca8841a565f1701960c8123ed07f9" - integrity sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg== - dependencies: - "@typescript-eslint/scope-manager" "6.2.1" - "@typescript-eslint/types" "6.2.1" - "@typescript-eslint/typescript-estree" "6.2.1" - "@typescript-eslint/visitor-keys" "6.2.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.2.1.tgz#b6f43a867b84e5671fe531f2b762e0b68f7cf0c4" - integrity sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q== - dependencies: - "@typescript-eslint/types" "6.2.1" - "@typescript-eslint/visitor-keys" "6.2.1" - -"@typescript-eslint/type-utils@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.2.1.tgz#8eb8a2cccdf39cd7cf93e02bd2c3782dc90b0525" - integrity sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ== - dependencies: - "@typescript-eslint/typescript-estree" "6.2.1" - "@typescript-eslint/utils" "6.2.1" - debug "^4.3.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/types@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.2.1.tgz#7fcdeceb503aab601274bf5e210207050d88c8ab" - integrity sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ== - -"@typescript-eslint/typescript-estree@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.1.tgz#2af6e90c1e91cb725a5fe1682841a3f74549389e" - integrity sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q== - dependencies: - "@typescript-eslint/types" "6.2.1" - "@typescript-eslint/visitor-keys" "6.2.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.2.1.tgz#2aa4279ec13053d05615bcbde2398e1e8f08c334" - integrity sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.2.1" - "@typescript-eslint/types" "6.2.1" - "@typescript-eslint/typescript-estree" "6.2.1" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.1.tgz#442e7c09fe94b715a54ebe30e967987c3c41fbf4" - integrity sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA== - dependencies: - "@typescript-eslint/types" "6.2.1" - eslint-visitor-keys "^3.4.1" - -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: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abortcontroller-polyfill@^1.7.3: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - -abstract-level@1.0.3, abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" - integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== - dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" - -abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" - integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== - dependencies: - buffer "^6.0.3" - catering "^2.0.0" - is-buffer "^2.0.5" - level-concat-iterator "^3.0.0" - level-supports "^2.0.1" - queue-microtask "^1.2.3" - -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - 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" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - 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" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -amazon-cognito-identity-js@^6.0.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.1.tgz#d9a4c1a92f4b059330df8ea075f65106d2605409" - integrity sha512-PxBdufgS8uZShrcIFAsRjmqNXsh/4fXOWUGQOUhKLHWWK1pcp/y+VeFF48avXIWefM8XwsT3JlN6m9J2eHt4LA== - dependencies: - "@aws-crypto/sha256-js" "1.2.2" - buffer "4.9.2" - fast-base64-decode "^1.0.0" - isomorphic-unfetch "^3.0.0" - js-cookie "^2.2.1" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@4.1.1, ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - 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" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -antlr4@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" - 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" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - -anymatch@~3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - 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" - 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" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-back@^4.0.1, array-back@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" - integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -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" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - 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" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - 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: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - 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" - 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" - integrity sha1-UI/Q8F0MSHddnszaLhdEIyYejdM= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-eventemitter@0.2.4, async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - -async@1.x: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.4.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -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" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - 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" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== - -axios@^0.21.2, axios@^0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - -axios@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - 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" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -bigint-crypto-utils@^3.0.23: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - -bignumber.js@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" - integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bip39@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" - integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== - dependencies: - "@types/node" "11.11.6" - create-hash "^1.1.0" - pbkdf2 "^3.0.9" - randombytes "^2.0.1" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.1.2, 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" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - 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" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.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" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== - dependencies: - safe-buffer "^5.1.1" - -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.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" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -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== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bufferutil@4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" - integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== - dependencies: - node-gyp-build "^4.3.0" - -bufferutil@4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== - dependencies: - node-gyp-build "^4.3.0" - -bufferutil@^4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.4.tgz#ab81373d313a6ead0d734e98c448c722734ae7bb" - integrity sha512-VNxjXUCrF3LvbLgwfkTb5LsFvk6pGIn7OBb9x+3o+iJ6mKw0JTUp4chBFc88hi1aspeZGeZG9jAIbpFYPQSLZw== - dependencies: - node-gyp-build "^4.2.0" - -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -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" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - 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" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -case@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== - -cbor@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.0.0.tgz#51657d26a99a6a1866f8c3258e948576eb17d709" - integrity sha512-nMmaLWbj7+bC6MsApKRIig8h+yjgNLhPLXaCelq5+C7mpWsHgIcseZSdvgexSY5uE1Q3m2uPvIDZwSdxdo7qig== - dependencies: - nofilter "^3.0.2" - -cbor@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" - integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== - dependencies: - nofilter "^3.1.0" - -chai-almost@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chai-almost/-/chai-almost-1.0.1.tgz#43d026cf3be79a1cd513cf15af840a81243a4b60" - integrity sha1-Q9AmzzvnmhzVE88Vr4QKgSQ6S2A= - dependencies: - deep-eql "^2.0.2" - type-detect "^4.0.3" - -chai-as-promised@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== - dependencies: - check-error "^1.0.2" - -chai@^4.2.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -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== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^3.4.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -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" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -classic-level@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" - integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "^2.2.2" - node-gyp-build "^4.3.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - 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" - 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 sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - 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" - 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" - integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== - dependencies: - array-back "^3.1.0" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -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" - integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== - dependencies: - array-back "^4.0.2" - chalk "^2.4.2" - table-layout "^1.0.2" - typical "^5.2.0" - -commander@2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== - -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@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -compare-versions@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.0.0.tgz#a3edb527e4487bfab9a8b62ffe70cebc9b87675b" - integrity sha512-s2MzYxfRsE9f/ow8hjn7ysa7pod1xhHdQMsgiJtKx6XSNf4x2N1KG4fjrkUmXcP/e9Y2ZX4zB6sHIso0Lm6evQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -cookie@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -core-js-pure@^3.0.1: - version "3.32.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.0.tgz#5d79f85da7a4373e9a06494ccbef995a4c639f8b" - integrity sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g== - -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" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -cosmiconfig@^5.0.7: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - -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" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.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" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^3.1.4: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -death@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@^4.0.1, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@4.3.4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" - integrity sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o= - dependencies: - type-detect "^3.0.0" - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - 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" - 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" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -define-properties@^1.1.2, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -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.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -difflib@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" - 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" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dotenv@^16.0.0: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emittery@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" - integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - 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" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - -enquirer@^2.3.0: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.5: - version "1.18.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" - integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== - 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.1" - is-regex "^1.1.4" - is-string "^1.0.7" - object-inspect "^1.11.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" - -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - 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.10" - 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.10" - -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" - 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" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -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" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - 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" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@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" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" - integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== - -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -eslint@^8.46.0: - version "8.46.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" - integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.1" - "@eslint/js" "^8.46.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.2" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - 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" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - 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" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - -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" - 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-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - 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-waffle@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" - integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== - dependencies: - "@ethereum-waffle/chai" "4.0.10" - "@ethereum-waffle/compiler" "4.0.3" - "@ethereum-waffle/mock-contract" "4.0.4" - "@ethereum-waffle/provider" "4.0.5" - solc "0.8.15" - typechain "^8.0.0" - -ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-util@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== - 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.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" - 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" - -ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.1.tgz#236ef435f46820f0c420a708c0559b5897952069" - integrity sha512-1CGBmCp3m8IMGHhAJF/icH8qjCJrfQtaZ9KW+cAVV8kyN5Lc1IRq3KjV77ILOutrCwiyf5y2gMyCrAUMoCf2Ag== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.4" - -ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - 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.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" - integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== - 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" - -ethers@5.7.2, ethers@^5.7.1, ethers@^5.7.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - 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" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -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" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - 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" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - 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-base64-decode@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" - integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== - -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" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -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" - 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" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -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" - 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" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - 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@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - 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" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.12.1, follow-redirects@^1.14.0: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== - -follow-redirects@^1.14.9, follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - 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" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - 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== - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -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" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.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" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -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" - 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" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -ganache@7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" - integrity sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA== - dependencies: - "@trufflesuite/bigint-buffer" "1.1.10" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "5.1.1" - "@types/seedrandom" "3.0.1" - emittery "0.10.0" - keccak "3.0.2" - leveldown "6.1.0" - secp256k1 "4.0.3" - optionalDependencies: - bufferutil "4.0.5" - utf-8-validate "5.0.7" - -ganache@7.9.2: - version "7.9.2" - resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.9.2.tgz#77f506ad2735dd9109696ffa1834a9dd2f806449" - integrity sha512-7gsVVDpO9AhrFyDMWWl7SpMsPpqGcnAzjxz3k32LheIPNd64p2XsY9GYRdhWmKuryb60W1iaWPZWDkFKlbRWHA== - dependencies: - "@trufflesuite/bigint-buffer" "1.1.10" - "@trufflesuite/uws-js-unofficial" "20.30.0-unofficial.0" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "5.1.1" - "@types/seedrandom" "3.0.1" - abstract-level "1.0.3" - abstract-leveldown "7.2.0" - async-eventemitter "0.2.4" - emittery "0.10.0" - keccak "3.0.2" - leveldown "6.1.0" - secp256k1 "4.0.3" - optionalDependencies: - bufferutil "4.0.5" - utf-8-validate "5.0.7" - -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" - 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" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - 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-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - 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" - integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== - dependencies: - chalk "^2.4.2" - node-emoji "^1.10.0" - -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" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -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== - 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.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - 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@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - 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" - 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" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.7.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - 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" - 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" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - 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" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - 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" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -"hardhat@2.11.0 - 2.16.1": - version "2.16.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.16.1.tgz#fd2288ce44f6846a70ba332b3d8158522447262a" - integrity sha512-QpBjGXFhhSYoYBGEHyoau/A63crZOP+i3GbNxzLGkL6IklzT+piN14+wGnINNCg5BLSKisQI/RAySPzaWRcx/g== - 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" - 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: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - 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" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.0, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - 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" - 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" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.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" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -"heap@>= 0.2.0": - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.6.0: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.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" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -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" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - 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" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - -immutable@^4.0.0-rc.12: - version "4.0.0-rc.15" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.15.tgz#c30056f05eaaf5650fd15230586688fdd15c54bc" - integrity sha512-v8+A3sNyaieoP9dHegl3tEYnIZa7vqNiSv0U6D7YddiZi34VjKy4GsIxrRHj2d8+CS3MeiVja5QyNe4JO/aEXA== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -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" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - 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" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - 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.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - 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" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - 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" - 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" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.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" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== - 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" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -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" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -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" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -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" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.2.tgz#859fc2e731e58c902f99fcabccb75a7dd07d29d8" - integrity sha512-ZZTOjRcDjuAAAv2cTBQP/lL59ZTArx77+7UzHdWW/XB1mrfp7DEaVpKmZ0XIzx+M7AxfhKcqV+nMetUQmFifwg== - 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" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - 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" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -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" - 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" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -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" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^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" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - -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" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -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" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isomorphic-unfetch@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -js-cookie@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== - -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - -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" - 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== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.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== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -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" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -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" - 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" - 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" - 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" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -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" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - 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" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - 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" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@^1.2.4: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -keccak@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -keccak@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - 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" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-concat-iterator@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" - integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== - dependencies: - catering "^2.1.0" - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - -level-supports@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" - integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== - -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - -level-transcoder@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== - dependencies: - buffer "^6.0.3" - module-error "^1.0.1" - -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - -level@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== - dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" - -leveldown@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" - integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== - dependencies: - abstract-leveldown "^7.2.0" - napi-macros "~2.0.0" - node-gyp-build "^4.3.0" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.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" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - 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" - 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" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - 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 sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= - -ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= - -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" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== - dependencies: - mime-db "1.49.0" - -mime-types@~2.1.19: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -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" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -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" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - 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" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@0.5.5, mkdirp@0.5.x, mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -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.4" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.4.tgz#5d2f2dc4386aef78bfadeea60ce704dcf0ef8f3d" - integrity sha512-mflgW0gEWmVLbDDE2gJbOh3+RltTN7CgV9jV25qyCnyLN9FtoltWr7ZtAEDeD9u8W4oFAoolR6fBWieXdn3u8Q== - dependencies: - obliterator "^1.6.1" - -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" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - 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: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -napi-macros@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" - integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== - -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - 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" - 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" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -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" - 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" - 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" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.6.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.12, node-fetch@^2.6.6, node-fetch@^2.6.7: - version "2.6.12" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== - -node-gyp-build@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== - -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" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - -nofilter@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.0.3.tgz#3ff3b142efdccb403434ccae4a0c2c835cb9b522" - integrity sha512-TN/MCrQmXQk5DyUJ8TGUq1Il8rv4fTsjddLmMopV006QP8DMkglmGgYfQKD5620vXLRXfr8iGI6ZZ4/ZWld2cQ== - -nofilter@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" - integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== - -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -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" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -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" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-inspect@^1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.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.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" - integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.21.2" - safe-array-concat "^1.0.0" - -obliterator@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" - integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== - -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - -once@1.x, once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - 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" - 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" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - 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" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - 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" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - 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" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - 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" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbkdf2@^3.0.17, pbkdf2@^3.0.9: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - 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" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier@^1.14.3: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -prettier@^2.1.2: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== - -prettier@^2.3.1: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -proper-lockfile@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" - integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== - dependencies: - graceful-fs "^4.2.4" - retry "^0.12.0" - signal-exit "^3.0.2" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -qs@^6.11.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - 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" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -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" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.0.1, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -raw-body@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - 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" - 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" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" - integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== - dependencies: - minimatch "3.0.4" - -reduce-flatten@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" - integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== - -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -request@^2.85.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -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" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -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" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.1.6, resolve@^1.8.1: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp@2.2.6, rlp@^2.2.3: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== - dependencies: - bn.js "^4.11.1" - -rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -run-async@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - 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" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rxjs@^6.4.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -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-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - 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: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - 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" - integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -scrypt-js@3.0.1, scrypt-js@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@4.0.3, secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -seedrandom@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" - integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== - -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== - -semver@^5.5.0, semver@^5.5.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.7.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.4: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -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" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - 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" - 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" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shelljs@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" - integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.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.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" - integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== - dependencies: - command-exists "^1.2.8" - commander "^8.1.0" - follow-redirects "^1.12.1" - js-sha3 "0.8.0" - memorystream "^0.3.1" - semver "^5.5.0" - tmp "0.0.33" - -solhint@3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.6.tgz#abe9af185a9a7defefba480047b3e42cbe9a1210" - integrity sha512-HWUxTAv2h7hx3s3hAab3ifnlwb02ZWhwFU/wSudUHqteMS3ll9c+m1FlGn9V8ztE2rf3Z82fQZA005Wv7KpcFA== - dependencies: - "@solidity-parser/parser" "^0.13.2" - ajv "^6.6.1" - antlr4 "4.7.1" - ast-parents "0.0.1" - chalk "^2.4.2" - commander "2.18.0" - cosmiconfig "^5.0.7" - eslint "^5.6.0" - fast-diff "^1.1.2" - glob "^7.1.3" - ignore "^4.0.6" - js-yaml "^3.12.0" - lodash "^4.17.11" - semver "^6.3.0" - optionalDependencies: - prettier "^1.14.3" - -solidity-ast@^0.4.15: - version "0.4.49" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.49.tgz#ecba89d10c0067845b7848c3a3e8cc61a4fc5b82" - integrity sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ== - -solidity-coverage@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" - integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== - dependencies: - "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.16.0" - chalk "^2.4.2" - death "^1.1.0" - detect-port "^1.3.0" - difflib "^0.2.4" - fs-extra "^8.1.0" - ghost-testrpc "^0.0.2" - global-modules "^2.0.0" - globby "^10.0.1" - jsonschema "^1.2.4" - lodash "^4.17.15" - mocha "7.1.2" - node-emoji "^1.10.0" - pify "^4.0.1" - recursive-readdir "^2.2.2" - sc-istanbul "^0.4.5" - semver "^7.3.4" - shelljs "^0.8.3" - web3-utils "^1.3.6" - -source-map-support@^0.5.13, source-map-support@^0.5.17: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== - 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" - 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" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= - dependencies: - amdefine ">=0.0.4" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-format@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" - integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== - -"string-width@^1.0.2 || 2", string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -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" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.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" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.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" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -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" - 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" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - 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" - 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" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -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" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= - dependencies: - is-hex-prefixed "1.0.0" - -strip-json-comments@2.0.1, 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 sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@3.1.1, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -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" - -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - 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" - 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" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -table-layout@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" - integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== - dependencies: - array-back "^4.0.1" - deep-extend "~0.6.0" - typical "^5.2.0" - wordwrapjs "^4.0.0" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -table@^6.8.0: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -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" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -ts-api-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.1.tgz#8144e811d44c749cd65b2da305a032510774452d" - integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A== - -ts-command-line-args@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz#fd6913e542099012c0ffb2496126a8f38305c7d6" - integrity sha512-mnK68QA86FYzQYTSA/rxIjT/8EpKsvQw9QkawPic8I8t0gjAOw3Oa509NIRoaY1FmH7hdrncMp7t7o+vYoceNQ== - dependencies: - chalk "^4.1.0" - command-line-args "^5.1.1" - command-line-usage "^6.1.0" - string-format "^2.0.0" - -ts-essentials@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== - -ts-essentials@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" - integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== - -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - -ts-node@^8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.3.1, tslib@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" - integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - 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" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -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" - 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" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.3, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-detect@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" - integrity sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U= - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - 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" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typechain@^8.0.0, typechain@^8.3.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" - integrity sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ== - dependencies: - "@types/prettier" "^2.1.1" - debug "^4.3.1" - fs-extra "^7.0.0" - glob "7.1.7" - js-sha3 "^0.8.0" - lodash "^4.17.15" - mkdirp "^1.0.4" - prettier "^2.3.1" - ts-command-line-args "^2.2.0" - ts-essentials "^7.0.1" - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - 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.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -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" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -typical@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" - integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== - -uglify-js@^3.1.4: - version "3.14.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" - integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - 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" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - 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" - -undici@^5.14.0: - version "5.22.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" - integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw== - dependencies: - busboy "^1.6.0" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - 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" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" - integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== - dependencies: - punycode "^1.4.1" - qs "^6.11.0" - -utf-8-validate@5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" - integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== - dependencies: - node-gyp-build "^4.3.0" - -utf-8-validate@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" - integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== - dependencies: - node-gyp-build "^4.3.0" - -utf-8-validate@^5.0.2: - version "5.0.6" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.6.tgz#e1b3e0a5cc8648a3b44c1799fbb170d1aaaffe80" - integrity sha512-hoY0gOf9EkCw+nimK21FVKHUIG1BMqSiRwxB/q3A9yKZOrOI99PP77BxmarDqWz6rG3vVYiBWfhG8z2Tl+7fZA== - dependencies: - node-gyp-build "^4.2.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== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -web3-core-helpers@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad" - integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g== - dependencies: - web3-eth-iban "1.10.0" - web3-utils "1.10.0" - -web3-core-method@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412" - integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.10.0" - web3-core-promievent "1.10.0" - web3-core-subscriptions "1.10.0" - web3-utils "1.10.0" - -web3-core-promievent@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b" - integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340" - integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ== - dependencies: - util "^0.12.5" - web3-core-helpers "1.10.0" - web3-providers-http "1.10.0" - web3-providers-ipc "1.10.0" - web3-providers-ws "1.10.0" - -web3-core-subscriptions@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c" - integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.0" - -web3-core@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633" - integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ== - dependencies: - "@types/bn.js" "^5.1.1" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.10.0" - web3-core-method "1.10.0" - web3-core-requestmanager "1.10.0" - web3-utils "1.10.0" - -web3-eth-iban@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a" - integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg== - dependencies: - bn.js "^5.2.1" - web3-utils "1.10.0" - -web3-providers-http@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b" - integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA== - dependencies: - abortcontroller-polyfill "^1.7.3" - cross-fetch "^3.1.4" - es6-promise "^4.2.8" - web3-core-helpers "1.10.0" - -web3-providers-ipc@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889" - integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.10.0" - -web3-providers-ws@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5" - integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.0" - websocket "^1.0.32" - -web3-utils@1.10.0, web3-utils@^1.3.6, web3-utils@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" - integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.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" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - 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-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - 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" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - 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" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - 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" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wordwrapjs@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" - integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== - dependencies: - reduce-flatten "^2.0.0" - typical "^5.2.0" - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -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@8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== - -xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - 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" - 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" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - 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@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.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 "^3.0.0" - which-module "^2.0.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== - 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" - 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" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/proxy/scripts/generateAbi.ts b/scripts/generateAbi.ts similarity index 100% rename from proxy/scripts/generateAbi.ts rename to scripts/generateAbi.ts diff --git a/proxy/ima_datafile_generator.py b/scripts/ima_datafile_generator.py similarity index 100% rename from proxy/ima_datafile_generator.py rename to scripts/ima_datafile_generator.py diff --git a/proxy/scripts/magic_upgrade.sh b/scripts/magic_upgrade.sh similarity index 100% rename from proxy/scripts/magic_upgrade.sh rename to scripts/magic_upgrade.sh diff --git a/proxy/scripts/prepare-docs.sh b/scripts/prepare-docs.sh similarity index 100% rename from proxy/scripts/prepare-docs.sh rename to scripts/prepare-docs.sh diff --git a/proxy/scripts/requirements.txt b/scripts/requirements.txt similarity index 100% rename from proxy/scripts/requirements.txt rename to scripts/requirements.txt diff --git a/proxy/scripts/test_deploy.sh b/scripts/test_deploy.sh similarity index 75% rename from proxy/scripts/test_deploy.sh rename to scripts/test_deploy.sh index 25d88d5e1..b232f2c4a 100755 --- a/proxy/scripts/test_deploy.sh +++ b/scripts/test_deploy.sh @@ -2,6 +2,8 @@ set -e +trap 'npx ganache instances stop "$GANACHE"' EXIT + ACCOUNTS=accounts.json GANACHE=$(npx ganache \ --😈 \ @@ -15,6 +17,7 @@ export PRIVATE_KEY_FOR_ETHEREUM=$PRIVATE_KEY export PRIVATE_KEY_FOR_SCHAIN=$PRIVATE_KEY yarn deploy-skale-manager-components +export SKALE_MANAGER_ADDRESS=$(cat data/skaleManagerComponents.json | jq -r .skale_manager_address) yarn deploy-to-both-chains npx ganache instances stop "$GANACHE" diff --git a/proxy/scripts/test_predeployed.sh b/scripts/test_predeployed.sh similarity index 100% rename from proxy/scripts/test_predeployed.sh rename to scripts/test_predeployed.sh diff --git a/scripts/test_upgrade.sh b/scripts/test_upgrade.sh new file mode 100755 index 000000000..8442ef58c --- /dev/null +++ b/scripts/test_upgrade.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +set -e + +trap 'npx ganache instances stop "$GANACHE"' EXIT + +if [ -z "$GITHUB_WORKSPACE" ] +then + GITHUB_WORKSPACE=$(git rev-parse --show-toplevel) +fi + +if [ -z "$GITHUB_REPOSITORY" ] +then + GITHUB_REPOSITORY="skalenetwork/IMA" +fi + + +DEPLOYED_TAG="$(cat "$GITHUB_WORKSPACE"/DEPLOYED)" +VERSION_TAG="$(cat "$GITHUB_WORKSPACE"/VERSION)" +DEPLOYED_VERSION="$(echo "$DEPLOYED_TAG" | cut -d '-' -f 1)" +DEPLOYED_DIR=$GITHUB_WORKSPACE/deployed-IMA/ + + +git clone --branch "$DEPLOYED_TAG" "https://github.com/$GITHUB_REPOSITORY.git" "$DEPLOYED_DIR" + +ACCOUNTS_FILENAME="$DEPLOYED_DIR/proxy/generatedAccounts.json" +GANACHE=$(npx ganache \ + --😈 \ + --miner.blockGasLimit 12000000 \ + --logging.quiet \ + --chain.allowUnlimitedContractSize \ + --wallet.accountKeysPath "$ACCOUNTS_FILENAME" \ +) + +cd "$DEPLOYED_DIR/proxy" +yarn install +PRIVATE_KEY_FOR_ETHEREUM=$(cat "$ACCOUNTS_FILENAME" | jq -r '.private_keys | to_entries | .[8].value') +PRIVATE_KEY_FOR_SCHAIN=$(cat "$ACCOUNTS_FILENAME" | jq -r '.private_keys | to_entries | .[9].value') +URL_W3_S_CHAIN="http://127.0.0.1:8545" + +CHAIN_NAME_SCHAIN="Test" \ +VERSION="$DEPLOYED_VERSION" \ +PRIVATE_KEY_FOR_ETHEREUM="$PRIVATE_KEY_FOR_ETHEREUM" \ +PRIVATE_KEY_FOR_SCHAIN="$PRIVATE_KEY_FOR_SCHAIN" \ +npx hardhat run migrations/deploySkaleManagerComponents.ts --network localhost +# TODO: remove this line after upgrading to 2.2.0 +perl -0777 -i -pe 's/await contractManagerInst\.setContractsAddress\( "MessageProxyForMainnet",[^\}]*console\.log\( "Successfully registered MessageProxy in ContractManager" \);/await contractManagerInst.setContractsAddress( "MessageProxyForMainnet", deployed.get( "MessageProxyForMainnet" )?.address);\nawait contractManagerInst.setContractsAddress( "CommunityPool", deployed.get( "CommunityPool" )?.address);\nawait contractManagerInst.setContractsAddress( "Linker", deployed.get( "Linker" )?.address);\nfor (const contractName of contractsToDeploy) {\n const contract = deployed.get(contractName);\n if (contract === undefined) {\n throw new Error(`\${contractName} was not found`);\n }\n await contractManagerInst.setContractsAddress( contractName, contract.address);\n}\nconsole.log( "Successfully registered MessageProxy in ContractManager" );/s' migrations/deployMainnet.ts +# end of TODO +SKALE_MANAGER=$(cat data/skaleManagerComponents.json | jq -r .skale_manager_address) +VERSION="$DEPLOYED_VERSION" TARGET=$SKALE_MANAGER npx hardhat run migrations/deployMainnet.ts --network localhost + + +CHAIN_NAME_SCHAIN="Test" \ +VERSION="$DEPLOYED_VERSION" \ +URL_W3_S_CHAIN="$URL_W3_S_CHAIN" \ +PRIVATE_KEY_FOR_SCHAIN="$PRIVATE_KEY_FOR_SCHAIN" \ +npx hardhat run migrations/deploySchain.ts --network schain + +ABI_FILENAME_SCHAIN="proxySchain_Test.json" +ABI="data/$ABI_FILENAME_SCHAIN" \ +MANIFEST=".openzeppelin/unknown-1337.json" \ +VERSION="$DEPLOYED_VERSION" \ +npx hardhat run migrations/changeManifest.ts --network localhost + +cp .openzeppelin/unknown-*.json "$GITHUB_WORKSPACE/.openzeppelin" +cp ./data/skaleManagerComponents.json "$GITHUB_WORKSPACE/data/" +cp "data/proxyMainnet.json" "$GITHUB_WORKSPACE/data" +cp "./data/ima-schain-$DEPLOYED_VERSION-manifest.json" "$GITHUB_WORKSPACE/data/" +cp "data/$ABI_FILENAME_SCHAIN" "$GITHUB_WORKSPACE/data" +cd "$GITHUB_WORKSPACE" +rm -r --interactive=never "$DEPLOYED_DIR" + +MESSAGE_PROXY_FOR_MAINNET=$(cat data/proxyMainnet.json | jq -r .message_proxy_mainnet_address) +TEST_UPGRADE=true \ +ABI="data/proxyMainnet.json" \ +TARGET="$MESSAGE_PROXY_FOR_MAINNET" \ +ALLOW_NOT_ATOMIC_UPGRADE="OK" \ +VERSION=$VERSION_TAG \ +npx hardhat run migrations/upgradeMainnet.ts --network localhost + +VERSION="$(git describe --tags | echo "$VERSION_TAG")" +echo "$VERSION" + +MESSAGE_PROXY_FOR_SCHAIN=$(cat data/$ABI_FILENAME_SCHAIN | jq -r .message_proxy_chain_address) + +# TODO: uncomment upgrade schain test after fixing the issue related to skale-contracts +# ABI="data/$ABI_FILENAME_SCHAIN" \ +# MANIFEST="data/ima-schain-$DEPLOYED_VERSION-manifest.json" \ +# CHAIN_NAME_SCHAIN="Test" \ +# ALLOW_NOT_ATOMIC_UPGRADE="OK" \ +# TARGET="$MESSAGE_PROXY_FOR_SCHAIN" \ +# VERSION=$VERSION_TAG \ +# URL_W3_S_CHAIN="$URL_W3_S_CHAIN" \ +# PRIVATE_KEY_FOR_SCHAIN="$PRIVATE_KEY_FOR_SCHAIN" \ +# npx hardhat run migrations/upgradeSchain.ts --network schain + +npx ganache instances stop "$GANACHE" diff --git a/proxy/scripts/updateManifest.py b/scripts/updateManifest.py similarity index 100% rename from proxy/scripts/updateManifest.py rename to scripts/updateManifest.py diff --git a/proxy/scripts/upgrade-instruction.md b/scripts/upgrade-instruction.md similarity index 62% rename from proxy/scripts/upgrade-instruction.md rename to scripts/upgrade-instruction.md index 4c9bf8929..089352d7a 100644 --- a/proxy/scripts/upgrade-instruction.md +++ b/scripts/upgrade-instruction.md @@ -10,7 +10,7 @@ git clone https://github.com/skalenetwork/IMA.git && cd IMA/ && yarn install ## Prepare environment - Create `.env` file by path `IMA/proxy/`. Now you need to create new account. You can generate it in Metamask. Next export private key and put it in `.env` as `PRIVATE_KEY` without 0x. Also put endpoint of your chain as `ENDPOINT` to the `.env`. Also you need to add this account to your Gnosis Wallet as one of the Safe owners. Open Gnosis app, go to "Settings", click "Add new owner" and then sign transaction. Example of `.env` file: + Create `.env` file by path `IMA/`. Now you need to create new account. You can generate it in Metamask. Next export private key and put it in `.env` as `PRIVATE_KEY` without 0x. Also put endpoint of your chain as `ENDPOINT` to the `.env`. Also you need to add this account to your Gnosis Wallet as one of the Safe owners. Open Gnosis app, go to "Settings", click "Add new owner" and then sign transaction. Example of `.env` file: ```bash ENDPOINT="http://127.0.0.1:8545" @@ -35,16 +35,16 @@ git checkout stable && yarn install ## Run upgrade script -* `DEPLOYED_VERSION` - current version of your IMA contracts. Example: `DEPLOYED_VERSION="1.1.3-beta.0"` -* `SCHAIN_ID` - chainId of SKALE chain. -* `SCHAIN_NAME` - name of SKALE chain. -* `SAFE_ADDRESS` - address of gnosis safe wallet on mainnet. -* `MAINNET_CHAIN_ID` - chainId, use 1 for Ethereum mainnet or 5 for Goerli. -* `MESSAGE_PROXY_MAINNET_ADDRESS` - address of MessageProxyForMainnet contract. Optional parameter. Required only if you have deployed IMA on Goerli Testnet. -* `ALLOW_NOT_ATOMIC_UPGRADE` - means that the transaction on the chain will not be executed atomically. That is, for example, if you send two transactions, there is a non-zero probability that they will be written to different blocks. Enter "OK" if you agree. -* `VERSION` - version to upgrade to. Optional parametr. Leave this parameter empty if you are not sure which version you are updating to, the script will automatically take the correct version. +* `DEPLOYED_VERSION` - current version of your IMA contracts. Example: `DEPLOYED_VERSION="1.1.3-beta.0"` +* `SCHAIN_ID` - chainId of SKALE chain. +* `SCHAIN_NAME` - name of SKALE chain. +* `SAFE_ADDRESS` - address of gnosis safe wallet on mainnet. +* `MAINNET_CHAIN_ID` - chainId, use 1 for Ethereum mainnet or 5 for Goerli. +* `MESSAGE_PROXY_MAINNET_ADDRESS` - address of MessageProxyForMainnet contract. Optional parameter. Required only if you have deployed IMA on Goerli Testnet. +* `ALLOW_NOT_ATOMIC_UPGRADE` - means that the transaction on the chain will not be executed atomically. That is, for example, if you send two transactions, there is a non-zero probability that they will be written to different blocks. Enter "OK" if you agree. +* `VERSION` - version to upgrade to. Optional parameter. Leave this parameter empty if you are not sure which version you are updating to, the script will automatically take the correct version. -Run the upgrade script in `IMA/proxy/` with the above parameters. +Run the upgrade script in `IMA/` with the above parameters. ```bash ./scripts/magic_upgrade.sh diff --git a/proxy/slither.config.json b/slither.config.json similarity index 100% rename from proxy/slither.config.json rename to slither.config.json diff --git a/test-tokens/hardhat.config.ts b/test-tokens/hardhat.config.ts index bfb12379e..52dee95e6 100644 --- a/test-tokens/hardhat.config.ts +++ b/test-tokens/hardhat.config.ts @@ -4,6 +4,8 @@ import "@nomiclabs/hardhat-web3"; import "@nomiclabs/hardhat-ethers"; import * as dotenv from "dotenv" import { promises as fs } from "fs"; +import { TaskArguments } from "hardhat/types"; +import { Interface } from "ethers/lib/utils"; dotenv.config(); @@ -35,9 +37,9 @@ function validateInteger( value, radix ) { ( !isNaN( parseInt( value, radix ) ) ) ) return true; - } catch ( err ) { + } catch { + return false; } - return false; } function toInteger( value, radix ) { @@ -46,9 +48,9 @@ function toInteger( value, radix ) { if( !validateInteger( value, radix ) ) return NaN; return parseInt( value, radix ); - } catch ( err ) { + } catch { + return false; } - return false; } function verifyArgumentIsArrayOfIntegers( joArg ) { @@ -75,7 +77,7 @@ function verifyArgumentIsArrayOfIntegers( joArg ) { newValue[index] = toInteger( newValue[index], undefined ); } return newValue; - } catch ( err ) { + } catch { console.log( "(OWASP) CRITICAL ERROR: value " + joArg.value + " of argument " + joArg.name + " must be valid integer array" ); process.exit( 126 ); } @@ -85,13 +87,13 @@ task("erc20", "Deploy ERC20 Token sample to chain") .addOptionalParam("contract", "ERC20 Token contract") .addParam("name", "ERC20 Token name") .addParam("symbol", "ERC20 Token symbol") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = taskArgs.contract ? taskArgs.contract : "ERC20Example"; const erc20Factory = await ethers.getContractFactory(contractName); const erc20 = await erc20Factory.deploy(taskArgs.name, taskArgs.symbol); console.log("ERC20 Token with name", taskArgs.name, "and symbol", taskArgs.symbol, "was deployed"); console.log("Address:", erc20.address); - const jsonObj: {[str: string]: any} = {}; + const jsonObj: {[str: string]: string | Interface} = {}; jsonObj.erc20_address = erc20.address; jsonObj.erc20_abi = erc20.interface; await fs.writeFile("data/" + contractName + "-" + taskArgs.name + "-" + taskArgs.symbol + "-" + erc20.address + ".json", JSON.stringify(jsonObj, null, 4)); @@ -102,13 +104,13 @@ task("erc721", "Deploy ERC721 Token sample to chain") .addOptionalParam("contract", "ERC721 Token contract") .addParam("name", "ERC721 Token name") .addParam("symbol", "ERC721 Token symbol") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = taskArgs.contract ? taskArgs.contract : "ERC721Example"; const erc721Factory = await ethers.getContractFactory(contractName); const erc721 = await erc721Factory.deploy(taskArgs.name, taskArgs.symbol); console.log("ERC721 Token with name", taskArgs.name, "and symbol", taskArgs.symbol, "was deployed"); console.log("Address:", erc721.address); - const jsonObj: {[str: string]: any} = {}; + const jsonObj: {[str: string]: string | Interface} = {}; jsonObj.erc721_address = erc721.address; jsonObj.erc721_abi = erc721.interface; await fs.writeFile("data/" + contractName + "-" + taskArgs.name + "-" + taskArgs.symbol + "-" + erc721.address + ".json", JSON.stringify(jsonObj, null, 4)); @@ -118,13 +120,13 @@ task("erc721", "Deploy ERC721 Token sample to chain") task("erc1155", "Deploy ERC1155 Token sample to chain") .addOptionalParam("contract", "ERC1155 Token contract") .addParam("uri", "ERC1155 Base Token URI") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = taskArgs.contract ? taskArgs.contract : "ERC1155Example"; const erc1155Factory = await ethers.getContractFactory(contractName); const erc1155 = await erc1155Factory.deploy(taskArgs.uri); console.log("ERC1155 Token with Base Token URI", taskArgs.uri, "was deployed"); console.log("Address:", erc1155.address); - const jsonObj: {[str: string]: any} = {}; + const jsonObj: {[str: string]: string | Interface} = {}; jsonObj.erc1155_address = erc1155.address; jsonObj.erc1155_abi = erc1155.interface; await fs.writeFile("data/" + contractName + "-" + taskArgs.uri + "-" + erc1155.address + ".json", JSON.stringify(jsonObj, null, 4)); @@ -135,7 +137,7 @@ task("mint-erc20", "Mint ERC20 Token") .addParam("tokenAddress", "Address of ERC20 token") .addParam("receiverAddress", "Address of receiver") .addParam("amount", "Amount of tokens") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = "ERC20Example"; const erc20Factory = await ethers.getContractFactory(contractName); const erc20 = erc20Factory.attach(taskArgs.tokenAddress); @@ -151,7 +153,7 @@ task("mint-erc721", "Mint ERC721 Token") .addParam("tokenAddress", "Address of ERC721 token") .addParam("receiverAddress", "Address of receiver") .addParam("tokenId", "Token ID of ERC721 Token") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = "ERC721Example"; const erc721Factory = await ethers.getContractFactory(contractName); const erc721 = erc721Factory.attach(taskArgs.tokenAddress); @@ -169,7 +171,7 @@ task("mint-erc1155", "Mint ERC1155 Token") .addParam("amount", "Token Amount of ERC1155 Token") .addOptionalParam("data", "Bytes data for minting Token") .addOptionalParam("batch", "Bytes data for minting Token") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = "ERC1155Example"; const erc1155Factory = await ethers.getContractFactory(contractName); const erc1155 = erc1155Factory.attach(taskArgs.tokenAddress); @@ -196,7 +198,7 @@ task("mint-erc1155", "Mint ERC1155 Token") task("add-minter-erc20", "Add minter to ERC20 Token") .addParam("tokenAddress", "Address of ERC20 token") .addParam("address", "Minter Address of ERC20 token") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = "ERC20Example"; const erc20Factory = await ethers.getContractFactory(contractName); const erc20 = erc20Factory.attach(taskArgs.tokenAddress); @@ -211,7 +213,7 @@ task("add-minter-erc20", "Add minter to ERC20 Token") task("add-minter-erc721", "Add minter to ERC721 Token") .addParam("tokenAddress", "Address of ERC721 token") .addParam("address", "Minter Address of ERC721 token") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = "ERC721Example"; const erc721Factory = await ethers.getContractFactory(contractName); const erc721 = erc721Factory.attach(taskArgs.tokenAddress); @@ -226,7 +228,7 @@ task("add-minter-erc721", "Add minter to ERC721 Token") task("add-minter-erc1155", "Add minter to ERC1155 Token") .addParam("tokenAddress", "Address of ERC1155 token") .addParam("address", "Minter Address of ERC1155 token") - .setAction(async (taskArgs: any, { ethers }) => { + .setAction(async (taskArgs: TaskArguments, { ethers }) => { const contractName = "ERC1155Example"; const erc1155Factory = await ethers.getContractFactory(contractName); const erc1155 = erc1155Factory.attach(taskArgs.tokenAddress); diff --git a/proxy/test/CommunityLocker.ts b/test/CommunityLocker.ts similarity index 78% rename from proxy/test/CommunityLocker.ts rename to test/CommunityLocker.ts index 4725e9be0..0a88dfd22 100644 --- a/proxy/test/CommunityLocker.ts +++ b/test/CommunityLocker.ts @@ -24,14 +24,13 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { CommunityLocker, MessageProxyForSchainWithoutSignature, MessagesTester, TokenManagerLinker, } from "../typechain"; -import { stringKeccak256 } from "./utils/helper"; chai.should(); chai.use(chaiAsPromised); @@ -40,11 +39,11 @@ import { deployMessages } from "./utils/deploy/messages"; import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { deployTokenManagerLinker } from "./utils/deploy/schain/tokenManagerLinker"; -import { BigNumber } from "ethers"; +import { BigNumberish } from "ethers"; import { currentTime, skipTime } from "./utils/time"; const schainName = "TestSchain"; @@ -58,7 +57,7 @@ describe("CommunityLocker", () => { let messages: MessagesTester; let communityLocker: CommunityLocker; let fakeCommunityPool: string; - const mainnetHash = stringKeccak256("Mainnet"); + const mainnetHash = ethers.id("Mainnet"); before(async () => { [deployer, user] = await ethers.getSigners(); @@ -66,33 +65,33 @@ describe("CommunityLocker", () => { beforeEach(async () => { messages = await deployMessages(); - fakeCommunityPool = messages.address; + fakeCommunityPool = user.address; const messageProxyForSchainWithoutSignatureFactory = await ethers.getContractFactory("MessageProxyForSchainWithoutSignature"); messageProxyForSchain = await messageProxyForSchainWithoutSignatureFactory.deploy("MyChain") as MessageProxyForSchainWithoutSignature; tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, deployer.address); - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, fakeCommunityPool); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, fakeCommunityPool); }) it("should activate user", async () => { - const schainHash = stringKeccak256("Schain"); + const schainHash = ethers.id("Schain"); const data = await messages.encodeActivateUserMessage(deployer.address); const fakeData = await messages.encodeTransferEthMessage(user.address, 1); await communityLocker.postMessage(mainnetHash, fakeCommunityPool, data) .should.be.eventually.rejectedWith("Sender is not a message proxy"); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, deployer.address, data) + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, deployer.address, data) .should.be.eventually.rejectedWith("Sender must be CommunityPool"); - await messageProxyForSchain.postMessage(communityLocker.address, schainHash, fakeCommunityPool, data) + await messageProxyForSchain.postMessage(communityLocker, schainHash, fakeCommunityPool, data) .should.be.eventually.rejectedWith("Source chain name must be Mainnet"); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, fakeData) + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, fakeData) .should.be.eventually.rejectedWith("The message should contain a status of user"); expect(await communityLocker.activeUsers(deployer.address)).to.be.equal(false); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, data); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, data) + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, data); + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, data) .should.be.eventually.rejectedWith("Active user statuses must be different"); expect(await communityLocker.activeUsers(deployer.address)).to.be.equal(true); }); @@ -100,38 +99,38 @@ describe("CommunityLocker", () => { it("should activate and then lock user", async () => { const activateData = await messages.encodeActivateUserMessage(user.address); const lockData = await messages.encodeLockUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, activateData); + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, activateData); expect(await communityLocker.activeUsers(user.address)).to.be.equal(true); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, lockData); + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, lockData); expect(await communityLocker.activeUsers(user.address)).to.be.equal(false); }); it("should set time limit per message", async () => { - expect(await communityLocker.timeLimitPerMessage(mainnetHash)).to.be.equal(300); + expect(await communityLocker.timeLimitPerMessage(mainnetHash)).to.be.equal(300n); await communityLocker.setTimeLimitPerMessage("Mainnet", 0) .should.be.eventually.rejectedWith("Not enough permissions to set constant"); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); await communityLocker.setTimeLimitPerMessage("Mainnet", 0); - expect(await communityLocker.timeLimitPerMessage(mainnetHash)).to.be.equal(0); + expect(await communityLocker.timeLimitPerMessage(mainnetHash)).to.be.equal(0n); }); it("should set time limit per message for schain", async () => { const anotherSchainName = "Schain Sierra"; - const schainHash = ethers.utils.id(anotherSchainName); - expect(await communityLocker.timeLimitPerMessage(schainHash)).to.be.equal(0); + const schainHash = ethers.id(anotherSchainName); + expect(await communityLocker.timeLimitPerMessage(schainHash)).to.be.equal(0n); await communityLocker.setTimeLimitPerMessage(anotherSchainName, 1200) .should.be.eventually.rejectedWith("Not enough permissions to set constant"); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); await communityLocker.setTimeLimitPerMessage(schainName, 1200) .should.be.eventually.rejectedWith("Incorrect chain"); await communityLocker.setTimeLimitPerMessage(anotherSchainName, 1200); - expect(await communityLocker.timeLimitPerMessage(schainHash)).to.be.equal(1200); + expect(await communityLocker.timeLimitPerMessage(schainHash)).to.be.equal(1200n); }); it("should set gasprice", async () => { - const newBLSSignature: [BigNumber, BigNumber] = [ - BigNumber.from("0x2dedd4eaeac95881fbcaa4146f95a438494545c607bd57d560aa1d13d2679db8"), - BigNumber.from("0x2e9a10a0baf75ccdbd2b5cf81491673108917ade57dea40d350d4cbebd7b0965") + const newBLSSignature: [BigNumberish, BigNumberish] = [ + "0x2dedd4eaeac95881fbcaa4146f95a438494545c607bd57d560aa1d13d2679db8", + "0x2e9a10a0baf75ccdbd2b5cf81491673108917ade57dea40d350d4cbebd7b0965" ]; const sign = { blsSignature: newBLSSignature, @@ -142,8 +141,8 @@ describe("CommunityLocker", () => { const time = await currentTime(); await communityLocker.setGasPrice(100, time + 200, sign).should.be.eventually.rejectedWith("Timestamp should not be in the future"); await communityLocker.setGasPrice(100, time, sign); - expect(await communityLocker.mainnetGasPrice()).to.be.equal(100); - expect(await communityLocker.gasPriceTimestamp()).to.be.equal(time); + expect(await communityLocker.mainnetGasPrice()).to.be.equal(100n); + expect(await communityLocker.gasPriceTimestamp()).to.be.equal(BigInt(time)); skipTime(60); @@ -151,7 +150,7 @@ describe("CommunityLocker", () => { await communityLocker.setGasPrice(101, time, sign).should.be.eventually.rejectedWith("Gas price timestamp already updated"); await communityLocker.setGasPrice(101, time + 70, sign).should.be.eventually.rejectedWith("Timestamp should not be in the future"); await communityLocker.setGasPrice(101, time + 40, sign); - expect(await communityLocker.mainnetGasPrice()).to.be.equal(101); - expect(await communityLocker.gasPriceTimestamp()).to.be.equal(time + 40); + expect(await communityLocker.mainnetGasPrice()).to.be.equal(101n); + expect(await communityLocker.gasPriceTimestamp()).to.be.equal(BigInt(time + 40)); }); }); diff --git a/proxy/test/CommunityPool.ts b/test/CommunityPool.ts similarity index 63% rename from proxy/test/CommunityPool.ts rename to test/CommunityPool.ts index 1b78ee8cd..5f57afeb3 100644 --- a/proxy/test/CommunityPool.ts +++ b/test/CommunityPool.ts @@ -8,10 +8,10 @@ import { MessagesTester } from "../typechain"; -import { stringKeccak256, getBalance } from "./utils/helper"; +import { getBalance } from "./utils/helper"; -import chai = require("chai"); -import chaiAlmost = require("chai-almost"); +import chai, { assert } from "chai"; +import chaiAlmost from "chai-almost"; chai.should(); chai.use(chaiAsPromised); @@ -28,11 +28,12 @@ import { deployCommunityPool } from "./utils/deploy/mainnet/communityPool"; import { deployCommunityPoolTester } from "./utils/deploy/test/communityPoolTester"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, toNumber } from "ethers"; import { expect } from "chai"; import { deployMessages } from "./utils/deploy/messages"; + describe("CommunityPool", () => { let deployer: SignerWithAddress; let user: SignerWithAddress; @@ -46,7 +47,7 @@ describe("CommunityPool", () => { const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const schainName = "Schain"; const schainName2 = "Schain2"; - let minTransactionGas: BigNumber; + let minTransactionGas: BigNumberish; before(async () => { [deployer, user, node] = await ethers.getSigners(); @@ -70,7 +71,7 @@ describe("CommunityPool", () => { it("should add link to contract on schain", async () => { const fakeContractOnSchain = user.address; const nullAddress = "0x0000000000000000000000000000000000000000"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); await communityPool.getSchainContract(schainHash) .should.be.eventually.rejectedWith("Destination contract must be defined"); @@ -84,7 +85,7 @@ describe("CommunityPool", () => { await communityPool.addSchainContract(schainName, fakeContractOnSchain); - expect(await communityPool.hasSchainContract(schainName)).to.be.true; + assert(await communityPool.hasSchainContract(schainName)); await communityPool.addSchainContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("SKALE chain is already set"); }); @@ -93,14 +94,14 @@ describe("CommunityPool", () => { const fakeContractOnSchain = user.address; await initializeSchain(contractManager, schainName, user.address, 1, 1); await communityPool.connect(user).addSchainContract(schainName, fakeContractOnSchain); - expect(await communityPool.hasSchainContract(schainName)).to.be.true; + assert(await communityPool.hasSchainContract(schainName)); await communityPool.removeSchainContract(schainName) .should.be.eventually.rejectedWith("Not authorized caller"); await initializeSchain(contractManager, schainName, deployer.address, 1, 1); await communityPool.removeSchainContract(schainName); - expect(await communityPool.hasSchainContract(schainName)).to.be.false; + assert.isFalse(await communityPool.hasSchainContract(schainName)); await communityPool.removeSchainContract(schainName) .should.be.eventually.rejectedWith("SKALE chain is not set"); }); @@ -110,9 +111,9 @@ describe("CommunityPool", () => { const LINKER_ROLE = await communityPool.LINKER_ROLE(); await communityPool.grantRole(LINKER_ROLE, user.address); await communityPool.connect(user).addSchainContract(schainName, fakeContractOnSchain); - expect(await communityPool.hasSchainContract(schainName)).to.be.true; + assert(await communityPool.hasSchainContract(schainName)); await communityPool.connect(user).removeSchainContract(schainName); - expect(await communityPool.hasSchainContract(schainName)).to.be.false; + assert.isFalse(await communityPool.hasSchainContract(schainName)); await communityPool.connect(user).removeSchainContract(schainName) .should.be.eventually.rejectedWith("SKALE chain is not set"); }); @@ -129,102 +130,116 @@ describe("CommunityPool", () => { it("should not allow to withdraw from user wallet if CommunityPool is not registered for all chains", async () => { const extraContractRegistrarRole = await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxy.grantRole(extraContractRegistrarRole, deployer.address); - await messageProxy.registerExtraContractForAll(communityPool.address); + await messageProxy.registerExtraContractForAll(communityPool); const tx = await messageProxy.addConnectedChain(schainName); - const wei = minTransactionGas.mul(tx.gasPrice as BigNumber); + const wei = BigInt(minTransactionGas) * tx.gasPrice; await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: wei.toString() }); - await messageProxy.removeExtraContractForAll(communityPool.address); + await messageProxy.removeExtraContractForAll(communityPool); await communityPool.connect(user).withdrawFunds(schainName, wei.toString()) .should.be.eventually.rejectedWith("Sender contract is not registered"); }); describe("when chain connected and contract registered", async () => { - let gasPrice: BigNumber; + let gasPrice: BigNumberish; beforeEach(async () => { - await messageProxy.registerExtraContract(schainName, communityPool.address); - gasPrice = ((await messageProxy.addConnectedChain(schainName)).gasPrice) as BigNumber; + await messageProxy.registerExtraContract(schainName, communityPool); + gasPrice = ((await messageProxy.addConnectedChain(schainName)).gasPrice) as BigNumberish; }); it("should not allow to withdraw from user wallet if CommunityPool is not registered", async () => { - const amount = minTransactionGas.mul(gasPrice); + const amount = BigInt(minTransactionGas) * BigInt(gasPrice); await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString() }); - await messageProxy.removeExtraContract(schainName, communityPool.address); + await messageProxy.removeExtraContract(schainName, communityPool); await communityPool.connect(user).withdrawFunds(schainName, amount.toString()) .should.be.eventually.rejectedWith("Sender contract is not registered"); }); it("should revert if user recharged not enough money for most costly transaction", async () => { - const amount = minTransactionGas.mul(gasPrice).sub(1); + const amount = BigInt(minTransactionGas) * BigInt(gasPrice) - 1n; await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice }) .should.be.eventually.rejectedWith("Not enough ETH for transaction"); }); + it("should revert if gasprice was not set for getRecommendedRechargeAmount call", async () => { + await communityPool.getRecommendedRechargeAmount(ethers.id(schainName), user.address) + .should.be.eventually.rejectedWith("Gas price is not set"); + }); + + it("should get recommended recharge amount if gasprice was set", async () => { + const multiplierNumerator = await communityPool.multiplierNumerator(); + const multiplierDivider = await communityPool.multiplierDivider(); + const amount = await communityPool.getRecommendedRechargeAmount(ethers.id(schainName), user.address, { gasPrice }); + expect(amount).to.be.equal(BigInt(minTransactionGas) * BigInt(gasPrice) * multiplierNumerator / multiplierDivider); + }); + it("should recharge wallet if user passed enough money", async () => { - const amount = minTransactionGas.mul(gasPrice); + const amount = BigInt(minTransactionGas) * BigInt(gasPrice); await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice }); let userBalance = await communityPool.getBalance(user.address, schainName); userBalance.should.be.deep.equal(amount); await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice }); userBalance = await communityPool.getBalance(user.address, schainName); - userBalance.should.be.deep.equal(amount.mul(2)); - expect(BigNumber.from(await messageProxy.getOutgoingMessagesCounter(schainName)).toString()).to.be.equal(BigNumber.from(1).toString()); + userBalance.should.be.deep.equal(amount * 2n); + expect(await messageProxy.getOutgoingMessagesCounter(schainName)).to.be.equal(1); }); - it("should recharge wallet if user passed enough money with basefee", async () => { - const blockNumber = await ethers.provider.getBlockNumber(); - const baseFeePerGas = (await ethers.provider.getBlock(blockNumber)).baseFeePerGas; - const baseFeeCandidate = (baseFeePerGas ? baseFeePerGas : new BigNumber(1, "hex")); - const basefee = baseFeeCandidate.toNumber() === 0 ? BigNumber.from(1) : baseFeeCandidate; - const amount = minTransactionGas.mul(basefee); - // - // comment this check until issue https://github.com/NomicFoundation/hardhat/issues/1688 would be fixed - // - // const amount = await communityPool.getRecommendedRechargeAmount(ethers.utils.id(schainName), user.address)); - // - await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.sub(1).toString(), gasPrice: basefee.toNumber()}).should.be.eventually.rejectedWith("Not enough ETH for transaction"); - await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice: basefee.toNumber()}); - let userBalance = await communityPool.getBalance(user.address, schainName); - userBalance.should.be.deep.equal(amount); - await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice: basefee.toNumber()}); - userBalance = await communityPool.getBalance(user.address, schainName); - userBalance.should.be.deep.equal(amount.mul(2)); - expect(BigNumber.from(await messageProxy.getOutgoingMessagesCounter(schainName)).toString()).to.be.equal(BigNumber.from(1).toString()); - }); + it("should reject if user tries to withdraw more than he has", async () => { + const amount = BigInt(minTransactionGas) * BigInt(gasPrice); + await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice }); + await communityPool.connect(user).withdrawFunds(schainName, amount + 1n, { gasPrice }) + .should.be.eventually.rejectedWith("Balance is too low"); + }); - it("should allow to withdraw money", async () => { - const amount = minTransactionGas.mul(gasPrice).toNumber(); - await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: (amount + 1).toString(), gasPrice }); - expect(BigNumber.from(await messageProxy.getOutgoingMessagesCounter(schainName)).toString()).to.be.equal(BigNumber.from(1).toString()); + it("should reject if user passes not enough money for transaction", async () => { + const tooSmallAmount = 1n; + await communityPool + .connect(user) + .rechargeUserWallet(schainName, user.address, { value: tooSmallAmount, gasPrice }) + .should.be.eventually.rejectedWith("Not enough ETH for transaction"); + }); - await communityPool.connect(user).withdrawFunds(schainName, amount + 2) - .should.be.eventually.rejectedWith("Balance is too low"); + it("should recharge wallet if user passed enough money", async () => { + const amount = await communityPool.getRecommendedRechargeAmount(ethers.id(schainName), user.address, { gasPrice: gasPrice }); + await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice: gasPrice}); + expect(await messageProxy.getOutgoingMessagesCounter(schainName)).to.be.equal(1n); + let userBalance = await communityPool.getBalance(user.address, schainName); + userBalance.should.be.deep.equal(amount); + await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice: gasPrice}); + userBalance = await communityPool.getBalance(user.address, schainName); + userBalance.should.be.deep.equal(amount * 2n); + expect(await messageProxy.getOutgoingMessagesCounter(schainName)).to.be.equal(1n); + }); - const balanceBefore = await getBalance(user.address); - const tx = await (await communityPool.connect(user).withdrawFunds(schainName, amount, { gasPrice })).wait(); - const balanceAfter = await getBalance(user.address); - const transactionFee = tx.gasUsed.mul(gasPrice).toNumber(); - (balanceAfter + transactionFee / 1e18).should.be.almost(balanceBefore + amount / 1e18); + it("should recharge wallet, withdraw all money and check outgoingMessageCounter", async () => { + const amount = await communityPool.getRecommendedRechargeAmount(ethers.id(schainName), user.address, { gasPrice }); + await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice }); + expect(await messageProxy.getOutgoingMessagesCounter(schainName)).to.be.equal(1n); - await communityPool.connect(user).withdrawFunds(schainName, 1, { gasPrice }); + await communityPool.connect(user).withdrawFunds(schainName, amount.toString(), { gasPrice }); + expect(await messageProxy.getOutgoingMessagesCounter(schainName)).to.be.equal(2n); + }); - expect(BigNumber.from(await messageProxy.getOutgoingMessagesCounter(schainName)).toString()).deep.equal(BigNumber.from(2).toString()); + it("should allow to withdraw money", async () => { + const amount = await communityPool.getRecommendedRechargeAmount(ethers.id(schainName), user.address, { gasPrice }); + await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: amount.toString(), gasPrice }); + await communityPool.connect(user).withdrawFunds(schainName, amount.toString(), { gasPrice }); }); }); it("should recharge wallet for couple chains", async () => { - const schainHash = stringKeccak256(schainName); - const schainHash2 = stringKeccak256(schainName2); + const schainHash = ethers.id(schainName); + const schainHash2 = ethers.id(schainName2); const activateUserData = await messages.encodeActivateUserMessage(user.address); await communityPool.addSchainContract(schainName2, mockContractOnSchain); for (const schain of [schainName, schainName2]) { - await messageProxy.registerExtraContract(schain, communityPool.address); + await messageProxy.registerExtraContract(schain, communityPool); await messageProxy.addConnectedChain(schain); } - const gasPrice = BigNumber.from(1e9); - const wei = minTransactionGas.mul(gasPrice); - const wei2 = minTransactionGas.mul(gasPrice).mul(2); + const gasPrice = BigInt(1e9); + const wei = BigInt(minTransactionGas) * gasPrice; + const wei2 = BigInt(minTransactionGas) * gasPrice * 2n; const res1 = await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: wei.toString(), gasPrice }); const res2 = await communityPool.connect(user).rechargeUserWallet(schainName2, user.address, { value: wei2.toString(), gasPrice }); const userBalance = await communityPool.getBalance(user.address, schainName); @@ -234,58 +249,55 @@ describe("CommunityPool", () => { await expect(res1) .to.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, communityPool.address, mockContractOnSchain, activateUserData); + .withArgs(schainHash, 0, communityPool, mockContractOnSchain, activateUserData); await expect(res2) .to.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash2, 0, communityPool.address, mockContractOnSchain, activateUserData); - - const res3 = await (await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: wei.toString(), gasPrice })).wait(); - expect(res3.events).to.be.empty; - }); - - it("should allow to withdraw money", async () => { - await messageProxy.registerExtraContract(schainName, communityPool.address); - const gasPrice = (await messageProxy.addConnectedChain(schainName)).gasPrice as BigNumber; - const wei = minTransactionGas.mul(gasPrice).toNumber(); - await communityPool.connect(user).rechargeUserWallet(schainName, user.address, { value: wei.toString(), gasPrice }); + .withArgs(schainHash2, 0, communityPool, mockContractOnSchain, activateUserData); + + const res3 = await communityPool.connect(user).rechargeUserWallet( + schainName, + user.address, + { value: wei.toString(), gasPrice: gasPrice } + ); + await expect(res3).to.not.emit(messageProxy, "OutgoingMessage"); }); it("should set new minimal transaction gas", async () => { - const newMinTransactionGas = BigNumber.from(100); + const newMinTransactionGas = 100; const CONSTANT_SETTER_ROLE = await communityPool.CONSTANT_SETTER_ROLE(); await communityPool.grantRole(CONSTANT_SETTER_ROLE, deployer.address); - expect(BigNumber.from(await communityPool.minTransactionGas()).toString()).to.be.equal(BigNumber.from(1000000).toString()); + expect(await communityPool.minTransactionGas()).to.be.equal(1000000); await communityPool.connect(user).setMinTransactionGas(newMinTransactionGas) .should.be.eventually.rejectedWith("CONSTANT_SETTER_ROLE is required"); await communityPool.setMinTransactionGas(newMinTransactionGas); - expect(BigNumber.from(await communityPool.minTransactionGas()).toString()).to.be.equal(newMinTransactionGas.toString()); + expect(await communityPool.minTransactionGas()).to.be.equal(newMinTransactionGas); }); it("should set new multiplier", async () => { - const newMultipliermultiplierNumeratorr = BigNumber.from(5); - const newMultiplierDivider = BigNumber.from(4); + const newMultipliermultiplierNumeratorr = 5; + const newMultiplierDivider = 4; const CONSTANT_SETTER_ROLE = await communityPool.CONSTANT_SETTER_ROLE(); await communityPool.grantRole(CONSTANT_SETTER_ROLE, deployer.address); - expect(BigNumber.from(await communityPool.multiplierNumerator()).toString()).to.be.equal(BigNumber.from(3).toString()); - expect(BigNumber.from(await communityPool.multiplierDivider()).toString()).to.be.equal(BigNumber.from(2).toString()); + expect(await communityPool.multiplierNumerator()).to.be.equal(3); + expect(await communityPool.multiplierDivider()).to.be.equal(2); await communityPool.connect(user).setMultiplier(newMultipliermultiplierNumeratorr, newMultiplierDivider) .should.be.eventually.rejectedWith("CONSTANT_SETTER_ROLE is required"); await communityPool.setMultiplier(newMultipliermultiplierNumeratorr, 0).should.be.eventually.rejectedWith("Divider is zero"); await communityPool.setMultiplier(newMultipliermultiplierNumeratorr, newMultiplierDivider); - expect(BigNumber.from(await communityPool.multiplierNumerator()).toString()).to.be.equal(BigNumber.from(newMultipliermultiplierNumeratorr).toString()); - expect(BigNumber.from(await communityPool.multiplierDivider()).toString()).to.be.equal(BigNumber.from(newMultiplierDivider).toString()); + expect(await communityPool.multiplierNumerator()).to.be.equal(newMultipliermultiplierNumeratorr); + expect(await communityPool.multiplierDivider()).to.be.equal(newMultiplierDivider); }); it("should set rejected when call refundGasByUser not from messageProxy contract", async () => { - const schainHash = stringKeccak256("Schain"); + const schainHash = ethers.id("Schain"); await communityPool.connect(deployer).refundGasByUser(schainHash, node.address, user.address, 0) .should.be.eventually.rejectedWith("Sender is not a MessageProxy"); }); it("should set rejected when call refundGasBySchainWallet not from messageProxy contract", async () => { - const schainHash = stringKeccak256("Schain"); + const schainHash = ethers.id("Schain"); await communityPool.connect(deployer).refundGasBySchainWallet(schainHash, node.address, 0) .should.be.eventually.rejectedWith("Sender is not a MessageProxy"); }); @@ -297,7 +309,7 @@ describe("CommunityPool", () => { let communityPoolTester: CommunityPool; let mockContractOnSchain: string; const schainNameRGBU = "SchainRGBU"; - const schainHashRGBU = stringKeccak256("SchainRGBU"); + const schainHashRGBU = ethers.id("SchainRGBU"); beforeEach(async () => { messageProxyTester = await deployMessageProxyForMainnetTester(contractManager); @@ -310,9 +322,9 @@ describe("CommunityPool", () => { it("should be rejected with Node address must be set", async () => { const tx = await messageProxyTester.addConnectedChain(schainNameRGBU); - await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester.address); - const gasPrice = tx.gasPrice as BigNumber; - const wei = minTransactionGas.mul(gasPrice).mul(2); + await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester); + const gasPrice = tx.gasPrice as BigNumberish; + const wei = BigInt(minTransactionGas) * BigInt(gasPrice) * 2n; await communityPoolTester.connect(user).rechargeUserWallet(schainNameRGBU, user.address, { value: wei.toString() }); await messageProxyTester.connect(deployer).refundGasByUser(schainHashRGBU, "0x0000000000000000000000000000000000000000", user.address, 0) .should.be.eventually.rejectedWith("Node address must be set"); @@ -321,38 +333,41 @@ describe("CommunityPool", () => { it("should refund node", async () => { const balanceBefore = await getBalance(node.address); const tx = await messageProxyTester.addConnectedChain(schainNameRGBU); - await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester.address); - const gasPrice = tx.gasPrice as BigNumber; - const wei = minTransactionGas.mul(gasPrice).mul(2); + await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester); + const gasPrice = tx.gasPrice as BigNumberish; + const wei = BigInt(minTransactionGas) * BigInt(gasPrice) * 2n; await communityPoolTester.connect(user).rechargeUserWallet(schainNameRGBU, user.address, { value: wei.toString() }); await messageProxyTester.connect(deployer).refundGasByUser(schainHashRGBU, node.address, user.address, 1000000, { gasPrice }); const balanceAfter = await getBalance(node.address); - (balanceAfter).should.be.almost(balanceBefore + (1000000 * BigNumber.from(gasPrice).toNumber()) / 1e18); + const calculatedBalanceAfter = balanceBefore + (1000000 * toNumber(gasPrice)) / 1e18; + balanceAfter.should.be.almost(calculatedBalanceAfter); }); it("should lock user", async () => { const tx = await messageProxyTester.addConnectedChain(schainNameRGBU); - await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester.address); - const gasPrice = tx.gasPrice as BigNumber; - const wei = minTransactionGas.mul(gasPrice); - expect(await communityPoolTester.activeUsers(user.address, schainHashRGBU)).to.be.false; + await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester); + const gasPrice = tx.gasPrice as BigNumberish; + const wei = BigInt(minTransactionGas) * BigInt(gasPrice); + assert.isFalse(await communityPoolTester.activeUsers(user.address, schainHashRGBU)); await communityPoolTester.connect(user).rechargeUserWallet(schainNameRGBU, user.address, { value: wei.toString() }); - expect(await communityPoolTester.activeUsers(user.address, schainHashRGBU)).to.be.true; + assert(await communityPoolTester.activeUsers(user.address, schainHashRGBU)); await messageProxyTester.connect(deployer).refundGasByUser(schainHashRGBU, node.address, user.address, 1000000, { gasPrice }); - expect(await communityPoolTester.activeUsers(user.address, schainHashRGBU)).to.be.false; + assert.isFalse(await communityPoolTester.activeUsers(user.address, schainHashRGBU)); }); it("should lock user with extra low balance", async () => { const tx = await messageProxyTester.addConnectedChain(schainNameRGBU); - await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester.address); - let gasPrice = tx.gasPrice as BigNumber; - const wei = minTransactionGas.mul(gasPrice); - gasPrice = gasPrice?.mul(2); - expect(await communityPoolTester.activeUsers(user.address, schainHashRGBU)).to.be.false; + await messageProxyTester.registerExtraContract(schainNameRGBU, communityPoolTester); + const gasPrice = tx.gasPrice as BigNumberish; + const wei = BigInt(minTransactionGas) * BigInt(gasPrice); + const gasPriceDuringGasSpikes = BigInt(gasPrice) * 2n; + assert.isFalse(await communityPoolTester.activeUsers(user.address, schainHashRGBU)); await communityPoolTester.connect(user).rechargeUserWallet(schainNameRGBU, user.address, { value: wei.toString() }); - expect(await communityPoolTester.activeUsers(user.address, schainHashRGBU)).to.be.true; - await messageProxyTester.connect(deployer).refundGasByUser(schainHashRGBU, node.address, user.address, 1000000, { gasPrice }); - expect(await communityPoolTester.activeUsers(user.address, schainHashRGBU)).to.be.false; + assert(await communityPoolTester.activeUsers(user.address, schainHashRGBU)); + await messageProxyTester + .connect(deployer) + .refundGasByUser(schainHashRGBU, node.address, user.address, 1000000, { gasPrice: gasPriceDuringGasSpikes }); + assert.isFalse(await communityPoolTester.activeUsers(user.address, schainHashRGBU)); }); }); }); diff --git a/proxy/test/DepositBoxERC1155.ts b/test/DepositBoxERC1155.ts similarity index 84% rename from proxy/test/DepositBoxERC1155.ts rename to test/DepositBoxERC1155.ts index 6bfd6e7f1..27e5d77a2 100644 --- a/proxy/test/DepositBoxERC1155.ts +++ b/test/DepositBoxERC1155.ts @@ -34,10 +34,10 @@ import { MessagesTester, CommunityPool } from "../typechain"; -import { stringKeccak256, getPublicKey, getBalance } from "./utils/helper"; +import { getPublicKey, getBalance } from "./utils/helper"; -import chai = require("chai"); -import chaiAlmost = require("chai-almost"); +import chai from "chai"; +import chaiAlmost from "chai-almost"; chai.should(); chai.use(chaiAsPromised); @@ -55,15 +55,15 @@ import { deployERC1155OnChain } from "./utils/deploy/erc1155OnChain"; import { deployCommunityPool } from "./utils/deploy/mainnet/communityPool"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; import { expect } from "chai"; import { createNode } from "./utils/skale-manager-utils/nodes"; -const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781") +const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -74,7 +74,7 @@ describe("DepositBoxERC1155", () => { let user: SignerWithAddress; let user2: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let depositBoxERC1155: DepositBoxERC1155; let contractManager: ContractManager; @@ -84,18 +84,19 @@ describe("DepositBoxERC1155", () => { let messages: MessagesTester; const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const schainName = "Schain"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); before(async () => { [deployer, user, user2, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - BigInt(ethers.parseEther("1"))}); }); after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - BigInt(ethers.parseEther("1"))}); }); beforeEach(async () => { @@ -105,7 +106,7 @@ describe("DepositBoxERC1155", () => { depositBoxERC1155 = await deployDepositBoxERC1155(contractManager, linker, messageProxy); communityPool = await deployCommunityPool(contractManager, linker, messageProxy); messages = await deployMessages(); - await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker.address); + await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker); await messageProxy.grantRole(await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await initializeSchain(contractManager, schainName, user.address, 1, 1); const nodeCreationParams = { @@ -120,9 +121,9 @@ describe("DepositBoxERC1155", () => { await createNode(contractManager, nodeAddress.address, nodeCreationParams); await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, user2.address, "1000000000000000000"); - await messageProxy.registerExtraContractForAll(depositBoxERC1155.address); - await messageProxy.registerExtraContract(schainName, communityPool.address); - await messageProxy.registerExtraContract(schainName, linker.address); + await messageProxy.registerExtraContractForAll(depositBoxERC1155); + await messageProxy.registerExtraContract(schainName, communityPool); + await messageProxy.registerExtraContract(schainName, linker); }); describe("tests with `ERC1155`", async () => { @@ -151,13 +152,13 @@ describe("DepositBoxERC1155", () => { const fakeERC1155Contract = deployer.address; await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, fakeERC1155Contract) .should.be.eventually.rejectedWith("Given address is not a contract"); - await depositBoxERC1155.connect(deployer).addERC1155TokenByOwner(schainName, erc1155.address) + await depositBoxERC1155.connect(deployer).addERC1155TokenByOwner(schainName, erc1155) .should.be.eventually.rejectedWith("Sender is not an Schain owner"); - await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155.address); - await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155.address).should.be.eventually.rejectedWith("ERC1155 Token was already added"); - expect(await depositBoxERC1155.getSchainToERC1155(schainName, erc1155.address)).to.be.equal(true); - expect((await depositBoxERC1155.getSchainToAllERC1155(schainName, 0, 1))[0]).to.be.equal(erc1155.address); + await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155); + await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155).should.be.eventually.rejectedWith("ERC1155 Token was already added"); + expect(await depositBoxERC1155.getSchainToERC1155(schainName, erc1155)).to.be.equal(true); + expect((await depositBoxERC1155.getSchainToAllERC1155(schainName, 0, 1))[0]).to.be.equal(erc1155); expect((await depositBoxERC1155.getSchainToAllERC1155(schainName, 0, 1)).length).to.be.equal(1); expect((await depositBoxERC1155.getSchainToAllERC1155Length(schainName)).toString()).to.be.equal("1"); await depositBoxERC1155.getSchainToAllERC1155(schainName, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); @@ -168,7 +169,7 @@ describe("DepositBoxERC1155", () => { it("should rejected with `DepositBox was not approved for ERC1155 token`", async () => { // preparation const error = "DepositBox was not approved for ERC1155 token"; - const contractHere = erc1155.address; + const contractHere = erc1155; const id = 5; const amount = 7; // the wei should be MORE than (55000 * 1000000000) @@ -187,7 +188,7 @@ describe("DepositBoxERC1155", () => { it("should invoke `depositERC1155` without mistakes", async () => { // preparation - const contractHere = erc1155.address; + const contractHere = erc1155; const id = 5; const amount = 7; const id2 = 10; @@ -199,7 +200,7 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC1155` - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); // execution await depositBoxERC1155 .connect(deployer) @@ -213,13 +214,13 @@ describe("DepositBoxERC1155", () => { .depositERC1155(schainName, contractHere, id2, amount2)).wait(); // console.log("Gas for depositERC1155:", res.receipt.gasUsed); // expectation - expect(BigNumber.from(await erc1155.balanceOf(depositBoxERC1155.address, id)).toNumber()).to.equal(amount); - expect(BigNumber.from(await erc1155.balanceOf(depositBoxERC1155.address, id2)).toNumber()).to.equal(amount2); + expect(await erc1155.balanceOf(depositBoxERC1155, id)).to.equal(amount); + expect(await erc1155.balanceOf(depositBoxERC1155, id2)).to.equal(amount2); }); it("should invoke `depositERC1155Direct` without mistakes", async () => { // preparation - const contractHere = erc1155.address; + const contractHere = erc1155; const to = user.address; const id = 5; const amount = 7; @@ -232,7 +233,7 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC1155` - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); // execution await depositBoxERC1155 .connect(deployer) @@ -244,22 +245,22 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .depositERC1155Direct(schainName, contractHere, id, amount, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, depositBoxERC1155.address, deployer.address, data1); + .withArgs(schainHash, 0, depositBoxERC1155, deployer.address, data1); await depositBoxERC1155 .connect(deployer) .depositERC1155Direct(schainName, contractHere, id2, amount2, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 1, depositBoxERC1155.address, deployer.address, data2); + .withArgs(schainHash, 1, depositBoxERC1155, deployer.address, data2); // console.log("Gas for depositERC1155:", res.receipt.gasUsed); // expectation - expect(BigNumber.from(await erc1155.balanceOf(depositBoxERC1155.address, id)).toNumber()).to.equal(amount); - expect(BigNumber.from(await erc1155.balanceOf(depositBoxERC1155.address, id2)).toNumber()).to.equal(amount2); + expect(await erc1155.balanceOf(depositBoxERC1155, id)).to.equal(amount); + expect(await erc1155.balanceOf(depositBoxERC1155, id2)).to.equal(amount2); }); it("should rejected with `DepositBox was not approved for ERC1155 token Batch`", async () => { // preparation const error = "DepositBox was not approved for ERC1155 token Batch"; - const contractHere = erc1155.address; + const contractHere = erc1155; const ids = [1, 2, 3]; const amounts = [3, 2, 1]; // the wei should be MORE than (55000 * 1000000000) @@ -278,7 +279,7 @@ describe("DepositBoxERC1155", () => { it("should invoke `depositERC1155Batch` without mistakes", async () => { // preparation - const contractHere = erc1155.address; + const contractHere = erc1155; const ids = [1, 2, 3]; const amounts = [3, 2, 1]; const ids2 = [5, 4, 99]; @@ -290,7 +291,7 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC1155` - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); // execution await depositBoxERC1155 .connect(deployer) @@ -304,15 +305,15 @@ describe("DepositBoxERC1155", () => { .depositERC1155Batch(schainName, contractHere, ids2, amounts2)).wait(); // console.log("Gas for depositERC1155:", res.receipt.gasUsed); // expectation - const balanceIds = await erc1155.balanceOfBatch([depositBoxERC1155.address, depositBoxERC1155.address, depositBoxERC1155.address], ids); - const balanceIds2 = await erc1155.balanceOfBatch([depositBoxERC1155.address, depositBoxERC1155.address, depositBoxERC1155.address], ids2); + const balanceIds = await erc1155.balanceOfBatch([depositBoxERC1155, depositBoxERC1155, depositBoxERC1155], ids); + const balanceIds2 = await erc1155.balanceOfBatch([depositBoxERC1155, depositBoxERC1155, depositBoxERC1155], ids2); const balanceIdsNumber: number[] = []; const balanceIds2Number: number[] = []; balanceIds.forEach(element => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); balanceIds2.forEach(element => { - balanceIds2Number.push(BigNumber.from(element).toNumber()) + balanceIds2Number.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); expect(balanceIds2Number).to.deep.equal(amounts2); @@ -320,7 +321,7 @@ describe("DepositBoxERC1155", () => { it("should invoke `depositERC1155BatchDirect` without mistakes", async () => { // preparation - const contractHere = erc1155.address; + const contractHere = erc1155; const to = user.address; const ids = [1, 2, 3]; const amounts = [3, 2, 1]; @@ -333,7 +334,7 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC1155` - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); // execution await depositBoxERC1155 .connect(deployer) @@ -345,23 +346,23 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .depositERC1155BatchDirect(schainName, contractHere, ids, amounts, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, depositBoxERC1155.address, deployer.address, data1); + .withArgs(schainHash, 0, depositBoxERC1155, deployer.address, data1); await depositBoxERC1155 .connect(deployer) .depositERC1155BatchDirect(schainName, contractHere, ids2, amounts2, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 1, depositBoxERC1155.address, deployer.address, data2); + .withArgs(schainHash, 1, depositBoxERC1155, deployer.address, data2); // console.log("Gas for depositERC1155:", res.receipt.gasUsed); // expectation - const balanceIds = await erc1155.balanceOfBatch([depositBoxERC1155.address, depositBoxERC1155.address, depositBoxERC1155.address], ids); - const balanceIds2 = await erc1155.balanceOfBatch([depositBoxERC1155.address, depositBoxERC1155.address, depositBoxERC1155.address], ids2); + const balanceIds = await erc1155.balanceOfBatch([depositBoxERC1155, depositBoxERC1155, depositBoxERC1155], ids); + const balanceIds2 = await erc1155.balanceOfBatch([depositBoxERC1155, depositBoxERC1155, depositBoxERC1155], ids2); const balanceIdsNumber: number[] = []; const balanceIds2Number: number[] = []; balanceIds.forEach(element => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); balanceIds2.forEach(element => { - balanceIds2Number.push(BigNumber.from(element).toNumber()) + balanceIds2Number.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); expect(balanceIds2Number).to.deep.equal(amounts2); @@ -373,31 +374,31 @@ describe("DepositBoxERC1155", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); await erc1155.connect(deployer).mint(deployer.address, 4, 100, "0x"); - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); await depositBoxERC1155.connect(user).disableWhitelist(schainName); await depositBoxERC1155 .connect(deployer) - .depositERC1155(schainName, erc1155.address, 4, 50); - await depositBoxERC1155.connect(user).getFunds(schainName, erc1155.address, user.address, [4], [50]).should.be.eventually.rejectedWith("Schain is not killed"); + .depositERC1155(schainName, erc1155, 4, 50); + await depositBoxERC1155.connect(user).getFunds(schainName, erc1155, user.address, [4], [50]).should.be.eventually.rejectedWith("Schain is not killed"); await linker.connect(deployer).kill(schainName); await linker.connect(user).kill(schainName); - await depositBoxERC1155.connect(user).getFunds(schainName, erc1155.address, user.address, [4], [60]).should.be.eventually.rejectedWith("Incorrect amount"); - await depositBoxERC1155.connect(user).getFunds(schainName, erc1155.address, user.address, [4], [50]); - expect(BigNumber.from(await erc1155.balanceOf(user.address, 4)).toString()).to.equal("50"); + await depositBoxERC1155.connect(user).getFunds(schainName, erc1155, user.address, [4], [60]).should.be.eventually.rejectedWith("Incorrect amount"); + await depositBoxERC1155.connect(user).getFunds(schainName, erc1155, user.address, [4], [50]); + expect(await erc1155.balanceOf(user.address, 4)).to.equal("50"); }); it("should add erc token by schain owner", async () => { const fakeERC1155Contract = deployer.address; await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, fakeERC1155Contract) .should.be.eventually.rejectedWith("Given address is not a contract"); - await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155.address); - expect(await depositBoxERC1155.getSchainToERC1155(schainName, erc1155.address)).to.be.equal(true); + await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155); + expect(await depositBoxERC1155.getSchainToERC1155(schainName, erc1155)).to.be.equal(true); }); it("should not allow to add token by schain owner if schain killed", async () => { await linker.connect(deployer).kill(schainName); await linker.connect(user).kill(schainName); - await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155.address) + await depositBoxERC1155.connect(user).addERC1155TokenByOwner(schainName, erc1155) .should.be.eventually.rejectedWith("Schain is killed"); }); }); @@ -411,7 +412,7 @@ describe("DepositBoxERC1155", () => { it("should transfer ERC1155 token", async () => { // preparation - const contractHere = erc1155.address; + const contractHere = erc1155; const id = 5; const amount = 7; const to = user.address; @@ -428,7 +429,7 @@ describe("DepositBoxERC1155", () => { const message = { data: await messages.encodeTransferErc1155Message(contractHere, to, id, amount), - destinationContract: depositBoxERC1155.address, + destinationContract: depositBoxERC1155, sender: senderFromSchain }; @@ -444,9 +445,9 @@ describe("DepositBoxERC1155", () => { // mint some ERC1155 of for `deployer` address await erc1155.connect(deployer).mint(deployer.address, id, amount, "0x"); - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); // transfer tokenId from `deployer` to `depositBoxERC1155` - // await erc1155.connect(deployer).transferFrom(deployer.address, depositBoxERC1155.address, tokenId); + // await erc1155.connect(deployer).transferFrom(deployer.address, depositBoxERC1155, tokenId); // get data from `receiveERC1155` await depositBoxERC1155.connect(user2).disableWhitelist(schainName); await depositBoxERC1155 @@ -461,12 +462,12 @@ describe("DepositBoxERC1155", () => { balance.should.be.almost(balanceBefore); // console.log("Gas for postMessage ERC1155:", res.receipt.gasUsed); // expectation - (BigNumber.from(await erc1155.balanceOf(user.address, id)).toNumber()).should.be.equal(amount); + (await erc1155.balanceOf(user.address, id)).should.be.equal(amount); }); it("should transfer ERC1155 token Batch", async () => { // preparation - const contractHere = erc1155.address; + const contractHere = erc1155; const ids = [5, 6, 7]; const amounts = [100, 100, 100]; const to = user.address; @@ -483,7 +484,7 @@ describe("DepositBoxERC1155", () => { const message = { data: await messages.encodeTransferErc1155BatchMessage(contractHere, to, ids, amounts), - destinationContract: depositBoxERC1155.address, + destinationContract: depositBoxERC1155, sender: senderFromSchain }; @@ -499,9 +500,9 @@ describe("DepositBoxERC1155", () => { // mint some ERC1155 of for `deployer` address await erc1155.connect(deployer).mintBatch(deployer.address, ids, amounts, "0x"); - await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155.address, true); + await erc1155.connect(deployer).setApprovalForAll(depositBoxERC1155, true); // transfer tokenId from `deployer` to `depositBoxERC1155` - // await erc1155.connect(deployer).transferFrom(deployer.address, depositBoxERC1155.address, tokenId); + // await erc1155.connect(deployer).transferFrom(deployer.address, depositBoxERC1155, tokenId); // get data from `receiveERC1155` await depositBoxERC1155.connect(user2).disableWhitelist(schainName); await depositBoxERC1155 @@ -519,7 +520,7 @@ describe("DepositBoxERC1155", () => { const balanceIds = await erc1155.balanceOfBatch([user.address, user.address, user.address], ids); const balanceIdsNumber: number[] = []; balanceIds.forEach(element => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); }); diff --git a/proxy/test/DepositBoxERC20.ts b/test/DepositBoxERC20.ts similarity index 80% rename from proxy/test/DepositBoxERC20.ts rename to test/DepositBoxERC20.ts index cf51b696e..ca5183d4d 100644 --- a/proxy/test/DepositBoxERC20.ts +++ b/test/DepositBoxERC20.ts @@ -33,9 +33,9 @@ import { ERC20OnChain, CommunityPool } from "../typechain"; -import { stringFromHex, getPublicKey, stringKeccak256 } from "./utils/helper"; +import { getPublicKey } from "./utils/helper"; -import chai = require("chai"); +import chai from "chai"; chai.should(); chai.use(chaiAsPromised); @@ -52,16 +52,16 @@ import { deployERC20OnChain } from "./utils/deploy/erc20OnChain"; import { deployCommunityPool } from "./utils/deploy/mainnet/communityPool"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; -import { assert, expect } from "chai"; +import { expect } from "chai"; import { createNode } from "./utils/skale-manager-utils/nodes"; import { currentTime, skipTime } from "./utils/time"; -const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781") +const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -73,7 +73,7 @@ describe("DepositBoxERC20", () => { let user: SignerWithAddress; let user2: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let depositBoxERC20: DepositBoxERC20; let contractManager: ContractManager; @@ -83,18 +83,18 @@ describe("DepositBoxERC20", () => { let messages: MessagesTester; const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const schainName = "Schain"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); before(async () => { [deployer, schainOwner, user, user2, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - ethers.parseEther("1")}); }); after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - ethers.parseEther("1")}); }); beforeEach(async () => { @@ -103,7 +103,7 @@ describe("DepositBoxERC20", () => { linker = await deployLinker(contractManager, messageProxy); depositBoxERC20 = await deployDepositBoxERC20(contractManager, linker, messageProxy); communityPool = await deployCommunityPool(contractManager, linker, messageProxy); - await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker.address); + await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker); await messageProxy.grantRole(await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await initializeSchain(contractManager, schainName, schainOwner.address, 1, 1); const nodeCreationParams = { @@ -118,9 +118,9 @@ describe("DepositBoxERC20", () => { await createNode(contractManager, nodeAddress.address, nodeCreationParams); await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, user2.address, "1000000000000000000"); - await messageProxy.registerExtraContractForAll(depositBoxERC20.address); - await messageProxy.registerExtraContract(schainName, communityPool.address); - await messageProxy.registerExtraContract(schainName, linker.address); + await messageProxy.registerExtraContractForAll(depositBoxERC20); + await messageProxy.registerExtraContract(schainName, communityPool); + await messageProxy.registerExtraContract(schainName, linker); messages = await deployMessages(); }); @@ -141,12 +141,12 @@ describe("DepositBoxERC20", () => { const error = "Whitelist is enabled"; await depositBoxERC20.connect(schainOwner).enableWhitelist(schainName); await erc20.connect(deployer).mint(user.address, "1000000000"); - await erc20.connect(deployer).approve(depositBoxERC20.address, "1000000"); + await erc20.connect(deployer).approve(depositBoxERC20, "1000000"); // set `DepositBox` contract to avoid the `Not allowed` error in LockAndDataForMainnet.sol // execution/expectation await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 100) + .depositERC20(schainName, erc20, 100) .should.be.eventually.rejectedWith(error); }); @@ -158,7 +158,7 @@ describe("DepositBoxERC20", () => { // execution/expectation await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 100) + .depositERC20(schainName, erc20, 100) .should.be.eventually.rejectedWith(error); }); @@ -167,18 +167,18 @@ describe("DepositBoxERC20", () => { // mint some quantity of ERC20 tokens for `deployer` address const amount = 10; await erc20.connect(deployer).mint(deployer.address, amount); - await erc20.connect(deployer).approve(depositBoxERC20.address, amount); + await erc20.connect(deployer).approve(depositBoxERC20, amount); // execution await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 1).should.be.eventually.rejectedWith("Whitelist is enabled"); + .depositERC20(schainName, erc20, 1).should.be.eventually.rejectedWith("Whitelist is enabled"); await depositBoxERC20.connect(schainOwner).disableWhitelist(schainName); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 1); + .depositERC20(schainName, erc20, 1); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 1); + .depositERC20(schainName, erc20, 1); }); it("should invoke `depositERC20Direct` without mistakes", async () => { @@ -186,25 +186,25 @@ describe("DepositBoxERC20", () => { // mint some quantity of ERC20 tokens for `deployer` address const amount = 10; await erc20.connect(deployer).mint(deployer.address, amount); - await erc20.connect(deployer).approve(depositBoxERC20.address, amount); + await erc20.connect(deployer).approve(depositBoxERC20, amount); // execution await depositBoxERC20 .connect(deployer) - .depositERC20Direct(schainName, erc20.address, 1, user.address).should.be.eventually.rejectedWith("Whitelist is enabled"); + .depositERC20Direct(schainName, erc20, 1, user.address).should.be.eventually.rejectedWith("Whitelist is enabled"); await depositBoxERC20.connect(schainOwner).disableWhitelist(schainName); - const data1 = await messages.encodeTransferErc20AndTokenInfoMessage(erc20.address, user.address, 1, amount, { name: "D2-token", symbol: "D2", decimals: 18 }); - const data2 = await messages.encodeTransferErc20AndTotalSupplyMessage(erc20.address, user.address, 1, amount); + const data1 = await messages.encodeTransferErc20AndTokenInfoMessage(erc20, user.address, 1, amount, { name: "D2-token", symbol: "D2", decimals: 18 }); + const data2 = await messages.encodeTransferErc20AndTotalSupplyMessage(erc20, user.address, 1, amount); await depositBoxERC20 .connect(deployer) - .depositERC20Direct(schainName, erc20.address, 1, user.address) + .depositERC20Direct(schainName, erc20, 1, user.address) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, depositBoxERC20.address, deployer.address, data1); + .withArgs(schainHash, 0, depositBoxERC20, deployer.address, data1); await depositBoxERC20 .connect(deployer) - .depositERC20Direct(schainName, erc20.address, 1, user.address) + .depositERC20Direct(schainName, erc20, 1, user.address) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 1, depositBoxERC20.address, deployer.address, data2); + .withArgs(schainHash, 1, depositBoxERC20, deployer.address, data2); }); it("should rejected with `Amount is incorrect`", async () => { @@ -212,39 +212,39 @@ describe("DepositBoxERC20", () => { // mint some quantity of ERC20 tokens for `deployer` address const amount = 10; await erc20.connect(deployer).mint(deployer.address, amount); - await erc20.connect(deployer).approve(depositBoxERC20.address, amount + 1); + await erc20.connect(deployer).approve(depositBoxERC20, amount + 1); await depositBoxERC20.connect(schainOwner).disableWhitelist(schainName); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, amount + 1) + .depositERC20(schainName, erc20, amount + 1) .should.be.eventually.rejectedWith("Amount is incorrect"); }); }); it("should get funds after kill", async () => { await erc20.connect(deployer).mint(deployer.address, "1000000000"); - await erc20.connect(deployer).approve(depositBoxERC20.address, "1000000"); + await erc20.connect(deployer).approve(depositBoxERC20, "1000000"); await depositBoxERC20.connect(schainOwner).disableWhitelist(schainName); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 1); - await depositBoxERC20.connect(schainOwner).getFunds(schainName, erc20.address, schainOwner.address, 1).should.be.eventually.rejectedWith("Schain is not killed"); + .depositERC20(schainName, erc20, 1); + await depositBoxERC20.connect(schainOwner).getFunds(schainName, erc20, schainOwner.address, 1).should.be.eventually.rejectedWith("Schain is not killed"); await linker.connect(deployer).kill(schainName); await linker.connect(schainOwner).kill(schainName); - await depositBoxERC20.connect(schainOwner).getFunds(schainName, erc20.address, schainOwner.address, 2).should.be.eventually.rejectedWith("Incorrect amount"); - await depositBoxERC20.connect(schainOwner).getFunds(schainName, erc20.address, schainOwner.address, 1); - expect(BigNumber.from(await erc20.balanceOf(schainOwner.address)).toString()).to.equal("1"); + await depositBoxERC20.connect(schainOwner).getFunds(schainName, erc20, schainOwner.address, 2).should.be.eventually.rejectedWith("Incorrect amount"); + await depositBoxERC20.connect(schainOwner).getFunds(schainName, erc20, schainOwner.address, 1); + expect(await erc20.balanceOf(schainOwner.address)).to.equal("1"); }); it("should add erc token by schain owner", async () => { const fakeERC20Contract = deployer.address; await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, fakeERC20Contract) .should.be.eventually.rejectedWith("Given address is not a contract"); - await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, erc20.address); - await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, erc20.address).should.be.eventually.rejectedWith("ERC20 Token was already added"); - expect(await depositBoxERC20.getSchainToERC20(schainName, erc20.address)).to.be.equal(true); - expect((await depositBoxERC20.getSchainToAllERC20(schainName, 0, 1))[0]).to.be.equal(erc20.address); + await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, erc20); + await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, erc20).should.be.eventually.rejectedWith("ERC20 Token was already added"); + expect(await depositBoxERC20.getSchainToERC20(schainName, erc20)).to.be.equal(true); + expect((await depositBoxERC20.getSchainToAllERC20(schainName, 0, 1))[0]).to.be.equal(erc20); expect((await depositBoxERC20.getSchainToAllERC20(schainName, 0, 1)).length).to.be.equal(1); expect((await depositBoxERC20.getSchainToAllERC20Length(schainName)).toString()).to.be.equal("1"); await depositBoxERC20.getSchainToAllERC20(schainName, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); @@ -254,7 +254,7 @@ describe("DepositBoxERC20", () => { it("should not allow to add token by schain owner if schain killed", async () => { await linker.connect(deployer).kill(schainName); await linker.connect(schainOwner).kill(schainName); - await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, erc20.address) + await depositBoxERC20.connect(schainOwner).addERC20TokenByOwner(schainName, erc20) .should.be.eventually.rejectedWith("Schain is killed"); }); @@ -269,25 +269,25 @@ describe("DepositBoxERC20", () => { await erc20TWFR.connect(deployer).mint(deployer.address, amount); await erc20IT.connect(deployer).mint(deployer.address, amount); await erc20.connect(deployer).mint(deployer.address, amount); - await erc20TWR.connect(deployer).approve(depositBoxERC20.address, amount); - await erc20TWFR.connect(deployer).approve(depositBoxERC20.address, amount); - await erc20IT.connect(deployer).approve(depositBoxERC20.address, amount); - await erc20.connect(deployer).approve(depositBoxERC20.address, amount); + await erc20TWR.connect(deployer).approve(depositBoxERC20, amount); + await erc20TWFR.connect(deployer).approve(depositBoxERC20, amount); + await erc20IT.connect(deployer).approve(depositBoxERC20, amount); + await erc20.connect(deployer).approve(depositBoxERC20, amount); // execution await depositBoxERC20.connect(schainOwner).disableWhitelist(schainName); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20.address, 1); + .depositERC20(schainName, erc20, 1); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20TWR.address, 1); + .depositERC20(schainName, erc20TWR, 1); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20IT.address, 1) + .depositERC20(schainName, erc20IT, 1) .should.be.eventually.rejectedWith("SafeERC20: low-level call failed"); await depositBoxERC20 .connect(deployer) - .depositERC20(schainName, erc20TWFR.address, 1) + .depositERC20(schainName, erc20TWFR, 1) .should.be.eventually.rejectedWith("SafeERC20: ERC20 operation did not succeed"); }); }); @@ -303,8 +303,8 @@ describe("DepositBoxERC20", () => { it("should transfer ERC20 token", async () => { // preparation - const ercOnSchain = erc20.address; - const fakeErc20OnSchain = erc20Clone.address; + const ercOnSchain = erc20; + const fakeErc20OnSchain = erc20Clone; const amount = 10; const to = user.address; const senderFromSchain = deployer.address; @@ -319,25 +319,25 @@ describe("DepositBoxERC20", () => { const message = { data: await messages.encodeTransferErc20Message(ercOnSchain, to, amount), - destinationContract: depositBoxERC20.address, + destinationContract: depositBoxERC20, sender: senderFromSchain }; const messageWithWrongTokenAddress = { data: await messages.encodeTransferErc20Message(user2.address, to, amount), - destinationContract: depositBoxERC20.address, + destinationContract: depositBoxERC20, sender: senderFromSchain }; const messageWithNotMintedToken = { data: await messages.encodeTransferErc20Message(fakeErc20OnSchain, to, amount), - destinationContract: depositBoxERC20.address, + destinationContract: depositBoxERC20, sender: senderFromSchain }; await initializeSchain(contractManager, schainName, schainOwner.address, 1, 1); await setCommonPublicKey(contractManager, schainName); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount) + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount) .should.be.eventually.rejectedWith("Unconnected chain"); await linker @@ -351,31 +351,42 @@ describe("DepositBoxERC20", () => { await depositBoxERC20.connect(schainOwner).disableWhitelist(schainName); await erc20.connect(deployer).mint(user.address, amount * 2); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount) + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount) .should.be.eventually.rejectedWith("DepositBox was not approved for ERC20 token"); - await erc20.connect(user).approve(depositBoxERC20.address, amount * 2); + await erc20.connect(user).approve(depositBoxERC20, amount * 2); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount); + + const tx = await messageProxy + .connect(nodeAddress) + .postIncomingMessages( + schainName, 0, + [ + messageWithWrongTokenAddress, + messageWithNotMintedToken + ], + sign + ); + + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes("Given address is not a contract")); + + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(1n, ethers.toUtf8Bytes("Not enough money")); - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress, messageWithNotMintedToken], sign)).wait(); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(stringFromHex(res.events[0].args?.message), "Given address is not a contract"); - assert.equal(res.events[1].event, "PostMessageError"); - assert.equal(stringFromHex(res.events[1].args?.message), "Not enough money"); - } else { - assert(false, "No events were emitted"); - } - const balanceBefore = await deployer.getBalance(); + const balanceBefore = await ethers.provider.getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 2, [message], sign); - const balance = await deployer.getBalance(); + const balance = await ethers.provider.getBalance(deployer.address); balance.should.be.least(balanceBefore); balance.should.be.closeTo(balanceBefore, 10); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 3, [message], sign); - expect(BigNumber.from(await depositBoxERC20.transferredAmount(schainHash, erc20.address)).toString()).to.be.equal(BigNumber.from(0).toString()); + const transferredAmount = await depositBoxERC20.transferredAmount(schainHash, erc20); + expect(transferredAmount).to.be.equal(0n); (await erc20.balanceOf(user.address)).toString().should.be.equal((amount * 2).toString()); @@ -397,20 +408,20 @@ describe("DepositBoxERC20", () => { }; const message = { - data: await messages.encodeTransferErc20Message(erc20.address, to, amount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(erc20, to, amount), + destinationContract: depositBoxERC20, sender: senderFromSchain }; const messageTWR = { - data: await messages.encodeTransferErc20Message(erc20TWR.address, to, amount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(erc20TWR, to, amount), + destinationContract: depositBoxERC20, sender: senderFromSchain }; await initializeSchain(contractManager, schainName, schainOwner.address, 1, 1); await setCommonPublicKey(contractManager, schainName); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount) + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount) .should.be.eventually.rejectedWith("Unconnected chain"); await linker @@ -425,23 +436,25 @@ describe("DepositBoxERC20", () => { await erc20.connect(deployer).mint(user.address, amount * 2); await erc20TWR.connect(deployer).mint(user.address, amount * 2); - await erc20.connect(user).approve(depositBoxERC20.address, amount * 2); - await erc20TWR.connect(user).approve(depositBoxERC20.address, amount * 2); + await erc20.connect(user).approve(depositBoxERC20, amount * 2); + await erc20TWR.connect(user).approve(depositBoxERC20, amount * 2); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20TWR.address, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, erc20TWR, amount); - const balanceBefore = await deployer.getBalance(); + const balanceBefore = await ethers.provider.getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message, messageTWR], sign); - const balance = await deployer.getBalance(); + const balance = await ethers.provider.getBalance(deployer.address); balance.should.be.least(balanceBefore); balance.should.be.closeTo(balanceBefore, 10); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20.address, amount); - await depositBoxERC20.connect(user).depositERC20(schainName, erc20TWR.address, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, erc20, amount); + await depositBoxERC20.connect(user).depositERC20(schainName, erc20TWR, amount); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 2, [message, messageTWR], sign); - expect(BigNumber.from(await depositBoxERC20.transferredAmount(schainHash, erc20.address)).toString()).to.be.equal(BigNumber.from(0).toString()); - expect(BigNumber.from(await depositBoxERC20.transferredAmount(schainHash, erc20TWR.address)).toString()).to.be.equal(BigNumber.from(0).toString()); + const transferredAmount = await depositBoxERC20.transferredAmount(schainHash, erc20); + expect(transferredAmount).to.be.equal(0); + const transferredAmountTWR = await depositBoxERC20.transferredAmount(schainHash, erc20TWR); + expect(transferredAmountTWR).to.be.equal(0); (await erc20.balanceOf(user.address)).toString().should.be.equal((amount * 2).toString()); (await erc20TWR.balanceOf(user.address)).toString().should.be.equal((amount * 2).toString()); @@ -455,7 +468,7 @@ describe("DepositBoxERC20", () => { const bigAmount = 10; const timeDelay = 24 * 60 * 60; const arbitrageDuration = 30 * 24 * 60 * 60; - const ethDeposit = ethers.utils.parseEther("1"); + const ethDeposit = ethers.parseEther("1"); const randomSignature = { blsSignature: BlsSignature, counter: Counter, @@ -482,17 +495,17 @@ describe("DepositBoxERC20", () => { await token.mint(user.address, depositedAmount); await token2.mint(user.address, depositedAmount); - await token.connect(user).approve(depositBoxERC20.address, depositedAmount); - await depositBoxERC20.connect(user).depositERC20(schainName, token.address, depositedAmount); + await token.connect(user).approve(depositBoxERC20, depositedAmount); + await depositBoxERC20.connect(user).depositERC20(schainName, token, depositedAmount); - await token2.connect(user).approve(depositBoxERC20.address, depositedAmount); - await depositBoxERC20.connect(user).depositERC20(schainName, token2.address, depositedAmount); + await token2.connect(user).approve(depositBoxERC20, depositedAmount); + await depositBoxERC20.connect(user).depositERC20(schainName, token2, depositedAmount); await expect( - depositBoxERC20.connect(schainOwner).setBigTransferValue(schainName, token.address, bigAmount) + depositBoxERC20.connect(schainOwner).setBigTransferValue(schainName, token, bigAmount) ).to.emit(depositBoxERC20, "BigTransferThresholdIsChanged") - .withArgs(schainHash, token.address, 0, bigAmount); - await depositBoxERC20.connect(schainOwner).setBigTransferValue(schainName, token2.address, bigAmount); + .withArgs(schainHash, token, 0, bigAmount); + await depositBoxERC20.connect(schainOwner).setBigTransferValue(schainName, token2, bigAmount); await expect( depositBoxERC20.connect(schainOwner).setBigTransferDelay(schainName, timeDelay) ).to.emit(depositBoxERC20, "BigTransferDelayIsChanged") @@ -509,15 +522,15 @@ describe("DepositBoxERC20", () => { const balanceBefore = await token.balanceOf(user.address); const message = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; await expect( messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], randomSignature) ).to.emit(depositBoxERC20, "TransferDelayed") - .withArgs(0, user.address, token.address, bigAmount); + .withArgs(0, user.address, token, bigAmount); (await token.balanceOf(user.address)).should.be.equal(balanceBefore); @@ -530,31 +543,31 @@ describe("DepositBoxERC20", () => { await depositBoxERC20.connect(user).retrieve(); - (await token.balanceOf(user.address)).should.be.equal(balanceBefore.add(bigAmount)); + (await token.balanceOf(user.address)).should.be.equal(balanceBefore + BigInt(bigAmount)); }); it("should allow to perform arbitrage", async () => { const smallTransferOfToken1 = { - data: await messages.encodeTransferErc20Message(token.address, user.address, amount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, amount), + destinationContract: depositBoxERC20, sender: deployer.address }; const bigTransferOfToken1 = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; const smallTransferOfToken2 = { - data: await messages.encodeTransferErc20Message(token2.address, user.address, amount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token2, user.address, amount), + destinationContract: depositBoxERC20, sender: deployer.address }; const bigTransferOfToken2 = { - data: await messages.encodeTransferErc20Message(token2.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token2, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; @@ -578,18 +591,18 @@ describe("DepositBoxERC20", () => { randomSignature ); - (await depositBoxERC20.getDelayedAmount(user.address, token.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token)) .should.be.equal(4 * bigAmount); - (await depositBoxERC20.getDelayedAmount(user.address, token2.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token2)) .should.be.equal(bigAmount); - (await depositBoxERC20.getNextUnlockTimestamp(user.address, token.address)) + (await depositBoxERC20.getNextUnlockTimestamp(user.address, token)) .should.be.equal((await currentTime()) + timeDelay); - (await depositBoxERC20.getNextUnlockTimestamp(user.address, token2.address)) + (await depositBoxERC20.getNextUnlockTimestamp(user.address, token2)) .should.be.equal((await currentTime()) + timeDelay); // 2 small transfers of token 1 and 2 small transfers of token 2 must be processed without delay - (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore.add(2 * amount)); - (await token2.balanceOf(user.address)).should.be.equal(token2BalanceBefore.add(2 * amount)); + (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore + BigInt(2 * amount)); + (await token2.balanceOf(user.address)).should.be.equal(token2BalanceBefore + BigInt(2 * amount)); // #0 - big transfer of token 1 // #1 - big transfer of token 1 @@ -614,9 +627,9 @@ describe("DepositBoxERC20", () => { // transfer #2 and #3 must be unlocked await depositBoxERC20.retrieveFor(user.address); (await token.balanceOf(user.address)) - .should.be.equal(token1BalanceBefore.add(2 * amount + bigAmount)); + .should.be.equal(token1BalanceBefore + BigInt(2 * amount + bigAmount)); (await token2.balanceOf(user.address)) - .should.be.equal(token2BalanceBefore.add(2 * amount + bigAmount)); + .should.be.equal(token2BalanceBefore + BigInt(2 * amount + bigAmount)); await depositBoxERC20.rejectTransfer(suspicionsTransfers[0]) .should.be.rejectedWith("Sender is not an Schain owner"); @@ -631,18 +644,18 @@ describe("DepositBoxERC20", () => { await depositBoxERC20.connect(schainOwner).validateTransfer(suspicionsTransfers[1]) .should.be.rejectedWith("Arbitrage has to be active"); (await token.balanceOf(user.address)) - .should.be.equal(token1BalanceBefore.add(2 * amount + 2 * bigAmount)); + .should.be.equal(token1BalanceBefore + BigInt(2 * amount + 2 * bigAmount)); await skipTime(arbitrageDuration); await depositBoxERC20.connect(user).retrieve(); (await token.balanceOf(user.address)) - .should.be.equal(token1BalanceBefore.add(2 * amount + 3 * bigAmount)); + .should.be.equal(token1BalanceBefore + BigInt(2 * amount + 3 * bigAmount)); }); it("should not stuck after big amount of competed transfers", async () => { const bigTransfer = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; @@ -650,7 +663,7 @@ describe("DepositBoxERC20", () => { const amountOfCompetedTransfers = 15; // send `amountOfCompetedTransfers` + 1 big transfer - const batch = (await messageProxy.MESSAGES_LENGTH()).toNumber(); + const batch = Number(await messageProxy.MESSAGES_LENGTH()); const fullBatches = Math.floor((amountOfCompetedTransfers + 1) / batch); const rest = amountOfCompetedTransfers + 1 - fullBatches * batch; for (let i = 0; i < fullBatches; ++i) { @@ -677,35 +690,35 @@ describe("DepositBoxERC20", () => { await depositBoxERC20.connect(schainOwner).validateTransfer(completedTransfer); } - (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore.add(bigAmount * amountOfCompetedTransfers)); + (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore + BigInt(bigAmount * amountOfCompetedTransfers)); await skipTime(timeDelay); // first retrieve removes already completed transfers after an arbitrage from the queue await depositBoxERC20.retrieveFor(user.address); - (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore.add(bigAmount * amountOfCompetedTransfers)); + (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore + BigInt(bigAmount * amountOfCompetedTransfers)); // second retrieve withdraws the rest await depositBoxERC20.retrieveFor(user.address); - (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore.add(bigAmount * (amountOfCompetedTransfers + 1))); + (await token.balanceOf(user.address)).should.be.equal(token1BalanceBefore + BigInt(bigAmount * (amountOfCompetedTransfers + 1))); }); it("should not stuck if a token reverts transfer", async () => { const bigTransfer = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; const badToken = await (await ethers.getContractFactory("RevertableERC20")).deploy("Test", "TST"); await badToken.mint(user.address, bigAmount); - await badToken.connect(user).approve(depositBoxERC20.address, bigAmount); - await depositBoxERC20.connect(user).depositERC20(schainName, badToken.address, bigAmount); + await badToken.connect(user).approve(depositBoxERC20, bigAmount); + await depositBoxERC20.connect(user).depositERC20(schainName, badToken, bigAmount); const badTokenBigTransfer = { - data: await messages.encodeTransferErc20Message(badToken.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(badToken, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; @@ -724,7 +737,7 @@ describe("DepositBoxERC20", () => { depositBoxERC20.retrieveFor(user.address) ).to.emit(depositBoxERC20, "TransferSkipped") .withArgs(0); - (await token.balanceOf(user.address)).should.be.equal(balanceBefore.add(bigAmount)); + (await token.balanceOf(user.address)).should.be.equal(balanceBefore + BigInt(bigAmount)); }); it("should not allow to set too big delays", async () => { @@ -742,8 +755,8 @@ describe("DepositBoxERC20", () => { it("should disable delay for trusted receivers", async () => { const bigTransfer = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; @@ -778,14 +791,14 @@ describe("DepositBoxERC20", () => { ); (await token.balanceOf(user.address)).should.be.equal(bigAmount); - (await depositBoxERC20.getDelayedAmount(user.address, token.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token)) .should.be.equal(bigAmount); }) it("should reduce delay", async () => { const bigTransfer = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; @@ -796,7 +809,7 @@ describe("DepositBoxERC20", () => { randomSignature ); - (await depositBoxERC20.getNextUnlockTimestamp(user.address, token.address)) + (await depositBoxERC20.getNextUnlockTimestamp(user.address, token)) .should.be.equal(await currentTime() + timeDelay); @@ -810,16 +823,16 @@ describe("DepositBoxERC20", () => { randomSignature ); - (await depositBoxERC20.getNextUnlockTimestamp(user.address, token.address)) + (await depositBoxERC20.getNextUnlockTimestamp(user.address, token)) .should.be.equal(await currentTime() + lowerDelay); - (await depositBoxERC20.getDelayedAmount(user.address, token.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token)) .should.be.equal(2 * bigAmount); }); it("should process correctly in non linear order", async () => { const bigTransfer = { - data: await messages.encodeTransferErc20Message(token.address, user.address, bigAmount), - destinationContract: depositBoxERC20.address, + data: await messages.encodeTransferErc20Message(token, user.address, bigAmount), + destinationContract: depositBoxERC20, sender: deployer.address }; @@ -837,14 +850,14 @@ describe("DepositBoxERC20", () => { await depositBoxERC20.escalate(0); - (await depositBoxERC20.getNextUnlockTimestamp(user.address, token.address)) + (await depositBoxERC20.getNextUnlockTimestamp(user.address, token)) .should.be.equal(lockedUntil); await skipTime(timeDelay); await depositBoxERC20.retrieveFor(user.address); - (await depositBoxERC20.getDelayedAmount(user.address, token.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token)) .should.be.equal(bigAmount); await messageProxy.connect(nodeAddress).postIncomingMessages( @@ -857,15 +870,15 @@ describe("DepositBoxERC20", () => { ); lockedUntil = await currentTime() + timeDelay; - (await depositBoxERC20.getNextUnlockTimestamp(user.address, token.address)) + (await depositBoxERC20.getNextUnlockTimestamp(user.address, token)) .should.be.equal(lockedUntil); - (await depositBoxERC20.getDelayedAmount(user.address, token.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token)) .should.be.equal(2 * bigAmount); await skipTime(timeDelay); await depositBoxERC20.retrieveFor(user.address); - (await depositBoxERC20.getDelayedAmount(user.address, token.address)) + (await depositBoxERC20.getDelayedAmount(user.address, token)) .should.be.equal(bigAmount); (await token.balanceOf(user.address)) .should.be.equal(2 * bigAmount); diff --git a/proxy/test/DepositBoxERC721.ts b/test/DepositBoxERC721.ts similarity index 80% rename from proxy/test/DepositBoxERC721.ts rename to test/DepositBoxERC721.ts index 25d971dce..2b09e0914 100644 --- a/proxy/test/DepositBoxERC721.ts +++ b/test/DepositBoxERC721.ts @@ -34,10 +34,10 @@ import { MessagesTester, CommunityPool } from "../typechain"; -import { stringFromHex, stringKeccak256, getBalance, getPublicKey } from "./utils/helper"; +import { getBalance, getPublicKey } from "./utils/helper"; -import chai = require("chai"); -import chaiAlmost = require("chai-almost"); +import chai from "chai"; +import chaiAlmost from "chai-almost"; chai.should(); chai.use(chaiAsPromised); @@ -55,15 +55,15 @@ import { deployERC721OnChain } from "./utils/deploy/erc721OnChain"; import { deployCommunityPool } from "./utils/deploy/mainnet/communityPool"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; -import { assert, expect } from "chai"; +import { expect } from "chai"; import { createNode } from "./utils/skale-manager-utils/nodes"; -const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781") +const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -74,7 +74,7 @@ describe("DepositBoxERC721", () => { let user: SignerWithAddress; let user2: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let depositBoxERC721: DepositBoxERC721; let contractManager: ContractManager; @@ -84,18 +84,18 @@ describe("DepositBoxERC721", () => { let messages: MessagesTester; const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const schainName = "Schain"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); before(async () => { [deployer, user, user2, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - BigInt(ethers.parseEther("1"))}); }); after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - BigInt(ethers.parseEther("1"))}); }); beforeEach(async () => { @@ -105,7 +105,7 @@ describe("DepositBoxERC721", () => { depositBoxERC721 = await deployDepositBoxERC721(contractManager, linker, messageProxy); communityPool = await deployCommunityPool(contractManager, linker, messageProxy); messages = await deployMessages(); - await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker.address); + await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker); await messageProxy.grantRole(await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await initializeSchain(contractManager, schainName, user.address, 1, 1); const nodeCreationParams = { @@ -120,9 +120,9 @@ describe("DepositBoxERC721", () => { await createNode(contractManager, nodeAddress.address, nodeCreationParams); await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, user2.address, "1000000000000000000"); - await messageProxy.registerExtraContractForAll(depositBoxERC721.address); - await messageProxy.registerExtraContract(schainName, communityPool.address); - await messageProxy.registerExtraContract(schainName, linker.address); + await messageProxy.registerExtraContractForAll(depositBoxERC721); + await messageProxy.registerExtraContract(schainName, communityPool); + await messageProxy.registerExtraContract(schainName, linker); }); describe("tests with `ERC721`", async () => { @@ -147,14 +147,14 @@ describe("DepositBoxERC721", () => { // preparation const amount = 10; - await depositBoxERC721.connect(user).depositERC721(schainName, erc721.address, amount) + await depositBoxERC721.connect(user).depositERC721(schainName, erc721, amount) .should.be.eventually.rejectedWith("Unconnected chain"); }); it("should rejected with `DepositBox was not approved for ERC721 token`", async () => { // preparation const error = "DepositBox was not approved for ERC721 token"; - const contractHere = erc721OnChain.address; + const contractHere = erc721OnChain; const tokenId = 10; // the wei should be MORE than (55000 * 1000000000) // GAS_AMOUNT_POST_MESSAGE * AVERAGE_TX_PRICE constants in DepositBox.sol @@ -172,7 +172,7 @@ describe("DepositBoxERC721", () => { it("should invoke `depositERC721` without mistakes", async () => { // preparation - const contractHere = erc721OnChain.address; + const contractHere = erc721OnChain; const tokenId = 10; const tokenId2 = 11; // the wei should be MORE than (55000 * 1000000000) @@ -182,8 +182,8 @@ describe("DepositBoxERC721", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC721` - await erc721OnChain.connect(deployer).approve(depositBoxERC721.address, tokenId); - await erc721OnChain.connect(deployer).approve(depositBoxERC721.address, tokenId2); + await erc721OnChain.connect(deployer).approve(depositBoxERC721, tokenId); + await erc721OnChain.connect(deployer).approve(depositBoxERC721, tokenId2); // execution await depositBoxERC721 .connect(deployer) @@ -197,13 +197,13 @@ describe("DepositBoxERC721", () => { .depositERC721(schainName, contractHere, tokenId2)).wait(); // console.log("Gas for depositERC721:", res.receipt.gasUsed); // expectation - expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721.address); - expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721.address); + expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721); + expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721); }); it("should invoke `depositERC721Direct` without mistakes", async () => { // preparation - const contractHere = erc721OnChain.address; + const contractHere = erc721OnChain; const to = user.address; const tokenId = 10; const tokenId2 = 11; @@ -214,8 +214,8 @@ describe("DepositBoxERC721", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC721` - await erc721OnChain.connect(deployer).approve(depositBoxERC721.address, tokenId); - await erc721OnChain.connect(deployer).approve(depositBoxERC721.address, tokenId2); + await erc721OnChain.connect(deployer).approve(depositBoxERC721, tokenId); + await erc721OnChain.connect(deployer).approve(depositBoxERC721, tokenId2); // execution await depositBoxERC721 .connect(deployer) @@ -227,16 +227,16 @@ describe("DepositBoxERC721", () => { .connect(deployer) .depositERC721Direct(schainName, contractHere, tokenId, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, depositBoxERC721.address, deployer.address, data1); + .withArgs(schainHash, 0, depositBoxERC721, deployer.address, data1); await depositBoxERC721 .connect(deployer) .depositERC721Direct(schainName, contractHere, tokenId2, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 1, depositBoxERC721.address, deployer.address, data2); + .withArgs(schainHash, 1, depositBoxERC721, deployer.address, data2); // console.log("Gas for depositERC721:", res.receipt.gasUsed); // expectation - expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721.address); - expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721.address); + expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721); + expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721); }); }); @@ -247,16 +247,16 @@ describe("DepositBoxERC721", () => { await linker .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); - await erc721OnChain.connect(deployer).approve(depositBoxERC721.address, tokenId); + await erc721OnChain.connect(deployer).approve(depositBoxERC721, tokenId); await depositBoxERC721.connect(user).disableWhitelist(schainName); await depositBoxERC721 .connect(deployer) - .depositERC721(schainName, erc721OnChain.address, tokenId); - await depositBoxERC721.connect(user).getFunds(schainName, erc721OnChain.address, user.address, tokenId).should.be.eventually.rejectedWith("Schain is not killed"); + .depositERC721(schainName, erc721OnChain, tokenId); + await depositBoxERC721.connect(user).getFunds(schainName, erc721OnChain, user.address, tokenId).should.be.eventually.rejectedWith("Schain is not killed"); await linker.connect(deployer).kill(schainName); await linker.connect(user).kill(schainName); - await depositBoxERC721.connect(user).getFunds(schainName, erc721OnChain.address, user.address, tokenId2).should.be.eventually.rejectedWith("Incorrect tokenId"); - await depositBoxERC721.connect(user).getFunds(schainName, erc721OnChain.address, user.address, tokenId); + await depositBoxERC721.connect(user).getFunds(schainName, erc721OnChain, user.address, tokenId2).should.be.eventually.rejectedWith("Incorrect tokenId"); + await depositBoxERC721.connect(user).getFunds(schainName, erc721OnChain, user.address, tokenId); expect(await erc721OnChain.ownerOf(tokenId)).to.equal(user.address); }); @@ -264,13 +264,13 @@ describe("DepositBoxERC721", () => { const fakeERC721Contract = deployer.address; await depositBoxERC721.connect(user).addERC721TokenByOwner(schainName, fakeERC721Contract) .should.be.eventually.rejectedWith("Given address is not a contract"); - await depositBoxERC721.connect(deployer).addERC721TokenByOwner(schainName, erc721.address) + await depositBoxERC721.connect(deployer).addERC721TokenByOwner(schainName, erc721) .should.be.eventually.rejectedWith("Sender is not an Schain owner"); - await depositBoxERC721.connect(user).addERC721TokenByOwner(schainName, erc721.address); - await depositBoxERC721.connect(user).addERC721TokenByOwner(schainName, erc721.address).should.be.eventually.rejectedWith("ERC721 Token was already added"); - expect(await depositBoxERC721.getSchainToERC721(schainName, erc721.address)).to.be.equal(true); - expect((await depositBoxERC721.getSchainToAllERC721(schainName, 0, 1))[0]).to.be.equal(erc721.address); + await depositBoxERC721.connect(user).addERC721TokenByOwner(schainName, erc721); + await depositBoxERC721.connect(user).addERC721TokenByOwner(schainName, erc721).should.be.eventually.rejectedWith("ERC721 Token was already added"); + expect(await depositBoxERC721.getSchainToERC721(schainName, erc721)).to.be.equal(true); + expect((await depositBoxERC721.getSchainToAllERC721(schainName, 0, 1))[0]).to.be.equal(erc721); expect((await depositBoxERC721.getSchainToAllERC721(schainName, 0, 1)).length).to.be.equal(1); expect((await depositBoxERC721.getSchainToAllERC721Length(schainName)).toString()).to.be.equal("1"); await depositBoxERC721.getSchainToAllERC721(schainName, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); @@ -282,7 +282,7 @@ describe("DepositBoxERC721", () => { let erc721: ERC721OnChain; let weiAmount: string; let sign: { - blsSignature: [BigNumber, BigNumber], + blsSignature: [BigNumberish, BigNumberish], counter: number, hashA: string, hashB: string, @@ -317,13 +317,13 @@ describe("DepositBoxERC721", () => { const senderFromSchain = deployer.address; const message = { - data: await messages.encodeTransferErc721Message(erc721.address, to, tokenId), - destinationContract: depositBoxERC721.address, + data: await messages.encodeTransferErc721Message(erc721, to, tokenId), + destinationContract: depositBoxERC721, sender: senderFromSchain }; await erc721.connect(deployer).mint(deployer.address, tokenId); - await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721.address, tokenId); + await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721, tokenId); const balanceBefore = await getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); @@ -342,20 +342,17 @@ describe("DepositBoxERC721", () => { const messageWithWrongTokenAddress = { data: await messages.encodeTransferErc721Message(user2.address, to, tokenId), - destinationContract: depositBoxERC721.address, + destinationContract: depositBoxERC721, sender: senderFromSchain }; await erc721.connect(deployer).mint(deployer.address, tokenId); - await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721.address, tokenId); - - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign)).wait(); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(stringFromHex(res.events[0].args?.message), "Given address is not a contract"); - } else { - assert(false, "No events were emitted"); - } + await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721, tokenId); + + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes("Given address is not a contract")); }); it("should revert `Incorrect tokenId`", async () => { @@ -364,20 +361,17 @@ describe("DepositBoxERC721", () => { const senderFromSchain = deployer.address; const messageWithWrongTokenAddress = { - data: await messages.encodeTransferErc721Message(erc721.address, to, tokenId), - destinationContract: depositBoxERC721.address, + data: await messages.encodeTransferErc721Message(erc721, to, tokenId), + destinationContract: depositBoxERC721, sender: senderFromSchain }; await erc721.connect(deployer).mint(deployer.address, tokenId); - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign)).wait(); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(stringFromHex(res.events[0].args?.message), "Incorrect tokenId"); - } else { - assert(false, "No events were emitted"); - } + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes("Incorrect tokenId")); }); it("should transfer ERC721 token", async () => { @@ -388,23 +382,23 @@ describe("DepositBoxERC721", () => { const senderFromSchain = deployer.address; const message = { - data: await messages.encodeTransferErc721Message(erc721.address, to, tokenId), - destinationContract: depositBoxERC721.address, + data: await messages.encodeTransferErc721Message(erc721, to, tokenId), + destinationContract: depositBoxERC721, sender: senderFromSchain }; await erc721.mint(deployer.address, tokenId); - await erc721.approve(depositBoxERC721.address, tokenId); + await erc721.approve(depositBoxERC721, tokenId); await depositBoxERC721 - .depositERC721(schainName, erc721.address, tokenId); + .depositERC721(schainName, erc721, tokenId); const balanceBefore = await getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); const balance = await getBalance(deployer.address); balance.should.not.be.lessThan(balanceBefore); balance.should.be.almost(balanceBefore); - expect(await depositBoxERC721.transferredAmount(erc721.address, tokenId)).to.be.equal(zeroHash); + expect(await depositBoxERC721.transferredAmount(erc721, tokenId)).to.be.equal(zeroHash); (await erc721.ownerOf(tokenId)).should.be.equal(user.address); }); diff --git a/proxy/test/DepositBoxERC721WithMetadata.ts b/test/DepositBoxERC721WithMetadata.ts similarity index 82% rename from proxy/test/DepositBoxERC721WithMetadata.ts rename to test/DepositBoxERC721WithMetadata.ts index 3d9d67463..31695346e 100644 --- a/proxy/test/DepositBoxERC721WithMetadata.ts +++ b/test/DepositBoxERC721WithMetadata.ts @@ -34,10 +34,10 @@ import { MessagesTester, CommunityPool } from "../typechain"; -import { stringFromHex, stringKeccak256, getBalance, getPublicKey } from "./utils/helper"; +import { getBalance, getPublicKey } from "./utils/helper"; -import chai = require("chai"); -import chaiAlmost = require("chai-almost"); +import chai from "chai"; +import chaiAlmost from "chai-almost"; chai.should(); chai.use(chaiAsPromised); @@ -55,15 +55,15 @@ import { deployERC721OnChain } from "./utils/deploy/erc721OnChain"; import { deployCommunityPool } from "./utils/deploy/mainnet/communityPool"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; -import { assert, expect } from "chai"; +import { expect } from "chai"; import { createNode } from "./utils/skale-manager-utils/nodes"; -const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781") +const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -74,7 +74,7 @@ describe("DepositBoxERC721WithMetadata", () => { let user: SignerWithAddress; let user2: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let depositBoxERC721WithMetadata: DepositBoxERC721WithMetadata; let contractManager: ContractManager; @@ -84,18 +84,18 @@ describe("DepositBoxERC721WithMetadata", () => { let messages: MessagesTester; const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const schainName = "Schain"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); before(async () => { [deployer, user, user2, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - BigInt(ethers.parseEther("1"))}); }); after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - BigInt(ethers.parseEther("1"))}); }); beforeEach(async () => { @@ -105,7 +105,7 @@ describe("DepositBoxERC721WithMetadata", () => { depositBoxERC721WithMetadata = await deployDepositBoxERC721WithMetadata(contractManager, linker, messageProxy); communityPool = await deployCommunityPool(contractManager, linker, messageProxy); messages = await deployMessages(); - await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker.address); + await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker); await messageProxy.grantRole(await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await initializeSchain(contractManager, schainName, user.address, 1, 1); const nodeCreationParams = { @@ -120,9 +120,9 @@ describe("DepositBoxERC721WithMetadata", () => { await createNode(contractManager, nodeAddress.address, nodeCreationParams); await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, user2.address, "1000000000000000000"); - await messageProxy.registerExtraContractForAll(depositBoxERC721WithMetadata.address); - await messageProxy.registerExtraContract(schainName, communityPool.address); - await messageProxy.registerExtraContract(schainName, linker.address); + await messageProxy.registerExtraContractForAll(depositBoxERC721WithMetadata); + await messageProxy.registerExtraContract(schainName, communityPool); + await messageProxy.registerExtraContract(schainName, linker); }); describe("tests with `ERC721`", async () => { @@ -151,14 +151,14 @@ describe("DepositBoxERC721WithMetadata", () => { // preparation const amount = 10; - await depositBoxERC721WithMetadata.connect(user).depositERC721(schainName, erc721.address, amount) + await depositBoxERC721WithMetadata.connect(user).depositERC721(schainName, erc721, amount) .should.be.eventually.rejectedWith("Unconnected chain"); }); it("should rejected with `DepositBox was not approved for ERC721 token`", async () => { // preparation const error = "DepositBox was not approved for ERC721 token"; - const contractHere = erc721OnChain.address; + const contractHere = erc721OnChain; const tokenId = 10; // the wei should be MORE than (55000 * 1000000000) // GAS_AMOUNT_POST_MESSAGE * AVERAGE_TX_PRICE constants in DepositBox.sol @@ -176,7 +176,7 @@ describe("DepositBoxERC721WithMetadata", () => { it("should invoke `depositERC721` without mistakes", async () => { // preparation - const contractHere = erc721OnChain.address; + const contractHere = erc721OnChain; const tokenId = 10; const tokenId2 = 11; // the wei should be MORE than (55000 * 1000000000) @@ -186,8 +186,8 @@ describe("DepositBoxERC721WithMetadata", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC721WithMetadata` - await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata.address, tokenId); - await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata.address, tokenId2); + await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata, tokenId); + await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata, tokenId2); // execution await depositBoxERC721WithMetadata .connect(deployer) @@ -201,13 +201,13 @@ describe("DepositBoxERC721WithMetadata", () => { .depositERC721(schainName, contractHere, tokenId2)).wait(); // console.log("Gas for depositERC721:", res.receipt.gasUsed); // expectation - expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721WithMetadata.address); - expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721WithMetadata.address); + expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721WithMetadata); + expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721WithMetadata); }); it("should invoke `depositERC721Direct` without mistakes", async () => { // preparation - const contractHere = erc721OnChain.address; + const contractHere = erc721OnChain; const to = user.address; const tokenId = 10; const tokenId2 = 11; @@ -218,8 +218,8 @@ describe("DepositBoxERC721WithMetadata", () => { .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); // transfer tokenId from `deployer` to `depositBoxERC721` - await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata.address, tokenId); - await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata.address, tokenId2); + await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata, tokenId); + await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata, tokenId2); // execution await depositBoxERC721WithMetadata .connect(deployer) @@ -231,16 +231,16 @@ describe("DepositBoxERC721WithMetadata", () => { .connect(deployer) .depositERC721Direct(schainName, contractHere, tokenId, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, depositBoxERC721WithMetadata.address, deployer.address, data1); + .withArgs(schainHash, 0, depositBoxERC721WithMetadata, deployer.address, data1); await depositBoxERC721WithMetadata .connect(deployer) .depositERC721Direct(schainName, contractHere, tokenId2, to) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 1, depositBoxERC721WithMetadata.address, deployer.address, data2); + .withArgs(schainHash, 1, depositBoxERC721WithMetadata, deployer.address, data2); // console.log("Gas for depositERC721:", res.receipt.gasUsed); // expectation - expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721WithMetadata.address); - expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721WithMetadata.address); + expect(await erc721OnChain.ownerOf(tokenId)).to.equal(depositBoxERC721WithMetadata); + expect(await erc721OnChain.ownerOf(tokenId2)).to.equal(depositBoxERC721WithMetadata); }); }); @@ -251,16 +251,16 @@ describe("DepositBoxERC721WithMetadata", () => { await linker .connect(deployer) .connectSchain(schainName, [deployer.address, deployer.address, deployer.address]); - await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata.address, tokenId); + await erc721OnChain.connect(deployer).approve(depositBoxERC721WithMetadata, tokenId); await depositBoxERC721WithMetadata.connect(user).disableWhitelist(schainName); await depositBoxERC721WithMetadata .connect(deployer) - .depositERC721(schainName, erc721OnChain.address, tokenId); - await depositBoxERC721WithMetadata.connect(user).getFunds(schainName, erc721OnChain.address, user.address, tokenId).should.be.eventually.rejectedWith("Schain is not killed"); + .depositERC721(schainName, erc721OnChain, tokenId); + await depositBoxERC721WithMetadata.connect(user).getFunds(schainName, erc721OnChain, user.address, tokenId).should.be.eventually.rejectedWith("Schain is not killed"); await linker.connect(deployer).kill(schainName); await linker.connect(user).kill(schainName); - await depositBoxERC721WithMetadata.connect(user).getFunds(schainName, erc721OnChain.address, user.address, tokenId2).should.be.eventually.rejectedWith("Incorrect tokenId"); - await depositBoxERC721WithMetadata.connect(user).getFunds(schainName, erc721OnChain.address, user.address, tokenId); + await depositBoxERC721WithMetadata.connect(user).getFunds(schainName, erc721OnChain, user.address, tokenId2).should.be.eventually.rejectedWith("Incorrect tokenId"); + await depositBoxERC721WithMetadata.connect(user).getFunds(schainName, erc721OnChain, user.address, tokenId); expect(await erc721OnChain.ownerOf(tokenId)).to.equal(user.address); }); @@ -268,13 +268,13 @@ describe("DepositBoxERC721WithMetadata", () => { const fakeERC721Contract = deployer.address; await depositBoxERC721WithMetadata.connect(user).addERC721TokenByOwner(schainName, fakeERC721Contract) .should.be.eventually.rejectedWith("Given address is not a contract"); - await depositBoxERC721WithMetadata.connect(deployer).addERC721TokenByOwner(schainName, erc721.address) + await depositBoxERC721WithMetadata.connect(deployer).addERC721TokenByOwner(schainName, erc721) .should.be.eventually.rejectedWith("Sender is not an Schain owner"); - await depositBoxERC721WithMetadata.connect(user).addERC721TokenByOwner(schainName, erc721.address); - await depositBoxERC721WithMetadata.connect(user).addERC721TokenByOwner(schainName, erc721.address).should.be.eventually.rejectedWith("ERC721 Token was already added"); - expect(await depositBoxERC721WithMetadata.getSchainToERC721(schainName, erc721.address)).to.be.equal(true); - expect((await depositBoxERC721WithMetadata.getSchainToAllERC721(schainName, 0, 1))[0]).to.be.equal(erc721.address); + await depositBoxERC721WithMetadata.connect(user).addERC721TokenByOwner(schainName, erc721); + await depositBoxERC721WithMetadata.connect(user).addERC721TokenByOwner(schainName, erc721).should.be.eventually.rejectedWith("ERC721 Token was already added"); + expect(await depositBoxERC721WithMetadata.getSchainToERC721(schainName, erc721)).to.be.equal(true); + expect((await depositBoxERC721WithMetadata.getSchainToAllERC721(schainName, 0, 1))[0]).to.be.equal(erc721); expect((await depositBoxERC721WithMetadata.getSchainToAllERC721(schainName, 0, 1)).length).to.be.equal(1); expect((await depositBoxERC721WithMetadata.getSchainToAllERC721Length(schainName)).toString()).to.be.equal("1"); await depositBoxERC721WithMetadata.getSchainToAllERC721(schainName, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); @@ -286,7 +286,7 @@ describe("DepositBoxERC721WithMetadata", () => { let erc721: ERC721OnChain; let weiAmount: string; let sign: { - blsSignature: [BigNumber, BigNumber], + blsSignature: [BigNumberish, BigNumberish], counter: number, hashA: string, hashB: string, @@ -322,14 +322,14 @@ describe("DepositBoxERC721WithMetadata", () => { const senderFromSchain = deployer.address; const message = { - data: await messages.encodeTransferErc721MessageWithMetadata(erc721.address, to, tokenId, tokenURI), - destinationContract: depositBoxERC721WithMetadata.address, + data: await messages.encodeTransferErc721MessageWithMetadata(erc721, to, tokenId, tokenURI), + destinationContract: depositBoxERC721WithMetadata, sender: senderFromSchain }; await erc721.connect(deployer).mint(deployer.address, tokenId); await erc721.connect(deployer).setTokenURI(tokenId, tokenURI); - await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721WithMetadata.address, tokenId); + await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721WithMetadata, tokenId); const balanceBefore = await getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); @@ -350,21 +350,18 @@ describe("DepositBoxERC721WithMetadata", () => { const messageWithWrongTokenAddress = { data: await messages.encodeTransferErc721MessageWithMetadata(user2.address, to, tokenId, tokenURI), - destinationContract: depositBoxERC721WithMetadata.address, + destinationContract: depositBoxERC721WithMetadata, sender: senderFromSchain }; await erc721.connect(deployer).mint(deployer.address, tokenId); await erc721.connect(deployer).setTokenURI(tokenId, tokenURI); - await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721WithMetadata.address, tokenId); - - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign)).wait(); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(stringFromHex(res.events[0].args?.message), "Given address is not a contract"); - } else { - assert(false, "No events were emitted"); - } + await erc721.connect(deployer).transferFrom(deployer.address, depositBoxERC721WithMetadata, tokenId); + + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes("Given address is not a contract")); }); it("should revert `Incorrect tokenId`", async () => { @@ -374,21 +371,18 @@ describe("DepositBoxERC721WithMetadata", () => { const senderFromSchain = deployer.address; const messageWithWrongTokenAddress = { - data: await messages.encodeTransferErc721MessageWithMetadata(erc721.address, to, tokenId, tokenURI), - destinationContract: depositBoxERC721WithMetadata.address, + data: await messages.encodeTransferErc721MessageWithMetadata(erc721, to, tokenId, tokenURI), + destinationContract: depositBoxERC721WithMetadata, sender: senderFromSchain }; await erc721.connect(deployer).mint(deployer.address, tokenId); await erc721.connect(deployer).setTokenURI(tokenId, tokenURI); - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign)).wait(); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(stringFromHex(res.events[0].args?.message), "Incorrect tokenId"); - } else { - assert(false, "No events were emitted"); - } + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [messageWithWrongTokenAddress], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes("Incorrect tokenId")); }); it("should transfer ERC721 token", async () => { @@ -400,24 +394,24 @@ describe("DepositBoxERC721WithMetadata", () => { const senderFromSchain = deployer.address; const message = { - data: await messages.encodeTransferErc721MessageWithMetadata(erc721.address, to, tokenId, tokenURI), - destinationContract: depositBoxERC721WithMetadata.address, + data: await messages.encodeTransferErc721MessageWithMetadata(erc721, to, tokenId, tokenURI), + destinationContract: depositBoxERC721WithMetadata, sender: senderFromSchain }; await erc721.mint(deployer.address, tokenId); await erc721.connect(deployer).setTokenURI(tokenId, tokenURI); - await erc721.approve(depositBoxERC721WithMetadata.address, tokenId); + await erc721.approve(depositBoxERC721WithMetadata, tokenId); await depositBoxERC721WithMetadata - .depositERC721(schainName, erc721.address, tokenId); + .depositERC721(schainName, erc721, tokenId); const balanceBefore = await getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); const balance = await getBalance(deployer.address); balance.should.not.be.lessThan(balanceBefore); balance.should.be.almost(balanceBefore); - expect(await depositBoxERC721WithMetadata.transferredAmount(erc721.address, tokenId)).to.be.equal(zeroHash); + expect(await depositBoxERC721WithMetadata.transferredAmount(erc721, tokenId)).to.be.equal(zeroHash); (await erc721.ownerOf(tokenId)).should.be.equal(user.address); (await erc721.tokenURI(tokenId)).should.be.equal(tokenURI); diff --git a/proxy/test/DepositBoxEth.ts b/test/DepositBoxEth.ts similarity index 76% rename from proxy/test/DepositBoxEth.ts rename to test/DepositBoxEth.ts index 617d9c740..3e38e659d 100644 --- a/proxy/test/DepositBoxEth.ts +++ b/test/DepositBoxEth.ts @@ -33,10 +33,10 @@ import { MessagesTester, CommunityPool } from "../typechain"; -import { stringKeccak256, getBalance, getPublicKey } from "./utils/helper"; +import { getBalance, getPublicKey } from "./utils/helper"; -import chai = require("chai"); -import chaiAlmost = require("chai-almost"); +import chai from "chai"; +import chaiAlmost from "chai-almost"; chai.should(); chai.use(chaiAsPromised); @@ -54,30 +54,33 @@ import { deployCommunityPool } from "./utils/deploy/mainnet/communityPool"; import { deployFallbackEthTester } from "./utils/deploy/test/fallbackEthTester"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, ContractTransaction, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, ContractTransactionResponse, HDNodeWallet, Wallet } from "ethers"; -import { assert, expect } from "chai"; +import { expect } from "chai"; import { createNode } from "./utils/skale-manager-utils/nodes"; -const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781") +const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; const Counter = 0; -const weiTolerance = ethers.utils.parseEther("0.002").toNumber(); +const weiTolerance = Number(ethers.parseEther("0.002")); -async function reimbursed(transaction: ContractTransaction, operation?: string) { +async function reimbursed(transaction: ContractTransactionResponse, operation?: string) { const receipt = await transaction.wait(); + if (!receipt) { + throw new Error("Transaction failed"); + } const sender = transaction.from; - const balanceBefore = await ethers.provider.getBalance(sender, receipt.blockNumber - 1); + const balanceBefore = await ethers.provider.getBalance(sender, (receipt.blockNumber ?? 1) - 1); const balanceAfter = await ethers.provider.getBalance(sender, receipt.blockNumber); - if (balanceAfter.lt(balanceBefore)) { - const shortageEth = balanceBefore.sub(balanceAfter); - const shortageGas = shortageEth.div(receipt.effectiveGasPrice); + if (balanceAfter < balanceBefore) { + const shortageEth = balanceBefore - balanceAfter; + const shortageGas = shortageEth / transaction.gasPrice; console.log("Reimbursement failed.") console.log(`${shortageGas.toString()} gas units was not reimbursed`); @@ -95,7 +98,7 @@ describe("DepositBoxEth", () => { let user: SignerWithAddress; let user2: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let depositBoxEth: DepositBoxEth; let contractManager: ContractManager; @@ -105,18 +108,18 @@ describe("DepositBoxEth", () => { let messages: MessagesTester; const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const schainName = "Schain"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); before(async () => { [deployer, user, user2, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - BigInt(ethers.parseEther("1"))}); }); after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - BigInt(ethers.parseEther("1"))}); }); beforeEach(async () => { @@ -126,7 +129,7 @@ describe("DepositBoxEth", () => { depositBoxEth = await deployDepositBoxEth(contractManager, linker, messageProxy); communityPool = await deployCommunityPool(contractManager, linker, messageProxy); messages = await deployMessages(); - await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker.address); + await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker); await messageProxy.grantRole(await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await initializeSchain(contractManager, schainName, user.address, 1, 1); const nodeCreationParams = { @@ -141,9 +144,9 @@ describe("DepositBoxEth", () => { await createNode(contractManager, nodeAddress.address, nodeCreationParams); await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, user2.address, "1000000000000000000"); - await messageProxy.registerExtraContractForAll(depositBoxEth.address); - await messageProxy.registerExtraContract(schainName, communityPool.address); - await messageProxy.registerExtraContract(schainName, linker.address); + await messageProxy.registerExtraContractForAll(depositBoxEth); + await messageProxy.registerExtraContract(schainName, communityPool); + await messageProxy.registerExtraContract(schainName, linker); }); describe("tests for `deposit` function", async () => { @@ -184,7 +187,7 @@ describe("DepositBoxEth", () => { .connect(deployer) .deposit(schainName, { value: wei }); - const lockAndDataBalance = await ethers.provider.getBalance(depositBoxEth.address); + const lockAndDataBalance = await ethers.provider.getBalance(depositBoxEth); // expectation expect(lockAndDataBalance).to.equal(wei); }); @@ -206,9 +209,9 @@ describe("DepositBoxEth", () => { .connect(deployer) .depositDirect(schainName, user.address, { value: wei }) .should.emit(messageProxy, "OutgoingMessage") - .withArgs(schainHash, 0, depositBoxEth.address, deployer.address, data); + .withArgs(schainHash, 0, depositBoxEth, deployer.address, data); - const lockAndDataBalance = await ethers.provider.getBalance(depositBoxEth.address); + const lockAndDataBalance = await ethers.provider.getBalance(depositBoxEth); // expectation expect(lockAndDataBalance).to.equal(wei); }); @@ -217,7 +220,7 @@ describe("DepositBoxEth", () => { // preparation const error = "Use deposit function"; // execution/expectation - await deployer.sendTransaction({to: depositBoxEth.address, value: ethers.utils.parseEther("1") }) + await deployer.sendTransaction({to: depositBoxEth, value: ethers.parseEther("1") }) .should.be.eventually.rejectedWith(error); }); @@ -238,7 +241,8 @@ describe("DepositBoxEth", () => { await depositBoxEth.connect(user).getFunds(schainName, user.address, wei).should.be.eventually.rejectedWith("Sender is not an Schain owner"); const userBalanceBefore = await ethers.provider.getBalance(user.address); await depositBoxEth.connect(user2).getFunds(schainName, user.address, wei); - expect(BigNumber.from(await ethers.provider.getBalance(user.address)).toString()).to.equal(BigNumber.from(userBalanceBefore).add(BigNumber.from(wei)).toString()); + const userBalance = await ethers.provider.getBalance(user.address); + expect(userBalance).to.equal(userBalanceBefore + BigInt(wei)); }); }); @@ -253,7 +257,7 @@ describe("DepositBoxEth", () => { // execution/expectation await depositBoxEth .connect(user) - .postMessage(stringKeccak256(schainName), sender, bytesData) + .postMessage(schainHash, sender, bytesData) .should.be.eventually.rejectedWith(error); }); @@ -275,7 +279,7 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain }; // redeploy depositBoxEth with `developer` address instead `messageProxyForMainnet.address` @@ -289,16 +293,10 @@ describe("DepositBoxEth", () => { .rechargeUserWallet(schainName, user.address, { value: wei }); // execution - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign)).wait(); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(res.events[0].args?.msgCounter.toString(), "0"); - const messageError = res.events[0].args?.message.toString(); - assert.equal(Buffer.from(messageError.slice(2), 'hex').toString(), error); - } else { - assert(false, "No events were emitted"); - } - // assert.equal(res.logs[0].args.message, "PostMessageError"); + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes(error)); }); it("should rejected with message `Not enough money to finish this transaction` when " @@ -319,7 +317,7 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain }; // redeploy depositBoxEth with `developer` address instead `messageProxyForMainnet.address` @@ -333,16 +331,10 @@ describe("DepositBoxEth", () => { .connect(user) .rechargeUserWallet(schainName, user.address, { value: wei }); // execution - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign)).wait(); - - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(res.events[0].args?.msgCounter.toString(), "0"); - const messageError = res.events[0].args?.message.toString(); - assert.equal(Buffer.from(messageError.slice(2), 'hex').toString(), error); - } else { - assert(false, "No events were emitted"); - } + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes(error)); }); it("should rejected with message `Not enough money to finish this transaction`", async () => { @@ -371,23 +363,17 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain }; // redeploy depositBoxEth with `developer` address instead `messageProxyForMainnet.address` // to avoid `Incorrect sender` error // await lockAndDataForMainnet.setContract("MessageProxy", deployer); // execution - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign)).wait(); - - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(res.events[0].args?.msgCounter.toString(), "0"); - const messageError = res.events[0].args?.message.toString(); - assert.equal(Buffer.from(messageError.slice(2), 'hex').toString(), error); - } else { - assert(false, "No events were emitted"); - } + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes(error)); }); it("should rejected with message `null`", async () => { @@ -414,7 +400,7 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain, }; // redeploy depositBoxEth with `developer` address instead `messageProxyForMainnet.address` @@ -425,15 +411,10 @@ describe("DepositBoxEth", () => { .connect(deployer) .deposit(schainName, { value: wei }); // execution - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign)).wait(); - - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(res.events[0].args?.msgCounter.toString(), "0"); - assert.equal(res.events[0].args?.message, "0x"); - } else { - assert(false, "No events were emitted"); - } + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(0n, ethers.toUtf8Bytes("")); }); it("should transfer eth", async () => { @@ -453,7 +434,7 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain, }; @@ -472,7 +453,7 @@ describe("DepositBoxEth", () => { .connect(deployer) .deposit(schainName, { value: wei }); - expect(BigNumber.from(await depositBoxEth.transferredAmount(schainHash)).toString()).to.be.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.transferredAmount(schainHash)).to.be.equal(wei); const balanceBefore = await getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); @@ -502,7 +483,7 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain, }; @@ -524,7 +505,7 @@ describe("DepositBoxEth", () => { .connect(deployer) .deposit(schainName, { value: wei }); - expect(BigNumber.from(await depositBoxEth.transferredAmount(schainHash)).toString()).to.be.equal(BigNumber.from(wei).mul(2).toString()); + expect(await depositBoxEth.transferredAmount(schainHash)).to.be.equal(BigInt(wei) * 2n); const balanceBefore = await getBalance(deployer.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign); @@ -532,12 +513,12 @@ describe("DepositBoxEth", () => { balance.should.not.be.lessThan(balanceBefore); balance.should.be.almost(balanceBefore); - expect(BigNumber.from(await depositBoxEth.approveTransfers(user.address)).toString()).to.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.approveTransfers(user.address)).to.equal(BigInt(wei)); await depositBoxEth.connect(user2).getMyEth() .should.be.eventually.rejectedWith("User has insufficient ETH"); - expect(BigNumber.from(await depositBoxEth.approveTransfers(user.address)).toString()).to.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.approveTransfers(user.address)).to.equal(wei); expect(await depositBoxEth.activeEthTransfers(schainHash)).to.be.equal(false); await depositBoxEth.connect(user2).enableActiveEthTransfers(schainName).should.be.rejectedWith("Sender is not an Schain owner"); @@ -550,11 +531,11 @@ describe("DepositBoxEth", () => { const userBalanceBefore = await ethers.provider.getBalance(user.address); await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 1, [message], sign); - expect(BigNumber.from(await ethers.provider.getBalance(user.address)).toString()).to.equal(BigNumber.from(userBalanceBefore).add(BigNumber.from(wei)).toString()); + expect(await ethers.provider.getBalance(user.address)).to.equal(userBalanceBefore + BigInt(wei)); - expect(BigNumber.from(await depositBoxEth.approveTransfers(user.address)).toString()).to.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.approveTransfers(user.address)).to.equal(wei); await depositBoxEth.connect(user).getMyEth(); - expect(BigNumber.from(await depositBoxEth.approveTransfers(user.address)).toString()).to.equal(BigNumber.from(0).toString()); + expect(await depositBoxEth.approveTransfers(user.address)).to.equal("0"); await depositBoxEth.connect(user).getMyEth() .should.be.eventually.rejectedWith("User has insufficient ETH"); }); @@ -565,7 +546,7 @@ describe("DepositBoxEth", () => { const wei = "30000000000000000"; const fallbackEthTester = await deployFallbackEthTester(depositBoxEth, communityPool, schainName); - const bytesData = await messages.encodeTransferEthMessage(fallbackEthTester.address, wei); + const bytesData = await messages.encodeTransferEthMessage(fallbackEthTester, wei); await setCommonPublicKey(contractManager, schainName); @@ -578,7 +559,7 @@ describe("DepositBoxEth", () => { const message = { data: bytesData, - destinationContract: depositBoxEth.address, + destinationContract: depositBoxEth, sender: senderFromSchain, }; @@ -600,16 +581,16 @@ describe("DepositBoxEth", () => { .connect(deployer) .deposit(schainName, { value: wei }); - expect(BigNumber.from(await depositBoxEth.transferredAmount(schainHash)).toString()).to.be.equal(BigNumber.from(wei).mul(2).toString()); + expect(await depositBoxEth.transferredAmount(schainHash)).to.be.equal(BigInt(wei) * 2n); await reimbursed(await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 0, [message], sign)); - expect(BigNumber.from(await depositBoxEth.approveTransfers(fallbackEthTester.address)).toString()).to.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.approveTransfers(fallbackEthTester)).to.equal(wei); await depositBoxEth.connect(user2).getMyEth() .should.be.eventually.rejectedWith("User has insufficient ETH"); - expect(BigNumber.from(await depositBoxEth.approveTransfers(fallbackEthTester.address)).toString()).to.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.approveTransfers(fallbackEthTester)).to.equal(wei); expect(await depositBoxEth.activeEthTransfers(schainHash)).to.be.equal(false); await depositBoxEth.connect(user2).enableActiveEthTransfers(schainName).should.be.rejectedWith("Sender is not an Schain owner"); @@ -619,23 +600,18 @@ describe("DepositBoxEth", () => { await depositBoxEth.connect(deployer).enableActiveEthTransfers(schainName).should.be.eventually.rejectedWith("Active eth transfers enabled"); expect(await depositBoxEth.activeEthTransfers(schainHash)).to.be.equal(true); - await ethers.provider.getBalance(fallbackEthTester.address); + await ethers.provider.getBalance(fallbackEthTester); + + const tx = await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 1, [message], sign); - const res = await (await messageProxy.connect(nodeAddress).postIncomingMessages(schainName, 1, [message], sign)).wait(); + await expect(tx) + .to.emit(messageProxy, "PostMessageError") + .withArgs(1n, ethers.toUtf8Bytes("Address: unable to send value, recipient may have reverted")); - if (res.events) { - assert.equal(res.events[0].event, "PostMessageError"); - assert.equal(res.events[0].args?.msgCounter.toString(), "1"); - const messageError = res.events[0].args?.message.toString(); - const error = "Address: unable to send value, recipient may have reverted"; - assert.equal(Buffer.from(messageError.slice(2), 'hex').toString(), error); - } else { - assert(false, "No events were emitted"); - } - expect(BigNumber.from(await depositBoxEth.approveTransfers(fallbackEthTester.address)).toString()).to.equal(BigNumber.from(wei).toString()); + expect(await depositBoxEth.approveTransfers(fallbackEthTester)).to.equal(wei); await fallbackEthTester.connect(user).getMyEth(); - expect(BigNumber.from(await depositBoxEth.approveTransfers(fallbackEthTester.address)).toString()).to.equal(BigNumber.from(0).toString()); + expect(await depositBoxEth.approveTransfers(fallbackEthTester)).to.equal("0"); await fallbackEthTester.connect(user).getMyEth() .should.be.eventually.rejectedWith("User has insufficient ETH"); }); diff --git a/proxy/test/ERC20OnChain.ts b/test/ERC20OnChain.ts similarity index 82% rename from proxy/test/ERC20OnChain.ts rename to test/ERC20OnChain.ts index a2c495725..7ed00c242 100644 --- a/proxy/test/ERC20OnChain.ts +++ b/test/ERC20OnChain.ts @@ -1,5 +1,5 @@ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ERC20OnChain } from "../typechain"; @@ -10,8 +10,7 @@ chai.use(chaiAsPromised); import { deployERC20OnChain } from "./utils/deploy/erc20OnChain"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; describe("ERC20OnChain", () => { @@ -36,7 +35,7 @@ describe("ERC20OnChain", () => { await eRC20OnChain.connect(deployer).mint(account, value); // expectation const balance = await eRC20OnChain.balanceOf(account); - parseInt(BigNumber.from(balance).toString(), 10).should.be.equal(value); + balance.should.be.equal(value); }); it("should invoke `burn`", async () => { @@ -49,7 +48,7 @@ describe("ERC20OnChain", () => { await eRC20OnChain.connect(deployer).burn(amount); // expectation const balance = await eRC20OnChain.balanceOf(deployer.address); - parseInt(BigNumber.from(balance).toString(), 10).should.be.equal(mintAmount - amount); + balance.should.be.equal(mintAmount - amount); }); it("should invoke `burnFrom`", async () => { @@ -65,6 +64,6 @@ describe("ERC20OnChain", () => { await eRC20OnChain.connect(deployer).burnFrom(account, amount); // expectation const balance = await eRC20OnChain.balanceOf(account); - parseInt(BigNumber.from(balance).toString(), 10).should.be.equal(mintAmount - amount); + balance.should.be.equal(mintAmount - amount); }); }); diff --git a/proxy/test/ERC721OnChain.ts b/test/ERC721OnChain.ts similarity index 90% rename from proxy/test/ERC721OnChain.ts rename to test/ERC721OnChain.ts index 0a4692394..0a6d6d052 100644 --- a/proxy/test/ERC721OnChain.ts +++ b/test/ERC721OnChain.ts @@ -1,5 +1,5 @@ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ERC721OnChain } from "../typechain"; @@ -10,7 +10,7 @@ chai.use(chaiAsPromised); import { deployERC721OnChain } from "./utils/deploy/erc721OnChain"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; @@ -52,7 +52,7 @@ describe("ERC721OnChain", () => { it("should reject with `ERC721Burnable: caller is not owner nor approved` when invoke `burn`", async () => { // preparation - const error = "ERC721: caller is not token owner nor approved"; + const error = "ERC721: caller is not token owner or approved"; const tokenId = 55; const account = user; // mint to avoid `owner query for nonexistent token` error @@ -70,7 +70,7 @@ describe("ERC721OnChain", () => { // execution const res = await (await eRC721OnChain.connect(deployer).setTokenURI(tokenId, tokenURI)).wait(); // expectation - expect(res.status).to.be.equal(1); + expect(res?.status).to.be.equal(1); }); }); diff --git a/proxy/test/Linker.ts b/test/Linker.ts similarity index 73% rename from proxy/test/Linker.ts rename to test/Linker.ts index 74993c43b..fd2dab703 100644 --- a/proxy/test/Linker.ts +++ b/test/Linker.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ContractManager, DepositBoxEth, @@ -33,7 +33,6 @@ import { Linker, MessageProxyForMainnet, } from "../typechain"; -import { stringKeccak256 } from "./utils/helper"; chai.should(); @@ -49,10 +48,9 @@ import { deployContractManager } from "./utils/skale-manager-utils/contractManag import { initializeSchain } from "./utils/skale-manager-utils/schainsInternal"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -const schainName = "TestSchain"; describe("Linker", () => { let deployer: SignerWithAddress; @@ -65,6 +63,8 @@ describe("Linker", () => { let messageProxy: MessageProxyForMainnet; let linker: Linker; const contractManagerAddress = "0x0000000000000000000000000000000000000000"; + const schainName = "TestSchain"; + const schainHash = ethers.id(schainName); before(async () => { [deployer, user] = await ethers.getSigners(); @@ -78,16 +78,16 @@ describe("Linker", () => { depositBoxEth = await deployDepositBoxEth(contractManager, linker, messageProxy); depositBoxERC20 = await deployDepositBoxERC20(contractManager, linker, messageProxy); depositBoxERC721 = await deployDepositBoxERC721(contractManager, linker, messageProxy); - await linker.removeMainnetContract(depositBoxEth.address); - await linker.removeMainnetContract(depositBoxERC20.address); - await linker.removeMainnetContract(depositBoxERC721.address); - await linker.removeMainnetContract(linker.address); + await linker.removeMainnetContract(depositBoxEth); + await linker.removeMainnetContract(depositBoxERC20); + await linker.removeMainnetContract(depositBoxERC721); + await linker.removeMainnetContract(linker); await linker.grantRole(await linker.LINKER_ROLE(), deployer.address); - await linker.grantRole(await linker.LINKER_ROLE(), linker.address); - await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker.address); + await linker.grantRole(await linker.LINKER_ROLE(), linker); + await messageProxy.grantRole(await messageProxy.CHAIN_CONNECTOR_ROLE(), linker); await messageProxy.grantRole(await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await initializeSchain(contractManager, schainName, deployer.address, 1, 1); - await messageProxy.registerExtraContractForAll(linker.address); + await messageProxy.registerExtraContractForAll(linker); }); it("should connect schain", async () => { @@ -107,11 +107,11 @@ describe("Linker", () => { const nullAddress = "0x0000000000000000000000000000000000000000"; const tokenManagerAddress = user.address; - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(false); - await linker.connect(deployer).registerMainnetContract(depositBoxEth.address); + await linker.connect(deployer).registerMainnetContract(depositBoxEth); - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(true); await linker.connect(deployer).connectSchain(schainName, []) .should.be.eventually.rejectedWith("Incorrect number of addresses"); @@ -134,20 +134,20 @@ describe("Linker", () => { const nullAddress = "0x0000000000000000000000000000000000000000"; const tokenManagerAddress = user.address; - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(false); - expect(await linker.hasMainnetContract(depositBoxERC20.address)).to.equal(false); - expect(await linker.hasMainnetContract(depositBoxERC721.address)).to.equal(false); - expect(await linker.hasMainnetContract(linker.address)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxERC20)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxERC721)).to.equal(false); + expect(await linker.hasMainnetContract(linker)).to.equal(false); - await linker.connect(deployer).registerMainnetContract(depositBoxEth.address); - await linker.connect(deployer).registerMainnetContract(depositBoxERC20.address); - await linker.connect(deployer).registerMainnetContract(depositBoxERC721.address); - await linker.connect(deployer).registerMainnetContract(linker.address); + await linker.connect(deployer).registerMainnetContract(depositBoxEth); + await linker.connect(deployer).registerMainnetContract(depositBoxERC20); + await linker.connect(deployer).registerMainnetContract(depositBoxERC721); + await linker.connect(deployer).registerMainnetContract(linker); - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(true); - expect(await linker.hasMainnetContract(depositBoxERC20.address)).to.equal(true); - expect(await linker.hasMainnetContract(depositBoxERC721.address)).to.equal(true); - expect(await linker.hasMainnetContract(linker.address)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxERC20)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxERC721)).to.equal(true); + expect(await linker.hasMainnetContract(linker)).to.equal(true); await linker.connect(deployer).connectSchain(schainName, []) .should.be.eventually.rejectedWith("Incorrect number of addresses"); @@ -174,10 +174,10 @@ describe("Linker", () => { it("should invoke `disconnectSchain` without mistakes", async () => { const tokenManagerAddress = user.address; - await linker.connect(deployer).registerMainnetContract(depositBoxEth.address); - await linker.connect(deployer).registerMainnetContract(depositBoxERC20.address); - await linker.connect(deployer).registerMainnetContract(depositBoxERC721.address); - await linker.connect(deployer).registerMainnetContract(linker.address); + await linker.connect(deployer).registerMainnetContract(depositBoxEth); + await linker.connect(deployer).registerMainnetContract(depositBoxERC20); + await linker.connect(deployer).registerMainnetContract(depositBoxERC721); + await linker.connect(deployer).registerMainnetContract(linker); await linker.connect(deployer).connectSchain(schainName, [tokenManagerAddress, tokenManagerAddress, tokenManagerAddress, tokenManagerAddress]); @@ -193,17 +193,17 @@ describe("Linker", () => { const nullAddress = "0x0000000000000000000000000000000000000000"; const tokenManagerAddress = user.address; - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(false); - expect(await linker.hasMainnetContract(depositBoxERC20.address)).to.equal(false); - expect(await linker.hasMainnetContract(depositBoxERC721.address)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxERC20)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxERC721)).to.equal(false); - await linker.connect(deployer).registerMainnetContract(depositBoxEth.address); - await linker.connect(deployer).registerMainnetContract(depositBoxERC20.address); - await linker.connect(deployer).registerMainnetContract(depositBoxERC721.address); + await linker.connect(deployer).registerMainnetContract(depositBoxEth); + await linker.connect(deployer).registerMainnetContract(depositBoxERC20); + await linker.connect(deployer).registerMainnetContract(depositBoxERC721); - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(true); - expect(await linker.hasMainnetContract(depositBoxERC20.address)).to.equal(true); - expect(await linker.hasMainnetContract(depositBoxERC721.address)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxERC20)).to.equal(true); + expect(await linker.hasMainnetContract(depositBoxERC721)).to.equal(true); expect(await linker.hasMainnetContract(nullAddress)).to.equal(false); expect(await linker.hasMainnetContract(tokenManagerAddress)).to.equal(false); @@ -227,42 +227,43 @@ describe("Linker", () => { expect(await linker.hasMainnetContract(nullAddress)).to.equal(false); - await linker.connect(deployer).removeMainnetContract(depositBoxEth.address); - await linker.connect(deployer).removeMainnetContract(depositBoxERC20.address); - await linker.connect(deployer).removeMainnetContract(depositBoxERC721.address); + await linker.connect(deployer).removeMainnetContract(depositBoxEth); + await linker.connect(deployer).removeMainnetContract(depositBoxERC20); + await linker.connect(deployer).removeMainnetContract(depositBoxERC721); - expect(await linker.hasMainnetContract(depositBoxEth.address)).to.equal(false); - expect(await linker.hasMainnetContract(depositBoxERC20.address)).to.equal(false); - expect(await linker.hasMainnetContract(depositBoxERC721.address)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxEth)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxERC20)).to.equal(false); + expect(await linker.hasMainnetContract(depositBoxERC721)).to.equal(false); }); it("should kill schain by schain owner first", async () => { // schain owner is user + await initializeSchain(contractManager, schainName, user.address, 1, 1); await linker.connect(deployer).connectSchain(schainName, []); - expect(await linker.isNotKilled(stringKeccak256(schainName))).to.equal(true); - expect(await linker.statuses(stringKeccak256(schainName))).to.equal(0); + expect(await linker.isNotKilled(schainHash)).to.equal(true); + expect(await linker.statuses(schainHash)).to.equal(0); await linker.connect(user).kill(schainName); - expect(await linker.isNotKilled(stringKeccak256(schainName))).to.equal(true); - expect(await linker.statuses(stringKeccak256(schainName))).to.equal(1); + expect(await linker.isNotKilled(schainHash)).to.equal(true); + expect(await linker.statuses(schainHash)).to.equal(1); await linker.connect(user).kill(schainName).should.be.eventually.rejectedWith("Already killed or incorrect sender"); await linker.connect(deployer).kill(schainName); - expect(await linker.isNotKilled(stringKeccak256(schainName))).to.equal(false); - expect(await linker.statuses(stringKeccak256(schainName))).to.equal(3); + expect(await linker.isNotKilled(schainHash)).to.equal(false); + expect(await linker.statuses(schainHash)).to.equal(3); }); it("should kill schain by deployer first", async () => { // schain owner is user await initializeSchain(contractManager, schainName, user.address, 1, 1); await linker.connect(deployer).connectSchain(schainName, []); - expect(await linker.isNotKilled(stringKeccak256(schainName))).to.equal(true); - expect(await linker.statuses(stringKeccak256(schainName))).to.equal(0); + expect(await linker.isNotKilled(schainHash)).to.equal(true); + expect(await linker.statuses(schainHash)).to.equal(0); await linker.connect(deployer).kill(schainName); - expect(await linker.isNotKilled(stringKeccak256(schainName))).to.equal(true); - expect(await linker.statuses(stringKeccak256(schainName))).to.equal(2); + expect(await linker.isNotKilled(schainHash)).to.equal(true); + expect(await linker.statuses(schainHash)).to.equal(2); await linker.connect(user).kill(schainName); - expect(await linker.isNotKilled(stringKeccak256(schainName))).to.equal(false); - expect(await linker.statuses(stringKeccak256(schainName))).to.equal(3); + expect(await linker.isNotKilled(schainHash)).to.equal(false); + expect(await linker.statuses(schainHash)).to.equal(3); }); }); diff --git a/proxy/test/MessageProxy.ts b/test/MessageProxy.ts similarity index 83% rename from proxy/test/MessageProxy.ts rename to test/MessageProxy.ts index 3b346610d..aab09698a 100644 --- a/proxy/test/MessageProxy.ts +++ b/test/MessageProxy.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { DepositBoxEth, ContractManager, @@ -38,9 +38,10 @@ import { KeyStorageMock, CommunityPool, EtherbaseMock, - SchainsInternal + SchainsInternal, + Wallets } from "../typechain/"; -import { getPublicKey, stringKeccak256 } from "./utils/helper"; +import { getPublicKey } from "./utils/helper"; import { deployLinker } from "./utils/deploy/mainnet/linker"; import { deployMessageProxyForMainnet } from "./utils/deploy/mainnet/messageProxyForMainnet"; import { deployDepositBoxEth } from "./utils/deploy/mainnet/depositBoxEth"; @@ -52,8 +53,8 @@ import { deployMessageProxyCaller } from "./utils/deploy/test/messageProxyCaller import { deployMessages } from "./utils/deploy/messages"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; import { expect } from "chai"; import { MessageProxyForSchainTester } from "../typechain"; import { deployMessageProxyForSchainTester } from "./utils/deploy/test/messageProxyForSchainTester"; @@ -70,7 +71,7 @@ describe("MessageProxy", () => { let customer: SignerWithAddress; let agent: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let keyStorage: KeyStorageMock; let messageProxyForSchain: MessageProxyForSchainTester; @@ -86,11 +87,11 @@ describe("MessageProxy", () => { const contractManagerAddress = "0x0000000000000000000000000000000000000000"; const zeroBytes32 = "0x0000000000000000000000000000000000000000000000000000000000000000" const schainName = "Schain"; - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); - const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781"), + const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -99,17 +100,17 @@ describe("MessageProxy", () => { before(async () => { [deployer, user, client, customer, agent, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - BigInt(ethers.parseEther("1"))}); }); after(async () => { - const balanceNode = await nodeAddress.getBalance(); - await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode.sub(ethers.utils.parseEther("1"))}); + const balanceNode = await ethers.provider.getBalance(nodeAddress.address); + await nodeAddress.sendTransaction({to: richGuy.address, value: balanceNode - BigInt(ethers.parseEther("1"))}); }); describe("MessageProxy for mainnet", async () => { - let gasPrice: BigNumber; + let gasPrice: BigNumberish; beforeEach(async () => { contractManager = await deployContractManager(contractManagerAddress); messageProxyForMainnet = await deployMessageProxyForMainnet(contractManager); @@ -120,24 +121,24 @@ describe("MessageProxy", () => { communityPool = await deployCommunityPool(contractManager, imaLinker, messageProxyForMainnet); await messageProxyForMainnet.grantRole(await messageProxyForMainnet.EXTRA_CONTRACT_REGISTRAR_ROLE(), deployer.address); await messageProxyForMainnet.grantRole(await messageProxyForMainnet.CHAIN_CONNECTOR_ROLE(), deployer.address); - const registerTx = await messageProxyForMainnet.registerExtraContract(schainName, caller.address); + const registerTx = await messageProxyForMainnet.registerExtraContract(schainName, caller); if (registerTx.gasPrice) { gasPrice = registerTx.gasPrice; } }); it("should set constants", async () => { - const headerMessageGasCostPrevious = (await messageProxyForMainnet.headerMessageGasCost()).toNumber(); - const messageGasCostPrevious = (await messageProxyForMainnet.messageGasCost()).toNumber(); - const gasLimitPrevious = (await messageProxyForMainnet.gasLimit()).toNumber(); + const headerMessageGasCostPrevious = await messageProxyForMainnet.headerMessageGasCost(); + const messageGasCostPrevious = await messageProxyForMainnet.messageGasCost(); + const gasLimitPrevious = await messageProxyForMainnet.gasLimit(); const headerMessageGasCostNew = 5; const messageGasCostNew = 6; const gasLimitNew = 7; - expect((await messageProxyForMainnet.headerMessageGasCost()).toNumber()).to.equal(headerMessageGasCostPrevious); - expect((await messageProxyForMainnet.messageGasCost()).toNumber()).to.equal(messageGasCostPrevious); - expect((await messageProxyForMainnet.gasLimit()).toNumber()).to.equal(gasLimitPrevious); + expect(await messageProxyForMainnet.headerMessageGasCost()).to.equal(headerMessageGasCostPrevious); + expect(await messageProxyForMainnet.messageGasCost()).to.equal(messageGasCostPrevious); + expect(await messageProxyForMainnet.gasLimit()).to.equal(gasLimitPrevious); await messageProxyForMainnet.connect(user).setNewHeaderMessageGasCost( headerMessageGasCostNew @@ -156,17 +157,17 @@ describe("MessageProxy", () => { await messageProxyForMainnet.connect(user).setNewMessageGasCost(messageGasCostNew); await messageProxyForMainnet.connect(user).setNewGasLimit(gasLimitNew); - expect((await messageProxyForMainnet.headerMessageGasCost()).toNumber()).to.equal(headerMessageGasCostNew); - expect((await messageProxyForMainnet.messageGasCost()).toNumber()).to.equal(messageGasCostNew); - expect((await messageProxyForMainnet.gasLimit()).toNumber()).to.equal(gasLimitNew); + expect(await messageProxyForMainnet.headerMessageGasCost()).to.equal(headerMessageGasCostNew); + expect(await messageProxyForMainnet.messageGasCost()).to.equal(messageGasCostNew); + expect(await messageProxyForMainnet.gasLimit()).to.equal(gasLimitNew); await messageProxyForMainnet.connect(user).setNewHeaderMessageGasCost(headerMessageGasCostPrevious); await messageProxyForMainnet.connect(user).setNewMessageGasCost(messageGasCostPrevious); await messageProxyForMainnet.connect(user).setNewGasLimit(gasLimitPrevious); - expect((await messageProxyForMainnet.headerMessageGasCost()).toNumber()).to.equal(headerMessageGasCostPrevious); - expect((await messageProxyForMainnet.messageGasCost()).toNumber()).to.equal(messageGasCostPrevious); - expect((await messageProxyForMainnet.gasLimit()).toNumber()).to.equal(gasLimitPrevious); + expect(await messageProxyForMainnet.headerMessageGasCost()).to.equal(headerMessageGasCostPrevious); + expect(await messageProxyForMainnet.messageGasCost()).to.equal(messageGasCostPrevious); + expect(await messageProxyForMainnet.gasLimit()).to.equal(gasLimitPrevious); }); @@ -213,48 +214,42 @@ describe("MessageProxy", () => { }); it("should post outgoing message twice", async () => { - const contractAddress = messageProxyForMainnet.address; + const contractAddress = messageProxyForMainnet; const amount = 4; const bytesData = await messages.encodeTransferEthMessage(user.address, amount); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData) + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData) .should.be.rejectedWith("Destination chain is not initialized"); await messageProxyForMainnet.connect(deployer).addConnectedChain(schainName); - const message1 = caller.postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData); + const message1 = caller.postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData); await expect(message1) .to.emit(messageProxyForMainnet, 'PreviousMessageReference') .withArgs(0, 0); - let outgoingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName) - ); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); - const lastOutgoingMessageBlockId = BigNumber.from( - await messageProxyForMainnet.getLastOutgoingMessageBlockId(schainName) - ); + let outgoingMessagesCounter = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(1); + const lastOutgoingMessageBlockId = await messageProxyForMainnet.getLastOutgoingMessageBlockId(schainName); - const message2 = caller.postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData); + const message2 = caller.postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData); await expect(message2) .to.emit(messageProxyForMainnet, 'PreviousMessageReference') .withArgs(1, lastOutgoingMessageBlockId); - outgoingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName) - ); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(2)); + outgoingMessagesCounter = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(2); }); it("should pause with a role and unpause", async () => { - const contractAddress = messageProxyForMainnet.address; + const contractAddress = messageProxyForMainnet; const amount = 4; const bytesData = await messages.encodeTransferEthMessage(user.address, amount); const schainOwner = user; await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData) + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData) .should.be.rejectedWith("Destination chain is not initialized"); const schainsInternal = (await ethers.getContractFactory("SchainsInternal")).attach(await contractManager.getContract("SchainsInternal")) as SchainsInternal; @@ -264,10 +259,9 @@ describe("MessageProxy", () => { await messageProxyForMainnet.connect(deployer).addConnectedChain(schainName); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData); - let outgoingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData); + let outgoingMessagesCounter = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(1); (await messageProxyForMainnet.isPaused(schainHash)).should.be.deep.equal(false); @@ -293,7 +287,7 @@ describe("MessageProxy", () => { pausedInfo.should.be.equal(true); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData) + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData) .should.be.rejectedWith("IMA is paused"); await messageProxyForMainnet.connect(client).resume(schainName).should.be.rejectedWith("Incorrect sender"); @@ -309,10 +303,9 @@ describe("MessageProxy", () => { pausedInfo.should.be.equal(false); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData); - outgoingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(2)); + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData); + outgoingMessagesCounter = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(2); await messageProxyForMainnet.connect(client).pause(schainName); @@ -322,26 +315,26 @@ describe("MessageProxy", () => { pausedInfo.should.be.equal(true); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData) + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData) .should.be.rejectedWith("IMA is paused"); await messageProxyForMainnet.connect(deployer).resume(schainName); await messageProxyForMainnet.connect(schainOwner).resume(schainName).should.be.rejectedWith("Already unpaused"); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData); - outgoingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(3)); + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData); + outgoingMessagesCounter = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(3); }); it("should allow schain owner to send message", async () => { const message = "0xd2"; const schainOwner = user; - const schainsInternal = (await ethers.getContractFactory("SchainsInternal")).attach(await contractManager.getContract("SchainsInternal")) as SchainsInternal; + const SchainsInternalFactory = await ethers.getContractFactory("SchainsInternal"); + const schainsInternal = SchainsInternalFactory.attach(await contractManager.getContract("SchainsInternal")) as SchainsInternal; const otherSchainName = "something else"; - const otherSchainHash = stringKeccak256(otherSchainName); + const otherSchainHash = ethers.id(otherSchainName); await schainsInternal.initializeSchain(schainName, schainOwner.address, 0, 0); await messageProxyForMainnet.addConnectedChain(schainName); @@ -377,20 +370,20 @@ describe("MessageProxy", () => { await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, deployer.address, "1000000000000000000"); await setCommonPublicKey(contractManager, schainName); - await messageProxyForMainnet.registerExtraContract(schainName, communityPool.address); + await messageProxyForMainnet.registerExtraContract(schainName, communityPool); await depositBox.addSchainContract(schainName, deployer.address); await communityPool.addSchainContract(schainName, deployer.address); const minTransactionGas = await communityPool.minTransactionGas(); - const amountWei = minTransactionGas.mul(gasPrice); + const amountWei = minTransactionGas * BigInt(gasPrice); const message1 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(client.address, 0), }; const message2 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(customer.address, 7), }; @@ -445,9 +438,8 @@ describe("MessageProxy", () => { outgoingMessages, sign ); - const incomingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getIncomingMessagesCounter(schainName)); - incomingMessagesCounter.should.be.deep.equal(BigNumber.from(4)); + const incomingMessagesCounter = await messageProxyForMainnet.getIncomingMessagesCounter(schainName); + incomingMessagesCounter.should.be.equal(4); }); it("should post incoming message and reimburse from CommunityPool", async () => { @@ -466,15 +458,15 @@ describe("MessageProxy", () => { await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, deployer.address, "1000000000000000000"); await setCommonPublicKey(contractManager, schainName); - await messageProxyForMainnet.registerExtraContract(schainName, communityPool.address); + await messageProxyForMainnet.registerExtraContract(schainName, communityPool); await depositBox.addSchainContract(schainName, deployer.address); const minTransactionGas = await communityPool.minTransactionGas(); - const amountWei = minTransactionGas.mul(gasPrice).mul(2); + const amountWei = minTransactionGas * BigInt(gasPrice) * 2n; - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address); + await messageProxyForMainnet.registerExtraContract(schainName, depositBox); const message1 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(client.address, 1), }; @@ -488,12 +480,12 @@ describe("MessageProxy", () => { }; await messageProxyForMainnet.connect(deployer).addConnectedChain(schainName); - await communityPool.connect(deployer).addSchainContract(schainName, communityPool.address); + await communityPool.connect(deployer).addSchainContract(schainName, communityPool); await communityPool.connect(client).rechargeUserWallet(schainName, client.address, {value: amountWei.toString()}); const testWalletsFactory = await ethers.getContractFactory("Wallets"); - const testWallets = testWalletsFactory.attach(await contractManager.getContract("Wallets")); + const testWallets = testWalletsFactory.attach(await contractManager.getContract("Wallets")) as Wallets; let balance = await testWallets.getSchainBalance(schainHash); let userBalance = await communityPool.getBalance(client.address, schainName); @@ -518,7 +510,7 @@ describe("MessageProxy", () => { newBalance.should.be.lt(balance); newUserBalance.should.be.deep.equal(userBalance); - await messageProxyForMainnet.addReimbursedContract(schainName, depositBox.address); + await messageProxyForMainnet.addReimbursedContract(schainName, depositBox); balance = newBalance; userBalance = newUserBalance; @@ -537,7 +529,7 @@ describe("MessageProxy", () => { newUserBalance = await communityPool.getBalance(client.address, schainName); newBalance.should.be.deep.equal(balance); - newUserBalance.toNumber().should.be.lessThan(userBalance.toNumber()); + newUserBalance.should.be.lessThan(userBalance); }); it("should not post incoming messages when IMA bridge is paused", async () => { @@ -555,21 +547,21 @@ describe("MessageProxy", () => { await createNode(contractManager, nodeAddress.address, nodeCreationParams); await addNodesToSchain(contractManager, schainName, [0]); await setCommonPublicKey(contractManager, schainName); - await messageProxyForMainnet.registerExtraContract(schainName, communityPool.address); + await messageProxyForMainnet.registerExtraContract(schainName, communityPool); await depositBox.addSchainContract(schainName, deployer.address); await communityPool.addSchainContract(schainName, deployer.address); await rechargeSchainWallet(contractManager, schainName, deployer.address, "1000000000000000000"); const minTransactionGas = await communityPool.minTransactionGas(); - const amountWei = minTransactionGas.mul(gasPrice); + const amountWei = minTransactionGas * BigInt(gasPrice); const message1 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(client.address, 0), }; const message2 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(customer.address, 7), }; @@ -624,9 +616,8 @@ describe("MessageProxy", () => { outgoingMessages, sign ); - let incomingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getIncomingMessagesCounter(schainName)); - incomingMessagesCounter.should.be.deep.equal(BigNumber.from(4)); + let incomingMessagesCounter = await messageProxyForMainnet.getIncomingMessagesCounter(schainName); + incomingMessagesCounter.should.be.equal(4); const pauseableRole = await messageProxyForMainnet.PAUSABLE_ROLE(); @@ -654,9 +645,8 @@ describe("MessageProxy", () => { sign ); - incomingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getIncomingMessagesCounter(schainName)); - incomingMessagesCounter.should.be.deep.equal(BigNumber.from(6)); + incomingMessagesCounter = await messageProxyForMainnet.getIncomingMessagesCounter(schainName); + incomingMessagesCounter.should.be.equal(6); }); it("should not post incoming messages with incorrect address", async () => { @@ -675,20 +665,20 @@ describe("MessageProxy", () => { await addNodesToSchain(contractManager, schainName, [0]); await rechargeSchainWallet(contractManager, schainName, deployer.address, "1000000000000000000"); await setCommonPublicKey(contractManager, schainName); - await messageProxyForMainnet.registerExtraContract(schainName, communityPool.address); + await messageProxyForMainnet.registerExtraContract(schainName, communityPool); await depositBox.addSchainContract(schainName, deployer.address); await communityPool.addSchainContract(schainName, deployer.address); const minTransactionGas = await communityPool.minTransactionGas(); - const amountWei = minTransactionGas.mul(gasPrice); + const amountWei = minTransactionGas * BigInt(gasPrice); const message1 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(client.address, 0), }; const message2 = { - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, data: await messages.encodeTransferEthMessage(customer.address, 7), }; @@ -752,13 +742,12 @@ describe("MessageProxy", () => { outgoingMessages, sign ); - const incomingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getIncomingMessagesCounter(schainName)); - incomingMessagesCounter.should.be.deep.equal(BigNumber.from(4)); + const incomingMessagesCounter = await messageProxyForMainnet.getIncomingMessagesCounter(schainName); + incomingMessagesCounter.should.be.equal(4); }); it("should get outgoing messages counter", async () => { - const contractAddress = depositBox.address; + const contractAddress = depositBox; const amount = 5; const addressTo = client.address; const bytesData = await messages.encodeTransferEthMessage(addressTo, amount); @@ -768,16 +757,14 @@ describe("MessageProxy", () => { await messageProxyForMainnet.connect(deployer).addConnectedChain(schainName); - const outgoingMessagesCounter0 = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter0.should.be.deep.equal(BigNumber.from(0)); + const outgoingMessagesCounter0 = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter0.should.be.equal(0); await caller - .postOutgoingMessageTester(messageProxyForMainnet.address, schainHash, contractAddress, bytesData); + .postOutgoingMessageTester(messageProxyForMainnet, schainHash, contractAddress, bytesData); - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should get incoming messages counter", async () => { @@ -799,14 +786,14 @@ describe("MessageProxy", () => { const message1 = { amount: 3, data: "0x11", - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, to: client.address }; const message2 = { amount: 7, data: "0x22", - destinationContract: depositBox.address, + destinationContract: depositBox, sender: user.address, to: customer.address }; @@ -823,9 +810,8 @@ describe("MessageProxy", () => { await messageProxyForMainnet.connect(deployer).addConnectedChain(schainName); - const incomingMessagesCounter0 = BigNumber.from( - await messageProxyForMainnet.getIncomingMessagesCounter(schainName)); - incomingMessagesCounter0.should.be.deep.equal(BigNumber.from(0)); + const incomingMessagesCounter0 = await messageProxyForMainnet.getIncomingMessagesCounter(schainName); + incomingMessagesCounter0.should.be.equal(0); await messageProxyForMainnet .connect(nodeAddress) @@ -835,9 +821,8 @@ describe("MessageProxy", () => { outgoingMessages, sign ); - const incomingMessagesCounter = BigNumber.from( - await messageProxyForMainnet.getIncomingMessagesCounter(schainName)); - incomingMessagesCounter.should.be.deep.equal(BigNumber.from(2)); + const incomingMessagesCounter = await messageProxyForMainnet.getIncomingMessagesCounter(schainName); + incomingMessagesCounter.should.be.equal(2); }); it("should get outgoing messages counter", async () => { @@ -868,14 +853,14 @@ describe("MessageProxy", () => { const message1 = { amount: 3, data: "0x11", - destinationContract: depositBox.address, + destinationContract: depositBox, sender: deployer.address, to: client.address }; const message2 = { amount: 7, data: "0x22", - destinationContract: depositBox.address, + destinationContract: depositBox, sender: user.address, to: customer.address }; @@ -906,9 +891,9 @@ describe("MessageProxy", () => { const outgoingMessagesCounter0 = await messageProxyForMainnet.getOutgoingMessagesCounter(schainName); outgoingMessagesCounter0.should.be.equal(0); - await caller.postOutgoingMessageTester(messageProxyForMainnet.address, + await caller.postOutgoingMessageTester(messageProxyForMainnet, schainHash, - depositBox.address, + depositBox, bytesData, ); @@ -940,7 +925,7 @@ describe("MessageProxy", () => { const message1 = { amount: 0, data: "0x11", - destinationContract: receiverMock.address, + destinationContract: receiverMock, sender: deployer.address, to: client.address }; @@ -953,10 +938,10 @@ describe("MessageProxy", () => { hashB: HashB, }; - await messageProxyForMainnet.registerExtraContract(schainName, receiverMock.address); + await messageProxyForMainnet.registerExtraContract(schainName, receiverMock); let a = await receiverMock.a(); - expect(a.toNumber()).be.equal(0); + expect(a).be.equal(0); const res = await (await messageProxyForMainnet .connect(nodeAddress) @@ -968,8 +953,8 @@ describe("MessageProxy", () => { )).wait(); a = await receiverMock.a(); - expect(a.toNumber()).be.equal(0); - expect(res.gasUsed.toNumber()).to.be.greaterThan(1000000); + expect(a).be.equal(0); + expect(res?.gasUsed).to.be.greaterThan(1000000); }); @@ -992,13 +977,13 @@ describe("MessageProxy", () => { const testCallReceiverContract = await ethers.getContractFactory("TestCallReceiverContract"); const receiverMock = await testCallReceiverContract.deploy(); - await messageProxyForMainnet.registerExtraContract(schainName, receiverMock.address); + await messageProxyForMainnet.registerExtraContract(schainName, receiverMock); const startingCounter = 0; const message1 = { amount: 0, - data: ethers.utils.defaultAbiCoder.encode(["uint"], [1]), - destinationContract: receiverMock.address, + data: ethers.AbiCoder.defaultAbiCoder().encode(["uint"], [1]), + destinationContract: receiverMock, sender: deployer.address, to: client.address }; @@ -1010,9 +995,9 @@ describe("MessageProxy", () => { hashB: HashB, }; - const sixtyFourTimesA = ethers.utils.hexlify(Array(64).fill("A".charCodeAt(0))); + const sixtyFourTimesA = ethers.hexlify(new Uint8Array(Array(64).fill("A".charCodeAt(0)))); const event = { - msgCounter: BigNumber.from(0), + msgCounter: 0, message: sixtyFourTimesA } await expect( @@ -1048,14 +1033,14 @@ describe("MessageProxy", () => { const testCallReceiverContract = await ethers.getContractFactory("TestCallReceiverContract"); const receiverMock = await testCallReceiverContract.deploy(); - await messageProxyForMainnet.registerExtraContract(schainName, receiverMock.address); + await messageProxyForMainnet.registerExtraContract(schainName, receiverMock); const startingCounter = 0; const message1 = { amount: 0, - data: ethers.utils.defaultAbiCoder.encode(["uint"], [2]), - destinationContract: receiverMock.address, + data: ethers.AbiCoder.defaultAbiCoder().encode(["uint"], [2]), + destinationContract: receiverMock, sender: deployer.address, to: client.address }; @@ -1069,7 +1054,7 @@ describe("MessageProxy", () => { const panicErrorCodeDivideByZero = "12"; const event = { - msgCounter: BigNumber.from(0), + msgCounter: 0, message: "0x" + panicErrorCodeDivideByZero.padStart(64, "0") } await expect( @@ -1098,184 +1083,184 @@ describe("MessageProxy", () => { describe("register and remove extra contracts", async () => { it("should register extra contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).registerExtraContract(schainName, depositBox.address) + await messageProxyForMainnet.connect(user).registerExtraContract(schainName, depositBox) .should.be.eventually.rejectedWith("Not enough permissions to register extra contract"); await messageProxyForMainnet.registerExtraContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Given address is not a contract"); expect((await messageProxyForMainnet.getContractRegisteredLength(schainHash)).toString()).to.be.equal("1"); - expect(await messageProxyForMainnet.isContractRegistered(schainHash, depositBox.address)).to.be.equal(false); - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address); - expect(await messageProxyForMainnet.isContractRegistered(schainHash, depositBox.address)).to.be.equal(true); + expect(await messageProxyForMainnet.isContractRegistered(schainHash, depositBox)).to.be.equal(false); + await messageProxyForMainnet.registerExtraContract(schainName, depositBox); + expect(await messageProxyForMainnet.isContractRegistered(schainHash, depositBox)).to.be.equal(true); expect((await messageProxyForMainnet.getContractRegisteredLength(schainHash)).toString()).to.be.equal("2"); expect((await messageProxyForMainnet.getContractRegisteredRange(schainHash, 0, 1)).length).to.be.equal(1); - expect((await messageProxyForMainnet.getContractRegisteredRange(schainHash, 0, 2))[1]).to.be.equal(depositBox.address); + expect((await messageProxyForMainnet.getContractRegisteredRange(schainHash, 0, 2))[1]).to.be.equal(depositBox); await messageProxyForMainnet.getContractRegisteredRange(schainHash, 0, 11).should.be.eventually.rejectedWith("Range is incorrect"); await messageProxyForMainnet.getContractRegisteredRange(schainHash, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address) + await messageProxyForMainnet.registerExtraContract(schainName, depositBox) .should.be.eventually.rejectedWith("Extra contract is already registered"); }); it("should register extra contract for all", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).registerExtraContractForAll(depositBox.address) + await messageProxyForMainnet.connect(user).registerExtraContractForAll(depositBox) .should.be.eventually.rejectedWith("EXTRA_CONTRACT_REGISTRAR_ROLE is required"); await messageProxyForMainnet.registerExtraContractForAll(fakeContractOnSchain) .should.be.eventually.rejectedWith("Given address is not a contract"); expect((await messageProxyForMainnet.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("0"); - expect(await messageProxyForMainnet.isContractRegistered(zeroBytes32, depositBox.address)).to.be.equal(false); - await messageProxyForMainnet.registerExtraContractForAll(depositBox.address); - expect(await messageProxyForMainnet.isContractRegistered(zeroBytes32, depositBox.address)).to.be.equal(true); + expect(await messageProxyForMainnet.isContractRegistered(zeroBytes32, depositBox)).to.be.equal(false); + await messageProxyForMainnet.registerExtraContractForAll(depositBox); + expect(await messageProxyForMainnet.isContractRegistered(zeroBytes32, depositBox)).to.be.equal(true); expect((await messageProxyForMainnet.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("1"); expect((await messageProxyForMainnet.getContractRegisteredRange(zeroBytes32, 0, 1)).length).to.be.equal(1); - expect((await messageProxyForMainnet.getContractRegisteredRange(zeroBytes32, 0, 1))[0]).to.be.equal(depositBox.address); + expect((await messageProxyForMainnet.getContractRegisteredRange(zeroBytes32, 0, 1))[0]).to.be.equal(depositBox); await messageProxyForMainnet.getContractRegisteredRange(zeroBytes32, 0, 11).should.be.eventually.rejectedWith("Range is incorrect"); await messageProxyForMainnet.getContractRegisteredRange(zeroBytes32, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address) + await messageProxyForMainnet.registerExtraContract(schainName, depositBox) .should.be.eventually.rejectedWith("Extra contract is already registered for all chains"); - await messageProxyForMainnet.registerExtraContractForAll(depositBox.address) + await messageProxyForMainnet.registerExtraContractForAll(depositBox) .should.be.eventually.rejectedWith("Extra contract is already registered"); }); it("should register reimbursed contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).addReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.connect(user).addReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Not enough permissions to add reimbursed contract"); await messageProxyForMainnet.addReimbursedContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Given address is not a contract"); - await messageProxyForMainnet.addReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.addReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Contract is not registered"); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("0"); - expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox.address)).to.be.equal(false); - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address); - await messageProxyForMainnet.addReimbursedContract(schainName, depositBox.address); - expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox.address)).to.be.equal(true); + expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox)).to.be.equal(false); + await messageProxyForMainnet.registerExtraContract(schainName, depositBox); + await messageProxyForMainnet.addReimbursedContract(schainName, depositBox); + expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox)).to.be.equal(true); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("1"); expect((await messageProxyForMainnet.getReimbursedContractsRange(schainHash, 0, 1)).length).to.be.equal(1); - expect((await messageProxyForMainnet.getReimbursedContractsRange(schainHash, 0, 1))[0]).to.be.equal(depositBox.address); + expect((await messageProxyForMainnet.getReimbursedContractsRange(schainHash, 0, 1))[0]).to.be.equal(depositBox); await messageProxyForMainnet.getReimbursedContractsRange(schainHash, 0, 11).should.be.eventually.rejectedWith("Range is incorrect"); await messageProxyForMainnet.getReimbursedContractsRange(schainHash, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); - await messageProxyForMainnet.addReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.addReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Reimbursed contract is already added"); }); it("should remove extra contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).removeExtraContract(schainName, depositBox.address) + await messageProxyForMainnet.connect(user).removeExtraContract(schainName, depositBox) .should.be.eventually.rejectedWith("Not enough permissions to register extra contract"); await messageProxyForMainnet.removeExtraContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Extra contract is not registered"); expect((await messageProxyForMainnet.getContractRegisteredLength(schainHash)).toString()).to.be.equal("1"); await expect( - messageProxyForMainnet.registerExtraContract(schainName, depositBox.address) + messageProxyForMainnet.registerExtraContract(schainName, depositBox) ).to.emit( messageProxyForMainnet, "ExtraContractRegistered" - ).withArgs(schainHash, depositBox.address); + ).withArgs(schainHash, depositBox); expect((await messageProxyForMainnet.getContractRegisteredLength(schainHash)).toString()).to.be.equal("2"); await expect( - messageProxyForMainnet.removeExtraContract(schainName, depositBox.address) + messageProxyForMainnet.removeExtraContract(schainName, depositBox) ).to.emit( messageProxyForMainnet, "ExtraContractRemoved" - ).withArgs(schainHash, depositBox.address); + ).withArgs(schainHash, depositBox); expect((await messageProxyForMainnet.getContractRegisteredLength(schainHash)).toString()).to.be.equal("1"); - await messageProxyForMainnet.removeExtraContract(schainName, depositBox.address) + await messageProxyForMainnet.removeExtraContract(schainName, depositBox) .should.be.eventually.rejectedWith("Extra contract is not registered"); - expect(await messageProxyForMainnet.isContractRegistered(schainHash, depositBox.address)).to.be.equal(false); + expect(await messageProxyForMainnet.isContractRegistered(schainHash, depositBox)).to.be.equal(false); }); it("should remove extra contract for all", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).removeExtraContractForAll(depositBox.address) + await messageProxyForMainnet.connect(user).removeExtraContractForAll(depositBox) .should.be.eventually.rejectedWith("EXTRA_CONTRACT_REGISTRAR_ROLE is required"); await messageProxyForMainnet.removeExtraContractForAll(fakeContractOnSchain) .should.be.eventually.rejectedWith("Extra contract is not registered"); expect((await messageProxyForMainnet.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("0"); await expect( - messageProxyForMainnet.registerExtraContractForAll(depositBox.address) + messageProxyForMainnet.registerExtraContractForAll(depositBox) ).to.emit( messageProxyForMainnet, "ExtraContractRegistered" - ).withArgs(zeroBytes32, depositBox.address); + ).withArgs(zeroBytes32, depositBox); expect((await messageProxyForMainnet.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("1"); await expect( - messageProxyForMainnet.removeExtraContractForAll(depositBox.address) + messageProxyForMainnet.removeExtraContractForAll(depositBox) ).to.emit( messageProxyForMainnet, "ExtraContractRemoved" - ).withArgs(zeroBytes32, depositBox.address); + ).withArgs(zeroBytes32, depositBox); expect((await messageProxyForMainnet.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("0"); - await messageProxyForMainnet.removeExtraContractForAll(depositBox.address) + await messageProxyForMainnet.removeExtraContractForAll(depositBox) .should.be.eventually.rejectedWith("Extra contract is not registered"); }); it("should remove reimbursed contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).removeReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.connect(user).removeReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Not enough permissions to remove reimbursed contract"); await messageProxyForMainnet.removeReimbursedContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Reimbursed contract is not added"); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("0"); - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address); + await messageProxyForMainnet.registerExtraContract(schainName, depositBox); await expect( - messageProxyForMainnet.addReimbursedContract(schainName, depositBox.address) + messageProxyForMainnet.addReimbursedContract(schainName, depositBox) ).to.emit( messageProxyForMainnet, "ReimbursedContractAdded" - ).withArgs(schainHash, depositBox.address); + ).withArgs(schainHash, depositBox); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("1"); await expect( - messageProxyForMainnet.removeReimbursedContract(schainName, depositBox.address) + messageProxyForMainnet.removeReimbursedContract(schainName, depositBox) ).to.emit( messageProxyForMainnet, "ReimbursedContractRemoved" - ).withArgs(schainHash, depositBox.address); + ).withArgs(schainHash, depositBox); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("0"); - await messageProxyForMainnet.removeReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.removeReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Reimbursed contract is not added"); - expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox.address)).to.be.equal(false); + expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox)).to.be.equal(false); }); it("should remove reimbursed contract when remove extra contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForMainnet.connect(user).removeReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.connect(user).removeReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Not enough permissions to remove reimbursed contract"); await messageProxyForMainnet.removeReimbursedContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Reimbursed contract is not added"); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("0"); - await messageProxyForMainnet.registerExtraContract(schainName, depositBox.address); + await messageProxyForMainnet.registerExtraContract(schainName, depositBox); await expect( - messageProxyForMainnet.addReimbursedContract(schainName, depositBox.address) + messageProxyForMainnet.addReimbursedContract(schainName, depositBox) ).to.emit( messageProxyForMainnet, "ReimbursedContractAdded" - ).withArgs(schainHash, depositBox.address); + ).withArgs(schainHash, depositBox); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("1"); await expect( - messageProxyForMainnet.removeExtraContract(schainName, depositBox.address) + messageProxyForMainnet.removeExtraContract(schainName, depositBox) ).to.emit( messageProxyForMainnet, "ReimbursedContractRemoved" - ).withArgs(schainHash, depositBox.address); + ).withArgs(schainHash, depositBox); expect((await messageProxyForMainnet.getReimbursedContractsLength(schainHash)).toString()).to.be.equal("0"); - await messageProxyForMainnet.removeReimbursedContract(schainName, depositBox.address) + await messageProxyForMainnet.removeReimbursedContract(schainName, depositBox) .should.be.eventually.rejectedWith("Reimbursed contract is not added"); - expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox.address)).to.be.equal(false); + expect(await messageProxyForMainnet.isReimbursedContract(schainHash, depositBox)).to.be.equal(false); }); }); @@ -1285,22 +1270,22 @@ describe("MessageProxy", () => { beforeEach(async () => { keyStorage = await deployKeyStorageMock(); - messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage.address, "Base schain"); + messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage, "Base schain"); messages = await deployMessages(); caller = await deployMessageProxyCaller(); const chainConnectorRole = await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(chainConnectorRole, deployer.address); const extraContractRegistrarRole = await messageProxyForSchain.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxyForSchain.registerExtraContract(schainName, caller.address); + await messageProxyForSchain.registerExtraContract(schainName, caller); }); it("should set constants", async () => { - const gasLimitPrevious = (await messageProxyForSchain.gasLimit()).toNumber(); + const gasLimitPrevious = await messageProxyForSchain.gasLimit(); const gasLimitNew = 7; - expect((await messageProxyForSchain.gasLimit()).toNumber()).to.equal(gasLimitPrevious); + expect(await messageProxyForSchain.gasLimit()).to.equal(gasLimitPrevious); await messageProxyForSchain.connect(user).setNewGasLimit( gasLimitNew @@ -1311,11 +1296,11 @@ describe("MessageProxy", () => { await messageProxyForSchain.connect(user).setNewGasLimit(gasLimitNew); - expect((await messageProxyForSchain.gasLimit()).toNumber()).to.equal(gasLimitNew); + expect(await messageProxyForSchain.gasLimit()).to.equal(gasLimitNew); await messageProxyForSchain.connect(user).setNewGasLimit(gasLimitPrevious); - expect((await messageProxyForSchain.gasLimit()).toNumber()).to.equal(gasLimitPrevious); + expect(await messageProxyForSchain.gasLimit()).to.equal(gasLimitPrevious); }); @@ -1352,20 +1337,19 @@ describe("MessageProxy", () => { }); it("should post outgoing message", async () => { - const contractAddress = messageProxyForSchain.address; + const contractAddress = messageProxyForSchain; const amount = 4; const addressTo = user.address; const bytesData = await messages.encodeTransferEthMessage(addressTo, amount); await caller - .postOutgoingMessageTesterOnSchain(messageProxyForSchain.address, schainHash, contractAddress, bytesData) + .postOutgoingMessageTesterOnSchain(messageProxyForSchain, schainHash, contractAddress, bytesData) .should.be.rejectedWith("Destination chain is not initialized"); await messageProxyForSchain.connect(deployer).addConnectedChain(schainName); await caller - .postOutgoingMessageTesterOnSchain(messageProxyForSchain.address, schainHash, contractAddress, bytesData); - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + .postOutgoingMessageTesterOnSchain(messageProxyForSchain, schainHash, contractAddress, bytesData); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(1); }); // l_sergiy: this test should be rewritten in respect to new pre-BLS hash computation algorithm @@ -1502,18 +1486,16 @@ describe("MessageProxy", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(schainName); // chain should be inited: - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(schainName)).should.be.deep.equal(BigNumber.from(0)); + (await messageProxyForSchain.getOutgoingMessagesCounter(schainName)).should.be.equal(0); - const outgoingMessagesCounter0 = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter0.should.be.deep.equal(BigNumber.from(0)); + const outgoingMessagesCounter0 = await messageProxyForSchain.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter0.should.be.equal(0); await caller - .postOutgoingMessageTesterOnSchain(messageProxyForSchain.address, schainHash, messages.address, bytesData); + .postOutgoingMessageTesterOnSchain(messageProxyForSchain, schainHash, messages.getAddress(), bytesData); - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(schainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(schainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should set version of contracts on schain", async () => { @@ -1546,7 +1528,7 @@ describe("MessageProxy", () => { await messageProxyForSchainWithoutSignature.connect(deployer).grantRole(chainConnectorRole, deployer.address); const extraContractRegistrarRole = await messageProxyForSchainWithoutSignature.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchainWithoutSignature.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxyForSchainWithoutSignature.registerExtraContract(schainName, caller.address); + await messageProxyForSchainWithoutSignature.registerExtraContract(schainName, caller); const receiverMockFactory = await ethers.getContractFactory("ReceiverGasLimitSchainMock"); receiverMock = await receiverMockFactory.deploy() as ReceiverGasLimitSchainMock; @@ -1557,17 +1539,17 @@ describe("MessageProxy", () => { const message1 = { amount: 0, data: "0x11", - destinationContract: receiverMock.address, + destinationContract: receiverMock, sender: deployer.address, to: client.address }; const outgoingMessages = [message1]; - await messageProxyForSchainWithoutSignature.registerExtraContract("Mainnet", receiverMock.address); + await messageProxyForSchainWithoutSignature.registerExtraContract("Mainnet", receiverMock); let a = await receiverMock.a(); - expect(a.toNumber()).be.equal(0); + expect(a).be.equal(0); const res = await (await messageProxyForSchainWithoutSignature .connect(deployer) @@ -1579,8 +1561,8 @@ describe("MessageProxy", () => { )).wait(); a = await receiverMock.a(); - expect(a.toNumber()).be.equal(0); - expect(res.gasUsed.toNumber()).to.be.greaterThan(1000000); + expect(a).be.equal(0); + expect(res?.gasUsed).to.be.greaterThan(1000000); }); @@ -1589,7 +1571,7 @@ describe("MessageProxy", () => { const message1 = { amount: 0, data: "0x11", - destinationContract: receiverMock.address, + destinationContract: receiverMock, sender: deployer.address, to: client.address }; @@ -1597,14 +1579,15 @@ describe("MessageProxy", () => { const etherbase = await (await ethers.getContractFactory("EtherbaseMock")).deploy() as EtherbaseMock; await etherbase.initialize(deployer.address); - await etherbase.grantRole(await etherbase.ETHER_MANAGER_ROLE(), messageProxyForSchainWithoutSignature.address); + await etherbase.grantRole(await etherbase.ETHER_MANAGER_ROLE(), messageProxyForSchainWithoutSignature); - await messageProxyForSchainWithoutSignature.registerExtraContract("Mainnet", receiverMock.address); - await messageProxyForSchainWithoutSignature.setEtherbase(etherbase.address); + await messageProxyForSchainWithoutSignature.registerExtraContract("Mainnet", receiverMock); + await messageProxyForSchainWithoutSignature.setEtherbase(etherbase); - const smallBalance = ethers.utils.parseEther("0.02"); + const smallBalance = ethers.parseEther("0.02"); // left small amount of eth on agent balance to emulate PoW. - await agent.sendTransaction({to: etherbase.address, value: (await agent.getBalance()).sub(smallBalance)}); + let agentBalance = await ethers.provider.getBalance(agent); + await agent.sendTransaction({to: etherbase, value: agentBalance - smallBalance}); await messageProxyForSchainWithoutSignature .connect(agent) @@ -1615,10 +1598,11 @@ describe("MessageProxy", () => { randomSignature ); - (await agent.getBalance()) - .should.be.closeTo( - await messageProxyForSchainWithoutSignature.MINIMUM_BALANCE(), - ethers.utils.parseEther("0.001").toNumber()); + agentBalance = await ethers.provider.getBalance(agent); + agentBalance.should.be.closeTo( + await messageProxyForSchainWithoutSignature.MINIMUM_BALANCE(), + ethers.parseEther("0.001") + ); await etherbase.retrieve(agent.address); }); @@ -1628,7 +1612,7 @@ describe("MessageProxy", () => { const message1 = { amount: 0, data: "0x11", - destinationContract: receiverMock.address, + destinationContract: receiverMock, sender: deployer.address, to: client.address }; @@ -1636,16 +1620,17 @@ describe("MessageProxy", () => { const etherbase = await (await ethers.getContractFactory("EtherbaseMock")).deploy() as EtherbaseMock; await etherbase.initialize(deployer.address); - await etherbase.grantRole(await etherbase.ETHER_MANAGER_ROLE(), messageProxyForSchainWithoutSignature.address); + await etherbase.grantRole(await etherbase.ETHER_MANAGER_ROLE(), messageProxyForSchainWithoutSignature); - await messageProxyForSchainWithoutSignature.registerExtraContract("Mainnet", receiverMock.address); - await messageProxyForSchainWithoutSignature.setEtherbase(etherbase.address); + await messageProxyForSchainWithoutSignature.registerExtraContract("Mainnet", receiverMock); + await messageProxyForSchainWithoutSignature.setEtherbase(etherbase); - const etherbaseBalance = ethers.utils.parseEther("0.5"); - const smallBalance = ethers.utils.parseEther("0.02"); - const rest = (await agent.getBalance()).sub(smallBalance).sub(etherbaseBalance); + const etherbaseBalance = ethers.parseEther("0.5"); + const smallBalance = ethers.parseEther("0.02"); + let agentBalance = await ethers.provider.getBalance(agent); + const rest = agentBalance - smallBalance - etherbaseBalance; // left small amount of eth on agent balance to emulate PoW. - await agent.sendTransaction({to: etherbase.address, value: etherbaseBalance}); + await agent.sendTransaction({to: etherbase, value: etherbaseBalance}); await agent.sendTransaction({to: deployer.address, value: rest}); await messageProxyForSchainWithoutSignature @@ -1657,10 +1642,11 @@ describe("MessageProxy", () => { randomSignature ); - (await ethers.provider.getBalance(etherbase.address)) + (await ethers.provider.getBalance(etherbase)) .should.be.equal(0); - (await agent.getBalance()) - .should.be.gt(etherbaseBalance); + + agentBalance = await ethers.provider.getBalance(agent); + agentBalance.should.be.gt(etherbaseBalance); await deployer.sendTransaction({to: agent.address, value: rest}); }); @@ -1674,102 +1660,102 @@ describe("MessageProxy", () => { describe("register and remove extra contracts", async () => { it("should register extra contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForSchain.connect(user).registerExtraContract(schainName, messages.address) + await messageProxyForSchain.connect(user).registerExtraContract(schainName, messages.getAddress()) .should.be.eventually.rejectedWith("EXTRA_CONTRACT_REGISTRAR_ROLE is required"); await messageProxyForSchain.registerExtraContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Given address is not a contract"); expect((await messageProxyForSchain.getContractRegisteredLength(schainHash)).toString()).to.be.equal("1"); - expect(await messageProxyForSchain.isContractRegistered(schainHash, messages.address)).to.be.equal(false); - await messageProxyForSchain.registerExtraContract(schainName, messages.address); - expect(await messageProxyForSchain.isContractRegistered(schainHash, messages.address)).to.be.equal(true); + expect(await messageProxyForSchain.isContractRegistered(schainHash, messages.getAddress())).to.be.equal(false); + await messageProxyForSchain.registerExtraContract(schainName, messages.getAddress()); + expect(await messageProxyForSchain.isContractRegistered(schainHash, messages.getAddress())).to.be.equal(true); expect((await messageProxyForSchain.getContractRegisteredLength(schainHash)).toString()).to.be.equal("2"); expect((await messageProxyForSchain.getContractRegisteredRange(schainHash, 0, 1)).length).to.be.equal(1); - expect((await messageProxyForSchain.getContractRegisteredRange(schainHash, 0, 2))[1]).to.be.equal(messages.address); + expect((await messageProxyForSchain.getContractRegisteredRange(schainHash, 0, 2))[1]).to.be.equal(messages); await messageProxyForSchain.getContractRegisteredRange(schainHash, 0, 11).should.be.eventually.rejectedWith("Range is incorrect"); await messageProxyForSchain.getContractRegisteredRange(schainHash, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); - await messageProxyForSchain.registerExtraContract(schainName, messages.address) + await messageProxyForSchain.registerExtraContract(schainName, messages.getAddress()) .should.be.eventually.rejectedWith("Extra contract is already registered"); }); it("should register extra contract for all", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForSchain.connect(user).registerExtraContractForAll(messages.address) + await messageProxyForSchain.connect(user).registerExtraContractForAll(messages.getAddress()) .should.be.eventually.rejectedWith("EXTRA_CONTRACT_REGISTRAR_ROLE is required"); await messageProxyForSchain.registerExtraContractForAll(fakeContractOnSchain) .should.be.eventually.rejectedWith("Given address is not a contract"); expect((await messageProxyForSchain.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("0"); - expect(await messageProxyForSchain.isContractRegistered(zeroBytes32, messages.address)).to.be.equal(false); - await messageProxyForSchain.registerExtraContractForAll(messages.address); + expect(await messageProxyForSchain.isContractRegistered(zeroBytes32, messages.getAddress())).to.be.equal(false); + await messageProxyForSchain.registerExtraContractForAll(messages.getAddress()); - expect(await messageProxyForSchain.isContractRegistered(zeroBytes32, messages.address)).to.be.equal(true); + expect(await messageProxyForSchain.isContractRegistered(zeroBytes32, messages.getAddress())).to.be.equal(true); expect((await messageProxyForSchain.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("1"); expect((await messageProxyForSchain.getContractRegisteredRange(zeroBytes32, 0, 1)).length).to.be.equal(1); - expect((await messageProxyForSchain.getContractRegisteredRange(zeroBytes32, 0, 1))[0]).to.be.equal(messages.address); + expect((await messageProxyForSchain.getContractRegisteredRange(zeroBytes32, 0, 1))[0]).to.be.equal(messages); await messageProxyForSchain.getContractRegisteredRange(zeroBytes32, 0, 11).should.be.eventually.rejectedWith("Range is incorrect"); await messageProxyForSchain.getContractRegisteredRange(zeroBytes32, 1, 0).should.be.eventually.rejectedWith("Range is incorrect"); - await messageProxyForSchain.registerExtraContract(schainName, messages.address) + await messageProxyForSchain.registerExtraContract(schainName, messages.getAddress()) .should.be.eventually.rejectedWith("Extra contract is already registered for all chains"); - await messageProxyForSchain.registerExtraContractForAll(messages.address) + await messageProxyForSchain.registerExtraContractForAll(messages.getAddress()) .should.be.eventually.rejectedWith("Extra contract is already registered"); }); it("should remove extra contract", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForSchain.connect(user).removeExtraContract(schainName, messages.address) + await messageProxyForSchain.connect(user).removeExtraContract(schainName, messages.getAddress()) .should.be.eventually.rejectedWith("EXTRA_CONTRACT_REGISTRAR_ROLE is required"); await messageProxyForSchain.removeExtraContract(schainName, fakeContractOnSchain) .should.be.eventually.rejectedWith("Extra contract is not registered"); expect((await messageProxyForSchain.getContractRegisteredLength(schainHash)).toString()).to.be.equal("1"); await expect( - messageProxyForSchain.registerExtraContract(schainName, messages.address) + messageProxyForSchain.registerExtraContract(schainName, messages.getAddress()) ).to.emit( messageProxyForSchain, "ExtraContractRegistered" - ).withArgs(schainHash, messages.address); + ).withArgs(schainHash, messages.getAddress()); expect((await messageProxyForSchain.getContractRegisteredLength(schainHash)).toString()).to.be.equal("2"); await expect( - messageProxyForSchain.removeExtraContract(schainName, messages.address) + messageProxyForSchain.removeExtraContract(schainName, messages.getAddress()) ).to.emit( messageProxyForSchain, "ExtraContractRemoved" - ).withArgs(schainHash, messages.address); + ).withArgs(schainHash, messages.getAddress()); expect((await messageProxyForSchain.getContractRegisteredLength(schainHash)).toString()).to.be.equal("1"); - await messageProxyForSchain.removeExtraContract(schainName, messages.address) + await messageProxyForSchain.removeExtraContract(schainName, messages.getAddress()) .should.be.eventually.rejectedWith("Extra contract is not registered"); - expect(await messageProxyForSchain.isContractRegistered(schainHash, messages.address)).to.be.equal(false); + expect(await messageProxyForSchain.isContractRegistered(schainHash, messages.getAddress())).to.be.equal(false); }); it("should remove extra contract for all", async () => { const fakeContractOnSchain = deployer.address; - await messageProxyForSchain.connect(user).removeExtraContractForAll(messages.address) + await messageProxyForSchain.connect(user).removeExtraContractForAll(messages.getAddress()) .should.be.eventually.rejectedWith("EXTRA_CONTRACT_REGISTRAR_ROLE is required"); await messageProxyForSchain.removeExtraContractForAll(fakeContractOnSchain) .should.be.eventually.rejectedWith("Extra contract is not registered"); expect((await messageProxyForSchain.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("0"); await expect( - messageProxyForSchain.registerExtraContractForAll(messages.address) + messageProxyForSchain.registerExtraContractForAll(messages.getAddress()) ).to.emit( messageProxyForSchain, "ExtraContractRegistered" - ).withArgs(zeroBytes32, messages.address); + ).withArgs(zeroBytes32, messages.getAddress()); expect((await messageProxyForSchain.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("1"); await expect( - messageProxyForSchain.removeExtraContractForAll(messages.address) + messageProxyForSchain.removeExtraContractForAll(messages.getAddress()) ).to.emit( messageProxyForSchain, "ExtraContractRemoved" - ).withArgs(zeroBytes32, messages.address); + ).withArgs(zeroBytes32, messages.getAddress()); expect((await messageProxyForSchain.getContractRegisteredLength(zeroBytes32)).toString()).to.be.equal("0"); - await messageProxyForSchain.removeExtraContractForAll(messages.address) + await messageProxyForSchain.removeExtraContractForAll(messages.getAddress()) .should.be.eventually.rejectedWith("Extra contract is not registered"); }); }); diff --git a/proxy/test/TokenManagerERC1155.ts b/test/TokenManagerERC1155.ts similarity index 71% rename from proxy/test/TokenManagerERC1155.ts rename to test/TokenManagerERC1155.ts index 8c72b7d6d..f9bf5ea39 100644 --- a/proxy/test/TokenManagerERC1155.ts +++ b/test/TokenManagerERC1155.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ERC1155OnChain, TokenManagerERC1155, @@ -34,7 +34,7 @@ import { CommunityLocker } from "../typechain"; -import { stringKeccak256 } from "./utils/helper"; + import { skipTime } from "./utils/time"; chai.should(); @@ -48,8 +48,7 @@ import { deployMessages } from "./utils/deploy/messages"; import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; @@ -60,13 +59,13 @@ describe("TokenManagerERC1155", () => { let schainOwner: SignerWithAddress; const schainName = "V-chain"; - const schainId = stringKeccak256(schainName); + const schainId = ethers.id(schainName); const id = 1; const amount = 4; const ids = [1, 2, 3, 4]; const amounts = [4, 3, 2, 1]; const mainnetName = "Mainnet"; - const mainnetId = stringKeccak256("Mainnet"); + const mainnetId = ethers.id("Mainnet"); let to: string; let token: ERC1155OnChain; let fakeDepositBox: string; @@ -86,23 +85,23 @@ describe("TokenManagerERC1155", () => { beforeEach(async () => { const keyStorage = await deployKeyStorageMock(); - messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage, schainName); tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, deployer.address); messages = await deployMessages(); - fakeDepositBox = messages.address; - fakeCommunityPool = messages.address; + fakeDepositBox = user.address; + fakeCommunityPool = user.address; - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, fakeCommunityPool); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, fakeCommunityPool); tokenManagerERC1155 = await deployTokenManagerERC1155( schainName, - messageProxyForSchain.address, + messageProxyForSchain, tokenManagerLinker, communityLocker, fakeDepositBox ); - await tokenManagerLinker.registerTokenManager(tokenManagerERC1155.address); + await tokenManagerLinker.registerTokenManager(tokenManagerERC1155); await tokenManagerERC1155.grantRole(await tokenManagerERC1155.TOKEN_REGISTRAR_ROLE(), schainOwner.address); await tokenManagerERC1155.grantRole(await tokenManagerERC1155.AUTOMATIC_DEPLOY_ROLE(), schainOwner.address); @@ -114,16 +113,16 @@ describe("TokenManagerERC1155", () => { to = user.address; const data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain.postMessage(communityLocker, mainnetId, fakeCommunityPool, data); const extraContractRegistrarRole = await messageProxyForSchain.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC1155.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC1155); }); it("should change depositBox address", async () => { const newDepositBox = user.address; - expect(await tokenManagerERC1155.depositBox()).to.equal(messages.address); + expect(await tokenManagerERC1155.depositBox()).to.equal(fakeDepositBox); await tokenManagerERC1155.connect(user).changeDepositBoxAddress(newDepositBox) .should.be.eventually.rejectedWith("DEFAULT_ADMIN_ROLE is required"); await tokenManagerERC1155.changeDepositBoxAddress(newDepositBox); @@ -132,61 +131,57 @@ describe("TokenManagerERC1155", () => { it("should successfully call exitToMainERC1155", async () => { // should be "No token clone on schain" if chains were different - await tokenManagerERC1155.connect(user).exitToMainERC1155(token.address, id, amount) + await tokenManagerERC1155.connect(user).exitToMainERC1155(token, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenManagerERC1155.connect(user).exitToMainERC1155(token.address, id, amount) + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, tokenClone); + await tokenManagerERC1155.connect(user).exitToMainERC1155(token, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); await tokenClone.connect(deployer).mint(user.address, id, amount, "0x"); - await tokenManagerERC1155.connect(user).exitToMainERC1155(token.address, id, amount) + await tokenManagerERC1155.connect(user).exitToMainERC1155(token, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await tokenClone.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); - await tokenManagerERC1155.connect(user).exitToMainERC1155(token.address, id, amount); + await tokenClone.connect(user).setApprovalForAll(tokenManagerERC1155, true); + await tokenManagerERC1155.connect(user).exitToMainERC1155(token, id, amount); - const outgoingMessagesCounterMainnet = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet") - ); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); it("should successfully call exitToMainERC1155Batch", async () => { // should be "No token clone on schain" if chains were different - await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token.address, ids, amounts) + await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token.address, ids, amounts) + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, tokenClone); + await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); await tokenClone.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token.address, ids, amounts) + await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await tokenClone.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); - await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token.address, ids, amounts); + await tokenClone.connect(user).setApprovalForAll(tokenManagerERC1155, true); + await tokenManagerERC1155.connect(user).exitToMainERC1155Batch(token, ids, amounts); - const outgoingMessagesCounterMainnet = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet") - ); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); it("should successfully call addERC1155TokenByOwner", async () => { - await tokenManagerERC1155.connect(user).addERC1155TokenByOwner(mainnetName, token.address, tokenClone.address) + await tokenManagerERC1155.connect(user).addERC1155TokenByOwner(mainnetName, token, tokenClone) .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, deployer.address) + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, deployer.address) .should.be.eventually.rejectedWith("Given address is not a contract"); - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, tokenClone.address); + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, tokenClone); - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token2.address, tokenClone.address) + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token2, tokenClone) .should.be.eventually.rejectedWith("Clone was already added"); - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, tokenClone2.address) + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, tokenClone2) .should.be.eventually.rejectedWith("Could not relink clone"); }); @@ -199,20 +194,20 @@ describe("TokenManagerERC1155", () => { let tokenManagerERC11552: TokenManagerERC1155; let communityLocker2: CommunityLocker; const newSchainName = "NewChain"; - const newSchainId = stringKeccak256(newSchainName); + const newSchainId = ethers.id(newSchainName); beforeEach(async () => { erc1155OnOriginChain = await deployERC1155OnChain("NewToken"); erc1155OnTargetChain = await deployERC1155OnChain("NewToke1n"); const keyStorage2 = await deployKeyStorageMock(); - messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2.address, newSchainName); + messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2, newSchainName); tokenManagerLinker2 = await deployTokenManagerLinker(messageProxyForSchain2, deployer.address); - communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, fakeCommunityPool); - tokenManagerERC11552 = await deployTokenManagerERC1155(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, communityLocker2, fakeDepositBox); - await erc1155OnTargetChain.connect(deployer).grantRole(await erc1155OnTargetChain.MINTER_ROLE(), tokenManagerERC11552.address); - await tokenManagerLinker2.registerTokenManager(tokenManagerERC11552.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC11552.address); + communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2, tokenManagerLinker2, fakeCommunityPool); + tokenManagerERC11552 = await deployTokenManagerERC1155(newSchainName, messageProxyForSchain2, tokenManagerLinker2, communityLocker2, fakeDepositBox); + await erc1155OnTargetChain.connect(deployer).grantRole(await erc1155OnTargetChain.MINTER_ROLE(), tokenManagerERC11552); + await tokenManagerLinker2.registerTokenManager(tokenManagerERC11552); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC11552); }); it("should invoke `transferToSchainERC1155` without mistakes", async () => { @@ -221,29 +216,28 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should reject `transferToSchainERC1155` when executing earlier then allowed", async () => { @@ -252,32 +246,32 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, 5, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, 1) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, 1) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(1)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(1); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); @@ -285,52 +279,52 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(90); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(20); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(3)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(3); await communityLocker.setTimeLimitPerMessage(newSchainName, 0); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await skipTime(110); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, 1); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(5)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(5); }); it("should invoke `transferToSchainERC1155` and receive tokens without mistakes", async () => { @@ -339,27 +333,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); const data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -369,25 +363,26 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); - const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); + const targetErc1155OnChain = (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); }); @@ -397,27 +392,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -427,25 +422,26 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); - const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); + const targetErc1155OnChain = (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); const amount2 = 77; @@ -453,20 +449,20 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount2); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount2); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountSum = 81; - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); }); @@ -476,27 +472,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -506,24 +502,29 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address).should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); + await tokenManagerERC11552 + .connect(schainOwner) + .addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain) + .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address).should.be.eventually.rejectedWith("Chain is not connected"); + await tokenManagerERC11552 + .connect(schainOwner) + .addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain) + .should.be.eventually.rejectedWith("Chain is not connected"); await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - expect((await erc1155OnTargetChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await erc1155OnTargetChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); const amount2 = 77; @@ -531,20 +532,20 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount2); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount2); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountSum = 81; - expect((await erc1155OnTargetChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); + expect((await erc1155OnTargetChain.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); }); @@ -554,27 +555,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -584,57 +585,56 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); }); @@ -644,27 +644,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -674,51 +674,52 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552 + .connect(schainOwner) + .addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); }); @@ -729,27 +730,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -759,73 +760,74 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); const amount2 = 77; @@ -833,51 +835,51 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount2); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount2); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountSum = 81; - expect((await targetErc1155OnChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); + expect((await targetErc1155OnChain.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); - await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount2); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount2); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount2 ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); }); @@ -887,27 +889,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -917,68 +919,67 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155("Mainnet", erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155("Mainnet", erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - expect((await erc1155OnTargetChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await erc1155OnTargetChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); const amount2 = 77; @@ -986,51 +987,51 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount2); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount2); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountSum = 81; - expect((await erc1155OnTargetChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); + expect((await erc1155OnTargetChain.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount2); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount2); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount2 ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amountSum.toString()); }); @@ -1040,17 +1041,17 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); const data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -1060,49 +1061,50 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - expect((await erc1155OnTargetChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await erc1155OnTargetChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); const newSchainNameZ = "NewChainZ"; const erc1155OnTargetZChain = await deployERC1155OnChain("NewTokenZ"); const keyStorageZ = await deployKeyStorageMock(); - const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ.address, newSchainNameZ); + const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ, newSchainNameZ); const tokenManagerLinkerZ = await deployTokenManagerLinker(messageProxyForSchainZ, deployer.address); - const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ.address, tokenManagerLinkerZ, fakeCommunityPool); - const tokenManagerERC1155Z = await deployTokenManagerERC1155(newSchainNameZ, messageProxyForSchainZ.address, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); - await erc1155OnTargetZChain.connect(deployer).grantRole(await erc1155OnTargetZChain.MINTER_ROLE(), tokenManagerERC1155Z.address); - await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC1155Z.address); + const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ, tokenManagerLinkerZ, fakeCommunityPool); + const tokenManagerERC1155Z = await deployTokenManagerERC1155( + newSchainNameZ, messageProxyForSchainZ, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox + ); + await erc1155OnTargetZChain.connect(deployer).grantRole(await erc1155OnTargetZChain.MINTER_ROLE(), tokenManagerERC1155Z); + await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC1155Z); await messageProxyForSchain2.connect(deployer).grantRole(await messageProxyForSchain2.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain2.connect(deployer).addConnectedChain(newSchainNameZ); - await tokenManagerERC11552.addTokenManager(newSchainNameZ, tokenManagerERC1155Z.address); + await tokenManagerERC11552.addTokenManager(newSchainNameZ, tokenManagerERC1155Z); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(newSchainNameZ, erc1155OnOriginChain.address, id, amount) + .transferToSchainERC1155(newSchainNameZ, erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(newSchainNameZ, erc1155OnTargetChain.address, id, amount) + .transferToSchainERC1155(newSchainNameZ, erc1155OnTargetChain, id, amount) .should.be.eventually.rejectedWith("Incorrect main chain token"); }); @@ -1112,17 +1114,17 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mint(user.address, id, amount, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155(newSchainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(newSchainName, erc1155OnOriginChain, id, amount); let data = await messages.encodeTransferErc1155AndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount, @@ -1132,61 +1134,60 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - expect((await erc1155OnTargetChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await erc1155OnTargetChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain2.postMessage(communityLocker2.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain2.postMessage(communityLocker2, mainnetId, fakeCommunityPool, data); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .exitToMainERC1155(erc1155OnOriginChain.address, id, amount) + .exitToMainERC1155(erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); await tokenManagerERC11552 .connect(user) - .exitToMainERC1155(erc1155OnTargetChain.address, id, amount) + .exitToMainERC1155(erc1155OnTargetChain, id, amount) .should.be.eventually.rejectedWith("Incorrect main chain token"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155(schainName, erc1155OnOriginChain.address, id, amount); + .transferToSchainERC1155(schainName, erc1155OnOriginChain, id, amount); data = await messages.encodeTransferErc1155Message( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); - expect((await erc1155OnOriginChain.functions.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); + expect((await erc1155OnOriginChain.balanceOf(user.address, id)).toString()).to.be.equal(amount.toString()); await tokenManagerERC1155 .connect(user) - .exitToMainERC1155(erc1155OnOriginChain.address, id, amount) + .exitToMainERC1155(erc1155OnOriginChain, id, amount) .should.be.eventually.rejectedWith("Main chain token could not be transfered to Mainnet"); await tokenManagerERC1155 .connect(user) - .exitToMainERC1155(erc1155OnTargetChain.address, id, amount) + .exitToMainERC1155(erc1155OnTargetChain, id, amount) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); }); @@ -1202,20 +1203,20 @@ describe("TokenManagerERC1155", () => { let tokenManagerERC11552: TokenManagerERC1155; let communityLocker2: CommunityLocker; const newSchainName = "NewChain"; - const newSchainId = stringKeccak256(newSchainName); + const newSchainId = ethers.id(newSchainName); beforeEach(async () => { erc1155OnOriginChain = await deployERC1155OnChain("NewToken"); erc1155OnTargetChain = await deployERC1155OnChain("NewToke1n"); const keyStorage2 = await deployKeyStorageMock(); - messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2.address, newSchainName); + messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2, newSchainName); tokenManagerLinker2 = await deployTokenManagerLinker(messageProxyForSchain2, deployer.address); - communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, fakeCommunityPool); - tokenManagerERC11552 = await deployTokenManagerERC1155(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, communityLocker2, fakeDepositBox); - await erc1155OnTargetChain.connect(deployer).grantRole(await erc1155OnTargetChain.MINTER_ROLE(), tokenManagerERC11552.address); - await tokenManagerLinker2.registerTokenManager(tokenManagerERC11552.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC11552.address); + communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2, tokenManagerLinker2, fakeCommunityPool); + tokenManagerERC11552 = await deployTokenManagerERC1155(newSchainName, messageProxyForSchain2, tokenManagerLinker2, communityLocker2, fakeDepositBox); + await erc1155OnTargetChain.connect(deployer).grantRole(await erc1155OnTargetChain.MINTER_ROLE(), tokenManagerERC11552); + await tokenManagerLinker2.registerTokenManager(tokenManagerERC11552); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC11552); }); it("should invoke `transferToSchainERC1155` without mistakes", async () => { @@ -1224,29 +1225,28 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should reject `transferToSchainERC1155` when executing earlier then allowed", async () => { @@ -1255,32 +1255,32 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, [5, 5, 5, 5], "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, [1, 1, 1, 1]) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, [1, 1, 1, 1]) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(1)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(1); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); @@ -1288,52 +1288,52 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(90); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(20); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(3)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(3); await communityLocker.setTimeLimitPerMessage(newSchainName, 0); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await skipTime(110); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, [1, 1, 1, 1]); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, [1, 1, 1, 1]); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(5)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(5); }); it("should invoke `transferToSchainERC1155` and receive tokens without mistakes", async () => { @@ -1342,27 +1342,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); const data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1372,29 +1372,28 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; const balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); const balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -1406,27 +1405,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1436,29 +1435,28 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; let balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); let balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -1468,23 +1466,23 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts2); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts2); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountsSum = [81, 81, 81, 81]; balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amountsSum); @@ -1496,27 +1494,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1526,27 +1524,26 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address).should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain).should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address).should.be.eventually.rejectedWith("Chain is not connected"); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain).should.be.eventually.rejectedWith("Chain is not connected"); await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); let balanceIds = await erc1155OnTargetChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); let balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -1556,23 +1553,23 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts2); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts2); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountsSum = [81, 81, 81, 81]; balanceIds = await erc1155OnTargetChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amountsSum); @@ -1584,27 +1581,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1614,66 +1611,67 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; let balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); let balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -1685,27 +1683,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1715,55 +1713,54 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); const balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); const balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -1776,27 +1773,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1806,88 +1803,89 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC11552.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); - const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain.address); + const addressERC1155OnSchain = await tokenManagerERC11552.clonesErc1155(schainId, erc1155OnOriginChain); const targetErc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; let balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); let balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -1897,65 +1895,65 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts2); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts2); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountsSum = [81, 81, 81, 81]; balanceIds = await targetErc1155OnChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amountsSum); - await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await targetErc1155OnChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts2); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts2); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts2 ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amountsSum); @@ -1967,27 +1965,27 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -1997,77 +1995,76 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch("Mainnet", erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); let balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); let balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); balanceIds = await erc1155OnTargetChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -2077,65 +2074,65 @@ describe("TokenManagerERC1155", () => { await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts2); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts2); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const amountsSum = [81, 81, 81, 81]; balanceIds = await erc1155OnTargetChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amountsSum); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts2); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts2); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts2 ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amountsSum); @@ -2147,17 +2144,17 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); const data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -2167,24 +2164,23 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); const balanceIds = await erc1155OnTargetChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); const balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); @@ -2193,28 +2189,28 @@ describe("TokenManagerERC1155", () => { const erc1155OnTargetZChain = await deployERC1155OnChain("NewTokenZ"); const keyStorageZ = await deployKeyStorageMock(); - const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ.address, newSchainNameZ); + const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ, newSchainNameZ); const tokenManagerLinkerZ = await deployTokenManagerLinker(messageProxyForSchainZ, deployer.address); - const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ.address, tokenManagerLinkerZ, fakeCommunityPool); - const tokenManagerERC1155Z = await deployTokenManagerERC1155(newSchainNameZ, messageProxyForSchainZ.address, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); - await erc1155OnTargetZChain.connect(deployer).grantRole(await erc1155OnTargetZChain.MINTER_ROLE(), tokenManagerERC1155Z.address); - await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC1155Z.address); + const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ, tokenManagerLinkerZ, fakeCommunityPool); + const tokenManagerERC1155Z = await deployTokenManagerERC1155(newSchainNameZ, messageProxyForSchainZ, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); + await erc1155OnTargetZChain.connect(deployer).grantRole(await erc1155OnTargetZChain.MINTER_ROLE(), tokenManagerERC1155Z); + await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC1155Z); await messageProxyForSchain2.connect(deployer).grantRole(await messageProxyForSchain2.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain2.connect(deployer).addConnectedChain(newSchainNameZ); - await tokenManagerERC11552.addTokenManager(newSchainNameZ, tokenManagerERC1155Z.address); + await tokenManagerERC11552.addTokenManager(newSchainNameZ, tokenManagerERC1155Z); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(newSchainNameZ, erc1155OnOriginChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainNameZ, erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(newSchainNameZ, erc1155OnTargetChain.address, ids, amounts) + .transferToSchainERC1155Batch(newSchainNameZ, erc1155OnTargetChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect main chain token"); }); @@ -2224,17 +2220,17 @@ describe("TokenManagerERC1155", () => { await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc1155OnOriginChain.connect(deployer).mintBatch(user.address, ids, amounts, "0x"); - await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155.address, true); + await erc1155OnOriginChain.connect(user).setApprovalForAll(tokenManagerERC1155, true); - await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552.address); + await tokenManagerERC1155.addTokenManager(newSchainName, tokenManagerERC11552); // execution: await tokenManagerERC1155 .connect(user) - .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(newSchainName, erc1155OnOriginChain, ids, amounts); let data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts, @@ -2244,71 +2240,70 @@ describe("TokenManagerERC1155", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155.address); + await tokenManagerERC11552.addTokenManager(schainName, tokenManagerERC1155); await tokenManagerERC11552.connect(deployer).grantRole(await tokenManagerERC11552.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain.address, erc1155OnTargetChain.address); + await tokenManagerERC11552.connect(schainOwner).addERC1155TokenByOwner(schainName, erc1155OnOriginChain, erc1155OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC11552.address, schainId, tokenManagerERC1155.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC11552, schainId, tokenManagerERC1155, data); let balanceIds = await erc1155OnTargetChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); let balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain2.postMessage(communityLocker2.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain2.postMessage(communityLocker2, mainnetId, fakeCommunityPool, data); - await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552.address, true); + await erc1155OnTargetChain.connect(user).setApprovalForAll(tokenManagerERC11552, true); await tokenManagerERC11552 .connect(user) - .exitToMainERC1155Batch(erc1155OnOriginChain.address, ids, amounts) + .exitToMainERC1155Batch(erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); await tokenManagerERC11552 .connect(user) - .exitToMainERC1155Batch(erc1155OnTargetChain.address, ids, amounts) + .exitToMainERC1155Batch(erc1155OnTargetChain, ids, amounts) .should.be.eventually.rejectedWith("Incorrect main chain token"); await tokenManagerERC11552 .connect(user) - .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain.address, ids, amounts); + .transferToSchainERC1155Batch(schainName, erc1155OnOriginChain, ids, amounts); data = await messages.encodeTransferErc1155BatchMessage( - erc1155OnOriginChain.address, + erc1155OnOriginChain, user.address, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, newSchainId, tokenManagerERC11552.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC1155, newSchainId, tokenManagerERC11552, data); balanceIds = await erc1155OnOriginChain.balanceOfBatch([user.address, user.address, user.address, user.address], ids); balanceIdsNumber = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); await tokenManagerERC1155 .connect(user) - .exitToMainERC1155Batch(erc1155OnOriginChain.address, ids, amounts) + .exitToMainERC1155Batch(erc1155OnOriginChain, ids, amounts) .should.be.eventually.rejectedWith("Main chain token could not be transfered to Mainnet"); await tokenManagerERC1155 .connect(user) - .exitToMainERC1155Batch(erc1155OnTargetChain.address, ids, amounts) + .exitToMainERC1155Batch(erc1155OnTargetChain, ids, amounts) .should.be.eventually.rejectedWith("Not allowed ERC1155 Token"); }); @@ -2320,7 +2315,7 @@ describe("TokenManagerERC1155", () => { it("should transfer ERC1155 token through `postMessage` function with token info", async () => { // preparation const data = await messages.encodeTransferErc1155AndTokenInfoMessage( - token.address, + token, to, id, amount, @@ -2329,38 +2324,38 @@ describe("TokenManagerERC1155", () => { } ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC1155.connect(schainOwner).enableAutomaticDeploy(); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data); - const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token.address); + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data); + const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token); const erc1155OnChain = (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; - expect(BigNumber.from((await erc1155OnChain.functions.balanceOf(to, id))[0]).toNumber()).to.be.equal(amount); + expect(await erc1155OnChain.balanceOf(to, id)).to.be.equal(amount); }); it("should transfer ERC1155 token on schain", async () => { // preparation - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC1155.address); + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, tokenClone); + await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC1155); const data = await messages.encodeTransferErc1155Message( - token.address, + token, to, id, amount ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data); - const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token.address); + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data); + const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token); const erc1155OnChain = (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; - expect(BigNumber.from((await erc1155OnChain.functions.balanceOf(to, id))[0]).toNumber()).to.be.equal(amount); + expect(await erc1155OnChain.balanceOf(to, id)).to.be.equal(amount); }); it("should transfer ERC1155 token batch through `postMessage` function with token info", async () => { // preparation const data = await messages.encodeTransferErc1155BatchAndTokenInfoMessage( - token.address, + token, to, ids, amounts, @@ -2369,41 +2364,41 @@ describe("TokenManagerERC1155", () => { } ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC1155.connect(schainOwner).enableAutomaticDeploy(); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data); - const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token.address); - const erc1155OnChain = await (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data); + const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token); + const erc1155OnChain = (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; const balanceIds = await erc1155OnChain.balanceOfBatch([to, to, to, to], ids); const balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); }); it("should transfer ERC1155 token batch on schain", async () => { // preparation - await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC1155.address); + await tokenManagerERC1155.connect(schainOwner).addERC1155TokenByOwner(mainnetName, token, tokenClone); + await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC1155); const data = await messages.encodeTransferErc1155BatchMessage( - token.address, + token, to, ids, amounts ); - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data); - const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token.address); + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data); + const addressERC1155OnSchain = await tokenManagerERC1155.clonesErc1155(mainnetId, token); const erc1155OnChain = (await ethers.getContractFactory("ERC1155OnChain")).attach(addressERC1155OnSchain) as ERC1155OnChain; const balanceIds = await erc1155OnChain.balanceOfBatch([to, to, to, to], ids); const balanceIdsNumber: number[] = []; balanceIds.forEach((element) => { - balanceIdsNumber.push(BigNumber.from(element).toNumber()) + balanceIdsNumber.push(Number(element)) }); expect(balanceIdsNumber).to.deep.equal(amounts); }); @@ -2413,7 +2408,7 @@ describe("TokenManagerERC1155", () => { "000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0"+ "00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"+ "0000000000000000000000000000000000000000000000000000000000000001"; - await messageProxyForSchain.postMessage(tokenManagerERC1155.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC1155, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("MessageType is unknown"); }); diff --git a/proxy/test/TokenManagerERC20.ts b/test/TokenManagerERC20.ts similarity index 71% rename from proxy/test/TokenManagerERC20.ts rename to test/TokenManagerERC20.ts index dcf55fa3d..cb47f243b 100644 --- a/proxy/test/TokenManagerERC20.ts +++ b/test/TokenManagerERC20.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ERC20OnChain, MessagesTester, @@ -47,13 +47,11 @@ import { deployMessages } from "./utils/deploy/messages"; import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { assert, expect } from "chai"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; import { skipTime } from "./utils/time"; -import { stringKeccak256 } from "./utils/helper"; describe("TokenManagerERC20", () => { let deployer: SignerWithAddress; @@ -62,8 +60,8 @@ describe("TokenManagerERC20", () => { const mainnetName = "Mainnet"; const schainName = "D2-chain"; - const schainId = stringKeccak256(schainName); - const mainnetId = stringKeccak256("Mainnet"); + const schainId = ethers.id(schainName); + const mainnetId = ethers.id("Mainnet"); let fakeDepositBox: string; let fakeCommunityPool: string; let erc20OnChain: ERC20OnChain; @@ -84,21 +82,21 @@ describe("TokenManagerERC20", () => { erc20OnChain = await deployERC20OnChain("ERC20OnChain", "ERC20"); erc20OnMainnet = await deployERC20OnChain("SKALE", "SKL"); messages = await deployMessages(); - fakeDepositBox = messages.address; - fakeCommunityPool = messages.address; + fakeDepositBox = user.address; + fakeCommunityPool = user.address; const keyStorage = await deployKeyStorageMock(); - messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage, schainName); tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, deployer.address); - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, fakeCommunityPool); - tokenManagerErc20 = await deployTokenManagerERC20(schainName, messageProxyForSchain.address, tokenManagerLinker, communityLocker, fakeDepositBox); - await erc20OnChain.connect(deployer).grantRole(await erc20OnChain.MINTER_ROLE(), tokenManagerErc20.address); - await tokenManagerLinker.registerTokenManager(tokenManagerErc20.address); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, fakeCommunityPool); + tokenManagerErc20 = await deployTokenManagerERC20(schainName, messageProxyForSchain, tokenManagerLinker, communityLocker, fakeDepositBox); + await erc20OnChain.connect(deployer).grantRole(await erc20OnChain.MINTER_ROLE(), tokenManagerErc20); + await tokenManagerLinker.registerTokenManager(tokenManagerErc20); await tokenManagerErc20.connect(deployer).grantRole(await tokenManagerErc20.TOKEN_REGISTRAR_ROLE(), schainOwner.address); await tokenManagerErc20.connect(deployer).grantRole(await tokenManagerErc20.AUTOMATIC_DEPLOY_ROLE(), schainOwner.address); const data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain.postMessage(communityLocker, mainnetId, fakeCommunityPool, data); const extraContractRegistrarRole = await messageProxyForSchain.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); @@ -130,49 +128,49 @@ describe("TokenManagerERC20", () => { const symbol = "D2"; const totalSupply = 1e9; - const data = await messages.encodeTransferErc20AndTokenInfoMessage(erc20OnMainnet.address, to, amount, totalSupply, { name, symbol, decimals: 18 }); - const data2 = await messages.encodeTransferErc20AndTokenInfoMessage(erc20OnMainnet.address, to, amount, totalSupply, { name, symbol, decimals: 18 }); + const data = await messages.encodeTransferErc20AndTokenInfoMessage(erc20OnMainnet, to, amount, totalSupply, { name, symbol, decimals: 18 }); + const data2 = await messages.encodeTransferErc20AndTokenInfoMessage(erc20OnMainnet, to, amount, totalSupply, { name, symbol, decimals: 18 }); await tokenManagerErc20.connect(schainOwner).enableAutomaticDeploy(); - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); // execution - const res = await (await messageProxyForSchain.postMessage(tokenManagerErc20.address, mainnetId, fakeDepositBox, data)).wait(); + const receipt = await (await messageProxyForSchain.postMessage(tokenManagerErc20, mainnetId, fakeDepositBox, data)).wait(); - let newAddress: string; // TODO: use waffle - if (!res.events) { + + if (!receipt?.logs) { assert("No events were emitted"); } else { - newAddress = "0x" + res.events[res.events.length - 1].topics[3].slice(-40); + const newAddress = "0x" + receipt.logs[receipt.logs.length - 1].topics[3].slice(-40); const newERC20Contract = (await ethers.getContractFactory("ERC20OnChain")).attach(newAddress) as ERC20OnChain; - let balance = await newERC20Contract.functions.balanceOf(to); + let balance = await newERC20Contract.balanceOf(to); parseInt(balance.toString(), 10).should.be.equal(amount); // expectation - await messageProxyForSchain.postMessage(tokenManagerErc20.address, mainnetId, fakeDepositBox, data2); - balance = await newERC20Contract.functions.balanceOf(to); + await messageProxyForSchain.postMessage(tokenManagerErc20, mainnetId, fakeDepositBox, data2); + balance = await newERC20Contract.balanceOf(to); parseInt(balance.toString(), 10).should.be.equal(amount * 2); } }); it("should reject with `Insufficient funds` if token balance is too low", async () => { // preparation - const error = "insufficient funds"; + const error = "Insufficient funds"; const amount = 10; // execution/expectation - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet.address, erc20OnChain.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnChain); - await erc20OnChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .exitToMainERC20(erc20OnMainnet.address, amount) + .exitToMainERC20(erc20OnMainnet, amount) .should.be.eventually.rejectedWith(error); }); it("should add token by owner", async () => { // preparation - const addressERC20 = erc20OnChain.address; - const addressERC201 = erc20OnMainnet.address; + const addressERC20 = erc20OnChain; + const addressERC201 = erc20OnMainnet; const automaticDeploy = await tokenManagerErc20.automaticDeploy(); await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, addressERC201, addressERC20); // automaticDeploy == true - enabled automaticDeploy = false - disabled @@ -193,40 +191,36 @@ describe("TokenManagerERC20", () => { await tokenManagerErc20.connect(schainOwner).disableAutomaticDeploy(); } - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet2.address, eRC20OnChain2.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet2, eRC20OnChain2); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet2.address, deployer.address) + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet2, deployer.address) .should.be.eventually.rejectedWith("Given address is not a contract"); await eRC20OnChain2.mint(user.address, 1); await eRC20OnChain3.mint(user.address, 1); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet3.address, addressERC20) + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet3, addressERC20) .should.be.eventually.rejectedWith("Clone was already added"); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet3.address, eRC20OnChain3.address) + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, eRC20OnMainnet3, eRC20OnChain3) .should.be.eventually.rejectedWith("Total supply of a new token is not zero"); }); describe("when token added by owner", async () => { - const mainnetChainHash = stringKeccak256(mainnetName); - let erc20OnSchainTokenAddress: string; - let erc20OnOriginChainTokenAddress: string; + const mainnetChainHash = ethers.id(mainnetName); beforeEach(async () => { - erc20OnSchainTokenAddress = erc20OnChain.address; - erc20OnOriginChainTokenAddress = erc20OnMainnet.address; - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnOriginChainTokenAddress, erc20OnSchainTokenAddress); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnChain); }) it("should successfully relink if new token was not minted", async () => { const erc20OnSchainPostToken = await deployERC20OnChain("SchainPostToken", "SPT"); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnOriginChainTokenAddress, erc20OnSchainPostToken.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnSchainPostToken); - await tokenManagerErc20.clonesErc20(mainnetChainHash, erc20OnOriginChainTokenAddress).should.be.eventually.equal(erc20OnSchainPostToken.address); - await tokenManagerErc20.addedClones(erc20OnSchainPostToken.address).should.be.eventually.equal(true); + await tokenManagerErc20.clonesErc20(mainnetChainHash, erc20OnMainnet).should.be.eventually.equal(erc20OnSchainPostToken); + await tokenManagerErc20.addedClones(erc20OnSchainPostToken).should.be.eventually.equal(true); }); it("should successfully relink if previous token on target chain was minted and then fully burned before relinking to new", async () => { @@ -234,17 +228,17 @@ describe("TokenManagerERC20", () => { await erc20OnChain.connect(user).burn(1); const erc20OnSchainPostToken = await deployERC20OnChain("SchainPostToken", "SPT"); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnOriginChainTokenAddress, erc20OnSchainPostToken.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnSchainPostToken); - await tokenManagerErc20.clonesErc20(mainnetChainHash, erc20OnOriginChainTokenAddress).should.be.eventually.equal(erc20OnSchainPostToken.address); - await tokenManagerErc20.addedClones(erc20OnSchainPostToken.address).should.be.eventually.equal(true); + await tokenManagerErc20.clonesErc20(mainnetChainHash, erc20OnMainnet).should.be.eventually.equal(erc20OnSchainPostToken); + await tokenManagerErc20.addedClones(erc20OnSchainPostToken).should.be.eventually.equal(true); }); it("should reject new relinking if previous token was already minted", async () => { await erc20OnChain.mint(user.address, 1); const erc20OnSchainPostToken = await deployERC20OnChain("SchainPostToken", "SPT"); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnOriginChainTokenAddress, erc20OnSchainPostToken.address) + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnSchainPostToken) .should.be.eventually.rejectedWith("Total supply of a previous token is not zero") }); @@ -253,36 +247,36 @@ describe("TokenManagerERC20", () => { it("should reject with `Transfer is not approved by token holder` when invoke `exitToMainERC20`", async () => { const error = "Transfer is not approved by token holder"; const amount = 20; - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet.address, erc20OnChain.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnChain); // invoke `grantRole` before `sendERC20` to avoid `MinterRole: caller does not have the Minter role` exception const minterRole = await erc20OnChain.MINTER_ROLE(); await erc20OnChain.mint(user.address, amount * 2); - await erc20OnChain.connect(deployer).grantRole(minterRole, tokenManagerErc20.address); + await erc20OnChain.connect(deployer).grantRole(minterRole, tokenManagerErc20); // - await erc20OnChain.connect(user).approve(tokenManagerErc20.address, amount / 2); + await erc20OnChain.connect(user).approve(tokenManagerErc20, amount / 2); // execution/expectation - await tokenManagerErc20.connect(user).exitToMainERC20(erc20OnMainnet.address, amount) + await tokenManagerErc20.connect(user).exitToMainERC20(erc20OnMainnet, amount) .should.be.eventually.rejectedWith(error); }); it("should invoke `exitToMainERC20` without mistakes", async () => { const amountMint = "10000000000000000"; const amountReduceCost = "8000000000000000"; - await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerErc20.address); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet.address, erc20OnChain.address); + await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerErc20); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnChain); await erc20OnChain.connect(deployer).mint(user.address, amountMint); - await erc20OnChain.connect(user).approve(tokenManagerErc20.address, amountMint); + await erc20OnChain.connect(user).approve(tokenManagerErc20, amountMint); // execution: await tokenManagerErc20 .connect(user) - .exitToMainERC20(erc20OnMainnet.address, amountReduceCost); + .exitToMainERC20(erc20OnMainnet, amountReduceCost); // // expectation: - const outgoingMessagesCounterMainnet = BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet")); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); describe("tests for transferToSchainERC20", async () => { @@ -294,1064 +288,1068 @@ describe("TokenManagerERC20", () => { let tokenManagerErc202: TokenManagerERC20; let communityLocker2: CommunityLocker; const newSchainName = "NewChain"; - const newSchainId = stringKeccak256(newSchainName); + const newSchainId = ethers.id(newSchainName); beforeEach(async () => { erc20OnOriginChain = await deployERC20OnChain("NewToken", "NTN"); erc20OnTargetChain = await deployERC20OnChain("NewToke1n", "NTN1"); const keyStorage2 = await deployKeyStorageMock(); - messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2.address, newSchainName); + messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2, newSchainName); tokenManagerLinker2 = await deployTokenManagerLinker(messageProxyForSchain2, deployer.address); - communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, fakeCommunityPool); - tokenManagerErc202 = await deployTokenManagerERC20(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, communityLocker2, fakeDepositBox); - await erc20OnTargetChain.connect(deployer).grantRole(await erc20OnTargetChain.MINTER_ROLE(), tokenManagerErc202.address); - await tokenManagerLinker2.registerTokenManager(tokenManagerErc202.address); + communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2, tokenManagerLinker2, fakeCommunityPool); + tokenManagerErc202 = await deployTokenManagerERC20(newSchainName, messageProxyForSchain2, tokenManagerLinker2, communityLocker2, fakeDepositBox); + await erc20OnTargetChain.connect(deployer).grantRole(await erc20OnTargetChain.MINTER_ROLE(), tokenManagerErc202); + await tokenManagerLinker2.registerTokenManager(tokenManagerErc202); }); it("should invoke `transferToSchainERC20` without mistakes", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should reject `transferToSchainERC20` when executing earlier than allowed", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(1)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(1); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(90); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(20); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(3)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(3); await communityLocker.setTimeLimitPerMessage(newSchainName, 0); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await skipTime(110); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(5)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(5); }); it("should invoke `transferToSchainERC20` and receive tokens without mistakes", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); const data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerErc202.enableAutomaticDeploy(); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain.address); + const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amount); }); it("should invoke `transferToSchainERC20` and receive tokens without mistakes back and forward twice", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerErc202.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain.address); + const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amount); const amount2 = "50000000000000000"; await erc20OnOriginChain.connect(deployer).mint(user.address, amount2); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount2); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount2); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount2); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount2); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount2, (await erc20OnOriginChain.totalSupply()).toString() ); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); const amountSum = "70000000000000000"; - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amountSum); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amountSum); }); it("should invoke `transferToSchainERC20` and receive tokens without mistakes double with attached token", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address).should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); + await tokenManagerErc202 + .connect(schainOwner) + .addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain) + .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); await tokenManagerErc202.connect(deployer).grantRole(await tokenManagerErc202.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address).should.be.eventually.rejectedWith("Chain is not connected"); + await tokenManagerErc202 + .connect(schainOwner) + .addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain) + .should.be.eventually.rejectedWith("Chain is not connected"); await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202 + .connect(schainOwner) + .addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - expect((await erc20OnTargetChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await erc20OnTargetChain.balanceOf(user.address)).toString()).to.be.equal(amount); const amount2 = "50000000000000000"; await erc20OnOriginChain.connect(deployer).mint(user.address, amount2); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount2); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount2); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount2); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount2); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount2, (await erc20OnOriginChain.totalSupply()).toString() ); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); const amountSum = "70000000000000000"; - expect((await erc20OnTargetChain.functions.balanceOf(user.address)).toString()).to.be.equal(amountSum); + expect((await erc20OnTargetChain.balanceOf(user.address)).toString()).to.be.equal(amountSum); }); it("should invoke `transferToSchainERC20` and transfer back without mistakes", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerErc202.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain.address); + const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(schainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Transfer is not approved by token holder"); - await targetErc20OnChain.connect(user).approve(tokenManagerErc202.address, amount); + await targetErc20OnChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); }); it("should invoke `transferToSchainERC20` and transfer back without mistakes with attached tokens", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); await tokenManagerErc202.connect(deployer).grantRole(await tokenManagerErc202.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address); + await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(schainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Transfer is not approved by token holder"); - await erc20OnTargetChain.connect(user).approve(tokenManagerErc202.address, amount); + await erc20OnTargetChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); }); it("should invoke `transferToSchainERC20` and transfer back without mistakes double", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerErc202.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain.address); + const addressERC20OnSchain = await tokenManagerErc202.clonesErc20(schainId, erc20OnOriginChain); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(schainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Transfer is not approved by token holder"); - await targetErc20OnChain.connect(user).approve(tokenManagerErc202.address, amount); + await targetErc20OnChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString() ); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amount); const amount2 = "50000000000000000"; await erc20OnOriginChain.connect(deployer).mint(user.address, amount2); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount2); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount2); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount2); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount2); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount2, (await erc20OnOriginChain.totalSupply()).toString() ); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); const amountSum = "70000000000000000"; - expect((await targetErc20OnChain.functions.balanceOf(user.address)).toString()).to.be.equal(amountSum); + expect((await targetErc20OnChain.balanceOf(user.address)).toString()).to.be.equal(amountSum); - await targetErc20OnChain.connect(user).approve(tokenManagerErc202.address, amount); + await targetErc20OnChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); - await targetErc20OnChain.connect(user).approve(tokenManagerErc202.address, amount2); + await targetErc20OnChain.connect(user).approve(tokenManagerErc202, amount2); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount2); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount2); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount2 ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amountSum); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amountSum); }); it("should invoke `transferToSchainERC20` and transfer back without mistakes double with attached tokens", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc20 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); await tokenManagerErc202.connect(deployer).grantRole(await tokenManagerErc202.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address); + await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20("Mainnet", erc20OnOriginChain.address, amount) + .transferToSchainERC20("Mainnet", erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount) + .transferToSchainERC20(schainName, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Transfer is not approved by token holder"); - await erc20OnTargetChain.connect(user).approve(tokenManagerErc202.address, amount); + await erc20OnTargetChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString() ); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - expect((await erc20OnTargetChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await erc20OnTargetChain.balanceOf(user.address)).toString()).to.be.equal(amount); const amount2 = "50000000000000000"; await erc20OnOriginChain.connect(deployer).mint(user.address, amount2); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount2); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount2); await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount2); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount2); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount2, (await erc20OnOriginChain.totalSupply()).toString() ); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); const amountSum = "70000000000000000"; - expect((await erc20OnTargetChain.functions.balanceOf(user.address)).toString()).to.be.equal(amountSum); + expect((await erc20OnTargetChain.balanceOf(user.address)).toString()).to.be.equal(amountSum); - await erc20OnTargetChain.connect(user).approve(tokenManagerErc202.address, amount); + await erc20OnTargetChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); - await erc20OnTargetChain.connect(user).approve(tokenManagerErc202.address, amount2); + await erc20OnTargetChain.connect(user).approve(tokenManagerErc202, amount2); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount2); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount2); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount2 ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amountSum); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amountSum); }); it("should not be able to transfer X->Y->Z", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerErc20); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); const data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); await tokenManagerErc202.connect(deployer).grantRole(await tokenManagerErc202.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - expect((await erc20OnTargetChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await erc20OnTargetChain.balanceOf(user.address)).toString()).to.be.equal(amount); const newSchainNameZ = "NewChainZ"; const erc20OnTargetZChain = await deployERC20OnChain("NewTokenZ", "NTNZ"); const keyStorageZ = await deployKeyStorageMock(); - const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ.address, newSchainNameZ); + const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ, newSchainNameZ); const tokenManagerLinkerZ = await deployTokenManagerLinker(messageProxyForSchainZ, deployer.address); - const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ.address, tokenManagerLinkerZ, fakeCommunityPool); - const tokenManagerErc20Z = await deployTokenManagerERC20(newSchainNameZ, messageProxyForSchainZ.address, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); - await erc20OnTargetZChain.connect(deployer).grantRole(await erc20OnTargetZChain.MINTER_ROLE(), tokenManagerErc20Z.address); - await tokenManagerLinkerZ.registerTokenManager(tokenManagerErc20Z.address); + const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ, tokenManagerLinkerZ, fakeCommunityPool); + const tokenManagerErc20Z = await deployTokenManagerERC20(newSchainNameZ, messageProxyForSchainZ, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); + await erc20OnTargetZChain.connect(deployer).grantRole(await erc20OnTargetZChain.MINTER_ROLE(), tokenManagerErc20Z); + await tokenManagerLinkerZ.registerTokenManager(tokenManagerErc20Z); await messageProxyForSchain2.connect(deployer).grantRole(await messageProxyForSchain2.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain2.connect(deployer).addConnectedChain(newSchainNameZ); - await tokenManagerErc202.addTokenManager(newSchainNameZ, tokenManagerErc20Z.address); + await tokenManagerErc202.addTokenManager(newSchainNameZ, tokenManagerErc20Z); - await erc20OnTargetChain.connect(user).approve(tokenManagerErc202.address, amount); + await erc20OnTargetChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(newSchainNameZ, erc20OnOriginChain.address, amount) + .transferToSchainERC20(newSchainNameZ, erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Insufficient funds"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(newSchainNameZ, erc20OnTargetChain.address, amount) + .transferToSchainERC20(newSchainNameZ, erc20OnTargetChain, amount) .should.be.eventually.rejectedWith("Incorrect main chain token"); }); it("should not be able to transfer main chain token or clone to mainnet", async () => { const amount = "20000000000000000"; - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerErc202); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc20OnOriginChain.connect(deployer).mint(user.address, amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); - await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202.address); + await tokenManagerErc20.addTokenManager(newSchainName, tokenManagerErc202); // execution: await tokenManagerErc20 .connect(user) - .transferToSchainERC20(newSchainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(newSchainName, erc20OnOriginChain, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount, (await erc20OnOriginChain.totalSupply()).toString(), { name: await erc20OnOriginChain.name(), symbol: await erc20OnOriginChain.symbol(), - decimals: BigNumber.from(await erc20OnOriginChain.decimals()).toString() + decimals: await erc20OnOriginChain.decimals() } ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20.address); + await tokenManagerErc202.addTokenManager(schainName, tokenManagerErc20); await tokenManagerErc202.connect(deployer).grantRole(await tokenManagerErc202.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain.address, erc20OnTargetChain.address); + await tokenManagerErc202.connect(schainOwner).addERC20TokenByOwner(schainName, erc20OnOriginChain, erc20OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerErc202.address, schainId, tokenManagerErc20.address, data); + await messageProxyForSchain2.postMessage(tokenManagerErc202, schainId, tokenManagerErc20, data); - expect((await erc20OnTargetChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + expect((await erc20OnTargetChain.balanceOf(user.address)).toString()).to.be.equal(amount); data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain2.postMessage(communityLocker2.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain2.postMessage(communityLocker2, mainnetId, fakeCommunityPool, data); - await erc20OnTargetChain.connect(user).approve(tokenManagerErc202.address, amount); + await erc20OnTargetChain.connect(user).approve(tokenManagerErc202, amount); await tokenManagerErc202 .connect(user) - .exitToMainERC20(erc20OnOriginChain.address, amount) + .exitToMainERC20(erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Insufficient funds"); await tokenManagerErc202 .connect(user) - .exitToMainERC20(erc20OnTargetChain.address, amount) + .exitToMainERC20(erc20OnTargetChain, amount) .should.be.eventually.rejectedWith("Incorrect main chain token"); await tokenManagerErc202 .connect(user) - .transferToSchainERC20(schainName, erc20OnOriginChain.address, amount); + .transferToSchainERC20(schainName, erc20OnOriginChain, amount); data = await messages.encodeTransferErc20Message( - erc20OnOriginChain.address, + erc20OnOriginChain, user.address, amount ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, newSchainId, tokenManagerErc202.address, data); - expect((await erc20OnOriginChain.functions.balanceOf(user.address)).toString()).to.be.equal(amount); + await messageProxyForSchain.postMessage(tokenManagerErc20, newSchainId, tokenManagerErc202, data); + expect((await erc20OnOriginChain.balanceOf(user.address)).toString()).to.be.equal(amount); - await erc20OnOriginChain.connect(user).approve(tokenManagerErc20.address, amount); + await erc20OnOriginChain.connect(user).approve(tokenManagerErc20, amount); await tokenManagerErc20 .connect(user) - .exitToMainERC20(erc20OnOriginChain.address, amount) + .exitToMainERC20(erc20OnOriginChain, amount) .should.be.eventually.rejectedWith("Main chain token could not be transfered to Mainnet"); await tokenManagerErc20 .connect(user) - .exitToMainERC20(erc20OnTargetChain.address, amount) + .exitToMainERC20(erc20OnTargetChain, amount) .should.be.eventually.rejectedWith("Insufficient funds"); }); @@ -1360,7 +1358,7 @@ describe("TokenManagerERC20", () => { describe("tests for `postMessage` function", async () => { beforeEach(async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerErc20); }); it("should transfer ERC20 token with token info", async () => { @@ -1369,30 +1367,30 @@ describe("TokenManagerERC20", () => { const to = user.address; const remoteTokenManagerAddress = fakeDepositBox; const fromSchainName = "fromSchainName"; - const fromSchainHash = stringKeccak256(fromSchainName); + const fromSchainHash = ethers.id(fromSchainName); await tokenManagerErc20.addTokenManager(fromSchainName, remoteTokenManagerAddress); - // await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet.address, erc20OnChain.address); + // await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnChain); await erc20OnMainnet.mint(deployer.address, amount); const data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnMainnet.address, + erc20OnMainnet, to, amount, - (await erc20OnMainnet.totalSupply()).toNumber(), + await erc20OnMainnet.totalSupply(), { name: await erc20OnMainnet.name(), symbol: await erc20OnMainnet.symbol(), - decimals: BigNumber.from(await erc20OnMainnet.decimals()).toString() + decimals: await erc20OnMainnet.decimals() } ); await tokenManagerErc20.connect(schainOwner).enableAutomaticDeploy(); // execution - await messageProxyForSchain.postMessage(tokenManagerErc20.address, fromSchainHash, remoteTokenManagerAddress, data); + await messageProxyForSchain.postMessage(tokenManagerErc20, fromSchainHash, remoteTokenManagerAddress, data); // expectation - const addressERC20OnSchain = await tokenManagerErc20.clonesErc20(fromSchainHash, erc20OnMainnet.address); + const addressERC20OnSchain = await tokenManagerErc20.clonesErc20(fromSchainHash, erc20OnMainnet); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect(parseInt((await targetErc20OnChain.functions.balanceOf(to)).toString(), 10)) + expect(parseInt((await targetErc20OnChain.balanceOf(to)).toString(), 10)) .to.be.equal(amount); }); @@ -1400,28 +1398,28 @@ describe("TokenManagerERC20", () => { // preparation const remoteTokenManagerAddress = fakeDepositBox; const fromSchainName = "fromSchainName"; - const fromSchainHash = stringKeccak256(fromSchainName); + const fromSchainHash = ethers.id(fromSchainName); await messageProxyForSchain.connect(deployer).addConnectedChain(fromSchainName); await tokenManagerErc20.addTokenManager(fromSchainName, remoteTokenManagerAddress); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(fromSchainName, erc20OnMainnet.address, erc20OnChain.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(fromSchainName, erc20OnMainnet, erc20OnChain); const amount = 10; const to = user.address; await erc20OnMainnet.mint(deployer.address, amount); const data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnMainnet.address, + erc20OnMainnet, to, amount, - (await erc20OnMainnet.totalSupply()).toNumber() + await erc20OnMainnet.totalSupply() ); await tokenManagerErc20.connect(schainOwner).enableAutomaticDeploy(); // execution - await messageProxyForSchain.postMessage(tokenManagerErc20.address, fromSchainHash, remoteTokenManagerAddress, data); + await messageProxyForSchain.postMessage(tokenManagerErc20, fromSchainHash, remoteTokenManagerAddress, data); // expectation - const addressERC20OnSchain = await tokenManagerErc20.clonesErc20(fromSchainHash, erc20OnMainnet.address); + const addressERC20OnSchain = await tokenManagerErc20.clonesErc20(fromSchainHash, erc20OnMainnet); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect(parseInt((await targetErc20OnChain.functions.balanceOf(to)).toString(), 10)) + expect(parseInt((await targetErc20OnChain.balanceOf(to)).toString(), 10)) .to.be.equal(amount); }); @@ -1429,36 +1427,36 @@ describe("TokenManagerERC20", () => { // preparation const remoteTokenManagerAddress = fakeDepositBox; const fromSchainName = "fromSchainName"; - const fromSchainHash = stringKeccak256(fromSchainName); + const fromSchainHash = ethers.id(fromSchainName); await tokenManagerErc20.addTokenManager(fromSchainName, remoteTokenManagerAddress); const amount = 10; const to = user.address; await erc20OnMainnet.mint(deployer.address, amount); const data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnMainnet.address, + erc20OnMainnet, to, amount, - (await erc20OnMainnet.totalSupply()).toNumber(), + await erc20OnMainnet.totalSupply(), { name: await erc20OnMainnet.name(), symbol: await erc20OnMainnet.symbol(), - decimals: BigNumber.from(await erc20OnMainnet.decimals()).toString() + decimals: await erc20OnMainnet.decimals() } ); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, fromSchainHash, remoteTokenManagerAddress, data) + await messageProxyForSchain.postMessage(tokenManagerErc20, fromSchainHash, remoteTokenManagerAddress, data) .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerErc20.connect(schainOwner).enableAutomaticDeploy(); // execution - await messageProxyForSchain.postMessage(tokenManagerErc20.address, fromSchainHash, remoteTokenManagerAddress, data); + await messageProxyForSchain.postMessage(tokenManagerErc20, fromSchainHash, remoteTokenManagerAddress, data); // expectation - const addressERC20OnSchain = await tokenManagerErc20.clonesErc20(fromSchainHash, erc20OnMainnet.address); + const addressERC20OnSchain = await tokenManagerErc20.clonesErc20(fromSchainHash, erc20OnMainnet); const targetErc20OnChain = (await ethers.getContractFactory("ERC20OnChain")).attach(addressERC20OnSchain) as ERC20OnChain; - expect(parseInt((await targetErc20OnChain.functions.balanceOf(to)).toString(), 10)) + expect(parseInt((await targetErc20OnChain.balanceOf(to)).toString(), 10)) .to.be.equal(amount); }); @@ -1467,7 +1465,7 @@ describe("TokenManagerERC20", () => { "000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0"+ "00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"+ "0000000000000000000000000000000000000000000000000000000000000001"; - await messageProxyForSchain.postMessage(tokenManagerErc20.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerErc20, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("MessageType is unknown"); }); @@ -1478,35 +1476,35 @@ describe("TokenManagerERC20", () => { const to = user.address; const remoteTokenManagerAddress = fakeDepositBox; const fromSchainName = "fromSchainName"; - const fromSchainHash = stringKeccak256(fromSchainName); + const fromSchainHash = ethers.id(fromSchainName); await tokenManagerErc20.addTokenManager(fromSchainName, remoteTokenManagerAddress); - await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet.address, erc20OnChain.address); + await tokenManagerErc20.connect(schainOwner).addERC20TokenByOwner(mainnetName, erc20OnMainnet, erc20OnChain); await erc20OnMainnet.mint(deployer.address, amount); let data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnMainnet.address, + erc20OnMainnet, to, amount, - (await erc20OnMainnet.totalSupply()).toNumber(), + await erc20OnMainnet.totalSupply(), { name: await erc20OnMainnet.name(), symbol: await erc20OnMainnet.symbol(), - decimals: BigNumber.from(await erc20OnMainnet.decimals()).toString() + decimals: await erc20OnMainnet.decimals() } ); await tokenManagerErc20.connect(schainOwner).enableAutomaticDeploy(); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, fromSchainHash, remoteTokenManagerAddress, data); + await messageProxyForSchain.postMessage(tokenManagerErc20, fromSchainHash, remoteTokenManagerAddress, data); // execution - const UINT256_MAX = BigNumber.from(2).pow(256).sub(1); + const UINT256_MAX = BigInt(2 ^ 256 - 1); data = await messages.encodeTransferErc20AndTotalSupplyMessage( - erc20OnMainnet.address, + erc20OnMainnet, to, UINT256_MAX, 0); - await messageProxyForSchain.postMessage(tokenManagerErc20.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerErc20, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("Total supply exceeded"); }); @@ -1515,18 +1513,19 @@ describe("TokenManagerERC20", () => { const receiver = ethers.Wallet.createRandom().connect(ethers.provider); const remoteTokenManager = ethers.Wallet.createRandom(); const sourceSchainName = "sourceSchain"; - const sourceSchainHash = stringKeccak256(sourceSchainName) + const sourceSchainHash = ethers.id(sourceSchainName) await tokenManagerErc20.addTokenManager(sourceSchainName, remoteTokenManager.address); const etherbase = await (await ethers.getContractFactory("EtherbaseMock")).deploy() as EtherbaseMock; await etherbase.initialize(deployer.address); - await etherbase.grantRole(await etherbase.ETHER_MANAGER_ROLE(), messageProxyForSchain.address); - await messageProxyForSchain.setEtherbase(etherbase.address); - await deployer.sendTransaction({to: etherbase.address, value: ethers.utils.parseEther("3")}); + await etherbase.grantRole(await etherbase.ETHER_MANAGER_ROLE(), messageProxyForSchain); + await messageProxyForSchain.setEtherbase(etherbase); + await deployer.sendTransaction({to: etherbase, value: ethers.parseEther("3")}); - (await receiver.getBalance()).should.be.equal(0); + let receiverBalance = await ethers.provider.getBalance(receiver.address); + (receiverBalance).should.be.equal(0); const data = await messages.encodeTransferErc20AndTokenInfoMessage( - erc20OnMainnet.address, + erc20OnMainnet, receiver.address, amount, 2 * amount, @@ -1538,24 +1537,25 @@ describe("TokenManagerERC20", () => { ); await tokenManagerErc20.connect(schainOwner).enableAutomaticDeploy(); await messageProxyForSchain.postMessage( - tokenManagerErc20.address, + tokenManagerErc20, sourceSchainHash, remoteTokenManager.address, data); + receiverBalance = await ethers.provider.getBalance(receiver.address); + (receiverBalance).should.be.equal(0); - (await receiver.getBalance()).should.be.equal(0); - - await expect(messageProxyForSchain.setMinimumReceiverBalance(ethers.utils.parseEther("2"))) + await expect(messageProxyForSchain.setMinimumReceiverBalance(ethers.parseEther("2"))) .to.emit(messageProxyForSchain, 'MinimumReceiverBalanceChanged') - .withArgs(0, ethers.utils.parseEther("2")); + .withArgs(0, ethers.parseEther("2")); await messageProxyForSchain.postMessage( - tokenManagerErc20.address, + tokenManagerErc20, sourceSchainHash, remoteTokenManager.address, data); - (await receiver.getBalance()).should.be.equal(await messageProxyForSchain.minimumReceiverBalance()); + receiverBalance = await ethers.provider.getBalance(receiver.address); + (receiverBalance).should.be.equal(await messageProxyForSchain.minimumReceiverBalance()); }) }); }); diff --git a/proxy/test/TokenManagerERC721.ts b/test/TokenManagerERC721.ts similarity index 70% rename from proxy/test/TokenManagerERC721.ts rename to test/TokenManagerERC721.ts index db42dc941..23156d507 100644 --- a/proxy/test/TokenManagerERC721.ts +++ b/test/TokenManagerERC721.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ERC721OnChain, TokenManagerERC721, @@ -34,7 +34,6 @@ import { CommunityLocker } from "../typechain"; -import { stringKeccak256 } from "./utils/helper"; import { skipTime } from "./utils/time"; chai.should(); @@ -48,8 +47,7 @@ import { deployMessages } from "./utils/deploy/messages"; import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; @@ -60,10 +58,10 @@ describe("TokenManagerERC721", () => { let schainOwner: SignerWithAddress; const schainName = "V-chain"; - const schainId = stringKeccak256(schainName); + const schainId = ethers.id(schainName); const tokenId = 1; const mainnetName = "Mainnet"; - const mainnetId = stringKeccak256("Mainnet"); + const mainnetId = ethers.id("Mainnet"); let to: string; let token: ERC721OnChain; let tokenClone: ERC721OnChain; @@ -83,25 +81,25 @@ describe("TokenManagerERC721", () => { beforeEach(async () => { const keyStorage = await deployKeyStorageMock(); - messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage, schainName); tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, deployer.address); messages = await deployMessages(); - fakeDepositBox = messages.address; - fakeCommunityPool = messages.address; + fakeDepositBox = user.address; + fakeCommunityPool = user.address; - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, fakeCommunityPool); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, fakeCommunityPool); tokenManagerERC721 = await deployTokenManagerERC721( schainName, - messageProxyForSchain.address, + messageProxyForSchain, tokenManagerLinker, communityLocker, fakeDepositBox ); await tokenManagerERC721.connect(deployer).grantRole(await tokenManagerERC721.TOKEN_REGISTRAR_ROLE(), schainOwner.address); await tokenManagerERC721.connect(deployer).grantRole(await tokenManagerERC721.AUTOMATIC_DEPLOY_ROLE(), schainOwner.address); - await tokenManagerLinker.registerTokenManager(tokenManagerERC721.address); + await tokenManagerLinker.registerTokenManager(tokenManagerERC721); tokenClone = await deployERC721OnChain("ELVIS", "ELV"); token = await deployERC721OnChain("SKALE", "SKL"); @@ -111,7 +109,7 @@ describe("TokenManagerERC721", () => { to = user.address; const data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain.postMessage(communityLocker, mainnetId, fakeCommunityPool, data); const extraContractRegistrarRole = await messageProxyForSchain.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); @@ -122,7 +120,7 @@ describe("TokenManagerERC721", () => { it("should change depositBox address", async () => { const newDepositBox = user.address; - expect(await tokenManagerERC721.depositBox()).to.equal(messages.address); + expect(await tokenManagerERC721.depositBox()).to.equal(fakeDepositBox); await tokenManagerERC721.connect(user).changeDepositBoxAddress(newDepositBox) .should.be.eventually.rejectedWith("DEFAULT_ADMIN_ROLE is required"); await tokenManagerERC721.connect(deployer).changeDepositBoxAddress(newDepositBox); @@ -131,71 +129,67 @@ describe("TokenManagerERC721", () => { it("should successfully call exitToMainERC721", async () => { // should be "No token clone on schain" if chains were different - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("ERC721: invalid token ID"); - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("ERC721: invalid token ID"); await tokenClone.connect(deployer).mint(user.address, tokenId); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await tokenClone.connect(user).approve(tokenManagerERC721.address, tokenId); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId) + await tokenClone.connect(user).approve(tokenManagerERC721, tokenId); + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Sender contract is not registered"); - await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerERC721.address); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId); + await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerERC721); + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId); - await messageProxyForSchain.removeExtraContract("Mainnet", tokenManagerERC721.address); + await messageProxyForSchain.removeExtraContract("Mainnet", tokenManagerERC721); await tokenClone.connect(deployer).mint(user.address, tokenId); - await tokenClone.connect(user).approve(tokenManagerERC721.address, tokenId); + await tokenClone.connect(user).approve(tokenManagerERC721, tokenId); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Sender contract is not registered"); - const outgoingMessagesCounterMainnet = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet") - ); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); it("should be rejected when call exitToMainERC721 if remove contract for all chains", async () => { - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); await tokenClone.connect(deployer).mint(user.address, tokenId); - await tokenClone.connect(user).approve(tokenManagerERC721.address, tokenId); - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await tokenClone.connect(user).approve(tokenManagerERC721, tokenId); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId); + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId); - await messageProxyForSchain.removeExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.removeExtraContractForAll(tokenManagerERC721); await tokenClone.connect(deployer).mint(user.address, tokenId); - await tokenClone.connect(user).approve(tokenManagerERC721.address, tokenId); + await tokenClone.connect(user).approve(tokenManagerERC721, tokenId); - await tokenManagerERC721.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Sender contract is not registered"); - const outgoingMessagesCounterMainnet = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet") - ); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); it("should successfully call addERC721TokenByOwner", async () => { - await tokenManagerERC721.connect(user).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address) + await tokenManagerERC721.connect(user).addERC721TokenByOwner(mainnetName, token, tokenClone) .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, deployer.address) + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, deployer.address) .should.be.eventually.rejectedWith("Given address is not a contract"); - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token2.address, tokenClone.address) + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token2, tokenClone) .should.be.eventually.rejectedWith("Clone was already added"); - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone2.address) + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone2) .should.be.eventually.rejectedWith("Could not relink clone"); }); @@ -208,184 +202,183 @@ describe("TokenManagerERC721", () => { let tokenManagerERC7212: TokenManagerERC721; let communityLocker2: CommunityLocker; const newSchainName = "NewChain"; - const newSchainId = stringKeccak256(newSchainName); + const newSchainId = ethers.id(newSchainName); beforeEach(async () => { erc721OnOriginChain = await deployERC721OnChain("NewToken", "NTN"); erc721OnTargetChain = await deployERC721OnChain("NewToke1n", "NTN1"); const keyStorage2 = await deployKeyStorageMock(); - messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2.address, newSchainName); + messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2, newSchainName); tokenManagerLinker2 = await deployTokenManagerLinker(messageProxyForSchain2, deployer.address); - communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, fakeCommunityPool); - tokenManagerERC7212 = await deployTokenManagerERC721(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, communityLocker2, fakeDepositBox); - await erc721OnTargetChain.connect(deployer).grantRole(await erc721OnTargetChain.MINTER_ROLE(), tokenManagerERC7212.address); - await tokenManagerLinker2.registerTokenManager(tokenManagerERC7212.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC7212.address); + communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2, tokenManagerLinker2, fakeCommunityPool); + tokenManagerERC7212 = await deployTokenManagerERC721(newSchainName, messageProxyForSchain2, tokenManagerLinker2, communityLocker2, fakeDepositBox); + await erc721OnTargetChain.connect(deployer).grantRole(await erc721OnTargetChain.MINTER_ROLE(), tokenManagerERC7212); + await tokenManagerLinker2.registerTokenManager(tokenManagerERC7212); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC7212); }); it("should invoke `transferToSchainERC721` without mistakes", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should reject `transferToSchainERC721` when executing earlier then allowed", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, 1); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, 1); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, 1); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 1) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 1) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, 1) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, 1) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 1); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(1)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(1); await erc721OnOriginChain.connect(deployer).mint(user.address, 2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, 2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, 2); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 2); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await erc721OnOriginChain.connect(deployer).mint(user.address, 3); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, 3); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, 3); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 3) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 3) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(90); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 3) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 3) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(20); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 3); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 3); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(3)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(3); await communityLocker.setTimeLimitPerMessage(newSchainName, 0); await erc721OnOriginChain.connect(deployer).mint(user.address, 4); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, 4); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, 4); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 4); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 4); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await erc721OnOriginChain.connect(deployer).mint(user.address, 5); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, 5); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, 5); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 5) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 5) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await skipTime(110); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 5); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 5); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(5)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(5); }); it("should invoke `transferToSchainERC721` and receive tokens without mistakes", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); const data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -395,57 +388,58 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2 + .postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data) + .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC7212.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain.address); + const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain); const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); }); it("should invoke `transferToSchainERC721` and receive tokens without mistakes double", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -455,77 +449,76 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC7212.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain.address); + const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain); const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); const tokenId2 = 2; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId2); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); }); it("should invoke `transferToSchainERC721` and receive tokens without mistakes double with attached token", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -535,76 +528,81 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address).should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); + await tokenManagerERC7212 + .connect(schainOwner) + .addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain) + .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); await tokenManagerERC7212.connect(deployer).grantRole(await tokenManagerERC7212.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address).should.be.eventually.rejectedWith("Chain is not connected"); + await tokenManagerERC7212 + .connect(schainOwner) + .addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain) + .should.be.eventually.rejectedWith("Chain is not connected"); await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); const tokenId2 = 2; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId2); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -614,87 +612,86 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC7212.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain.address); + const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain); const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await targetErc721OnChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await targetErc721OnChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes with attached tokens", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -704,83 +701,82 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); await tokenManagerERC7212.connect(deployer).grantRole(await tokenManagerERC7212.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes double", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -790,155 +786,154 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC7212.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain.address); - const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + const addressERC721OnSchain = await tokenManagerERC7212.clonesErc721(schainId, erc721OnOriginChain); + const targetErc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await targetErc721OnChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await targetErc721OnChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); const tokenId2 = 2; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId2); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - await targetErc721OnChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await targetErc721OnChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); - await targetErc721OnChain.connect(user).approve(tokenManagerERC7212.address, tokenId2); + await targetErc721OnChain.connect(user).approve(tokenManagerERC7212, tokenId2); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2 ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes double with attached tokens", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -948,139 +943,138 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); await tokenManagerERC7212.connect(deployer).grantRole(await tokenManagerERC7212.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); const tokenId2 = 2; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId2); await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212.address, tokenId2); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212, tokenId2); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2 ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); }); it("should not be able to transfer X->Y->Z", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); const data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -1090,71 +1084,70 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); await tokenManagerERC7212.connect(deployer).grantRole(await tokenManagerERC7212.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); const newSchainNameZ = "NewChainZ"; const erc721OnTargetZChain = await deployERC721OnChain("NewTokenZ", "NTNZ"); const keyStorageZ = await deployKeyStorageMock(); - const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ.address, newSchainNameZ); + const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ, newSchainNameZ); const tokenManagerLinkerZ = await deployTokenManagerLinker(messageProxyForSchainZ, deployer.address); - const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ.address, tokenManagerLinkerZ, fakeCommunityPool); - const tokenManagerERC721Z = await deployTokenManagerERC721(newSchainNameZ, messageProxyForSchainZ.address, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); - await erc721OnTargetZChain.connect(deployer).grantRole(await erc721OnTargetZChain.MINTER_ROLE(), tokenManagerERC721Z.address); - await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC721Z.address); + const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ, tokenManagerLinkerZ, fakeCommunityPool); + const tokenManagerERC721Z = await deployTokenManagerERC721(newSchainNameZ, messageProxyForSchainZ, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); + await erc721OnTargetZChain.connect(deployer).grantRole(await erc721OnTargetZChain.MINTER_ROLE(), tokenManagerERC721Z); + await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC721Z); await messageProxyForSchain2.connect(deployer).grantRole(await messageProxyForSchain2.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain2.connect(deployer).addConnectedChain(newSchainNameZ); - await tokenManagerERC7212.addTokenManager(newSchainNameZ, tokenManagerERC721Z.address); + await tokenManagerERC7212.addTokenManager(newSchainNameZ, tokenManagerERC721Z); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(newSchainNameZ, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainNameZ, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(newSchainNameZ, erc721OnTargetChain.address, tokenId) + .transferToSchainERC721(newSchainNameZ, erc721OnTargetChain, tokenId) .should.be.eventually.rejectedWith("Incorrect main chain token"); }); it("should not be able to transfer main chain token or clone to mainnet", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); - await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212.address); + await tokenManagerERC721.addTokenManager(newSchainName, tokenManagerERC7212); // execution: await tokenManagerERC721 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721AndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, { @@ -1164,61 +1157,60 @@ describe("TokenManagerERC721", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721.address); + await tokenManagerERC7212.addTokenManager(schainName, tokenManagerERC721); await tokenManagerERC7212.connect(deployer).grantRole(await tokenManagerERC7212.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC7212.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC7212.address, schainId, tokenManagerERC721.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC7212, schainId, tokenManagerERC721, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain2.postMessage(communityLocker2.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain2.postMessage(communityLocker2, mainnetId, fakeCommunityPool, data); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC7212, tokenId); await tokenManagerERC7212 .connect(user) - .exitToMainERC721(erc721OnOriginChain.address, tokenId) + .exitToMainERC721(erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); await tokenManagerERC7212 .connect(user) - .exitToMainERC721(erc721OnTargetChain.address, tokenId) + .exitToMainERC721(erc721OnTargetChain, tokenId) .should.be.eventually.rejectedWith("Incorrect main chain token"); await tokenManagerERC7212 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721Message( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, newSchainId, tokenManagerERC7212.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, newSchainId, tokenManagerERC7212, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721, tokenId); await tokenManagerERC721 .connect(user) - .exitToMainERC721(erc721OnOriginChain.address, tokenId) + .exitToMainERC721(erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Main chain token could not be transfered to Mainnet"); await tokenManagerERC721 .connect(user) - .exitToMainERC721(erc721OnTargetChain.address, tokenId) + .exitToMainERC721(erc721OnTargetChain, tokenId) .should.be.eventually.rejectedWith("ERC721: invalid token ID"); }); @@ -1227,13 +1219,13 @@ describe("TokenManagerERC721", () => { describe("tests for `postMessage` function", async () => { beforeEach(async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721); }); it("should transfer ERC721 token token with token info", async () => { // preparation const data = await messages.encodeTransferErc721AndTokenInfoMessage( - token.address, + token, to, tokenId, { @@ -1242,31 +1234,31 @@ describe("TokenManagerERC721", () => { } ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC721, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC721.connect(schainOwner).enableAutomaticDeploy(); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, mainnetId, fakeDepositBox, data); - const addressERC721OnSchain = await tokenManagerERC721.clonesErc721(mainnetId, token.address); - const erc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await erc721OnChain.functions.ownerOf(tokenId))[0]).to.be.equal(to); + await messageProxyForSchain.postMessage(tokenManagerERC721, mainnetId, fakeDepositBox, data); + const addressERC721OnSchain = await tokenManagerERC721.clonesErc721(mainnetId, token); + const erc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; + expect((await erc721OnChain.ownerOf(tokenId))).to.be.equal(to); }); it("should transfer ERC721 token on schain", async () => { // preparation - await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC721.address); + await tokenManagerERC721.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); + await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC721); const data = await messages.encodeTransferErc721Message( - token.address, + token, to, tokenId ); - await messageProxyForSchain.postMessage(tokenManagerERC721.address, mainnetId, fakeDepositBox, data); - const addressERC721OnSchain = await tokenManagerERC721.clonesErc721(mainnetId, token.address); + await messageProxyForSchain.postMessage(tokenManagerERC721, mainnetId, fakeDepositBox, data); + const addressERC721OnSchain = await tokenManagerERC721.clonesErc721(mainnetId, token); const erc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await erc721OnChain.functions.ownerOf(tokenId))[0]).to.be.equal(to); + expect((await erc721OnChain.ownerOf(tokenId))).to.be.equal(to); }); it("should reject if message type is unknown", async () => { @@ -1274,7 +1266,7 @@ describe("TokenManagerERC721", () => { "000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0"+ "00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"+ "0000000000000000000000000000000000000000000000000000000000000001"; - await messageProxyForSchain.postMessage(tokenManagerERC721.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC721, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("MessageType is unknown"); }); diff --git a/proxy/test/TokenManagerERC721WithMetadata.ts b/test/TokenManagerERC721WithMetadata.ts similarity index 66% rename from proxy/test/TokenManagerERC721WithMetadata.ts rename to test/TokenManagerERC721WithMetadata.ts index e431382dc..3ffacd83a 100644 --- a/proxy/test/TokenManagerERC721WithMetadata.ts +++ b/test/TokenManagerERC721WithMetadata.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { ERC721OnChain, TokenManagerERC721WithMetadata, @@ -34,7 +34,7 @@ import { CommunityLocker } from "../typechain"; -import { stringKeccak256 } from "./utils/helper"; + import { skipTime } from "./utils/time"; chai.should(); @@ -48,8 +48,7 @@ import { deployMessages } from "./utils/deploy/messages"; import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; @@ -60,11 +59,11 @@ describe("TokenManagerERC721WithMetadata", () => { let schainOwner: SignerWithAddress; const schainName = "V-chain"; - const schainId = stringKeccak256(schainName); + const schainId = ethers.id(schainName); const tokenId = 1; const tokenURI = "Hello1"; const mainnetName = "Mainnet"; - const mainnetId = stringKeccak256("Mainnet"); + const mainnetId = ethers.id("Mainnet"); let to: string; let token: ERC721OnChain; let tokenClone: ERC721OnChain; @@ -84,25 +83,25 @@ describe("TokenManagerERC721WithMetadata", () => { beforeEach(async () => { const keyStorage = await deployKeyStorageMock(); - messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage, schainName); tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, deployer.address); messages = await deployMessages(); - fakeDepositBox = messages.address; - fakeCommunityPool = messages.address; + fakeDepositBox = user.address; + fakeCommunityPool = user.address; - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, fakeCommunityPool); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, fakeCommunityPool); tokenManagerERC721WithMetadata = await deployTokenManagerERC721WithMetadata( schainName, - messageProxyForSchain.address, + messageProxyForSchain, tokenManagerLinker, communityLocker, fakeDepositBox ); await tokenManagerERC721WithMetadata.connect(deployer).grantRole(await tokenManagerERC721WithMetadata.TOKEN_REGISTRAR_ROLE(), schainOwner.address); await tokenManagerERC721WithMetadata.connect(deployer).grantRole(await tokenManagerERC721WithMetadata.AUTOMATIC_DEPLOY_ROLE(), schainOwner.address); - await tokenManagerLinker.registerTokenManager(tokenManagerERC721WithMetadata.address); + await tokenManagerLinker.registerTokenManager(tokenManagerERC721WithMetadata); tokenClone = await deployERC721OnChain("ELVIS", "ELV"); token = await deployERC721OnChain("SKALE", "SKL"); @@ -112,7 +111,7 @@ describe("TokenManagerERC721WithMetadata", () => { to = user.address; const data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain.postMessage(communityLocker, mainnetId, fakeCommunityPool, data); const extraContractRegistrarRole = await messageProxyForSchain.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); @@ -123,7 +122,7 @@ describe("TokenManagerERC721WithMetadata", () => { it("should change depositBox address", async () => { const newDepositBox = user.address; - expect(await tokenManagerERC721WithMetadata.depositBox()).to.equal(messages.address); + expect(await tokenManagerERC721WithMetadata.depositBox()).to.equal(fakeDepositBox); await tokenManagerERC721WithMetadata.connect(user).changeDepositBoxAddress(newDepositBox) .should.be.eventually.rejectedWith("DEFAULT_ADMIN_ROLE is required"); await tokenManagerERC721WithMetadata.connect(deployer).changeDepositBoxAddress(newDepositBox); @@ -132,75 +131,71 @@ describe("TokenManagerERC721WithMetadata", () => { it("should successfully call exitToMainERC721", async () => { // should be "No token clone on schain" if chains were different - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("ERC721: invalid token ID"); - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("ERC721: invalid token ID"); await tokenClone.connect(deployer).mint(user.address, tokenId); await tokenClone.connect(user).setTokenURI(tokenId, tokenURI); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId) + await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Sender contract is not registered"); - await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerERC721WithMetadata.address); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId); + await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerERC721WithMetadata); + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId); - await messageProxyForSchain.removeExtraContract("Mainnet", tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.removeExtraContract("Mainnet", tokenManagerERC721WithMetadata); await tokenClone.connect(deployer).mint(user.address, tokenId); await tokenClone.connect(user).setTokenURI(tokenId, tokenURI); - await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Sender contract is not registered"); - const outgoingMessagesCounterMainnet = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet") - ); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); it("should be rejected when call exitToMainERC721 if remove contract for all chains", async () => { - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); await tokenClone.connect(deployer).mint(user.address, tokenId); await tokenClone.connect(user).setTokenURI(tokenId, tokenURI); - await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId); + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId); - await messageProxyForSchain.removeExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.removeExtraContractForAll(tokenManagerERC721WithMetadata); await tokenClone.connect(deployer).mint(user.address, tokenId); await tokenClone.connect(user).setTokenURI(tokenId, tokenURI); - await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await tokenClone.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); - await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token.address, tokenId) + await tokenManagerERC721WithMetadata.connect(user).exitToMainERC721(token, tokenId) .should.be.eventually.rejectedWith("Sender contract is not registered"); - const outgoingMessagesCounterMainnet = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet") - ); - outgoingMessagesCounterMainnet.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounterMainnet = await messageProxyForSchain.getOutgoingMessagesCounter("Mainnet"); + outgoingMessagesCounterMainnet.should.be.equal(1); }); it("should successfully call addERC721TokenByOwner", async () => { - await tokenManagerERC721WithMetadata.connect(user).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address) + await tokenManagerERC721WithMetadata.connect(user).addERC721TokenByOwner(mainnetName, token, tokenClone) .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, deployer.address) + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, deployer.address) .should.be.eventually.rejectedWith("Given address is not a contract"); - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token2.address, tokenClone.address) + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token2, tokenClone) .should.be.eventually.rejectedWith("Clone was already added"); - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone2.address) + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone2) .should.be.eventually.rejectedWith("Could not relink clone"); }); @@ -213,24 +208,30 @@ describe("TokenManagerERC721WithMetadata", () => { let tokenManagerERC721WithMetadata2: TokenManagerERC721WithMetadata; let communityLocker2: CommunityLocker; const newSchainName = "NewChain"; - const newSchainId = stringKeccak256(newSchainName); + const newSchainId = ethers.id(newSchainName); beforeEach(async () => { erc721OnOriginChain = await deployERC721OnChain("NewToken", "NTN"); erc721OnTargetChain = await deployERC721OnChain("NewToke1n", "NTN1"); const keyStorage2 = await deployKeyStorageMock(); - messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2.address, newSchainName); + messageProxyForSchain2 = await deployMessageProxyForSchainTester(keyStorage2, newSchainName); tokenManagerLinker2 = await deployTokenManagerLinker(messageProxyForSchain2, deployer.address); - communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, fakeCommunityPool); - tokenManagerERC721WithMetadata2 = await deployTokenManagerERC721WithMetadata(newSchainName, messageProxyForSchain2.address, tokenManagerLinker2, communityLocker2, fakeDepositBox); - await erc721OnTargetChain.connect(deployer).grantRole(await erc721OnTargetChain.MINTER_ROLE(), tokenManagerERC721WithMetadata2.address); - await tokenManagerLinker2.registerTokenManager(tokenManagerERC721WithMetadata2.address); - await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC721WithMetadata2.address); + communityLocker2 = await deployCommunityLocker(newSchainName, messageProxyForSchain2, tokenManagerLinker2, fakeCommunityPool); + tokenManagerERC721WithMetadata2 = await deployTokenManagerERC721WithMetadata( + newSchainName, + messageProxyForSchain2, + tokenManagerLinker2, + communityLocker2, + fakeDepositBox + ); + await erc721OnTargetChain.connect(deployer).grantRole(await erc721OnTargetChain.MINTER_ROLE(), tokenManagerERC721WithMetadata2); + await tokenManagerLinker2.registerTokenManager(tokenManagerERC721WithMetadata2); + await messageProxyForSchain2.registerExtraContractForAll(tokenManagerERC721WithMetadata2); }); it("should invoke `transferToSchainERC721` without mistakes", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -238,133 +239,132 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); }); it("should reject `transferToSchainERC721` when executing earlier then allowed", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain.connect(deployer).addConnectedChain(newSchainName); await erc721OnOriginChain.connect(deployer).mint(user.address, 1); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, 1); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, 1); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 1) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 1) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, 1) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, 1) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 1); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 1); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(1)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(1); await erc721OnOriginChain.connect(deployer).mint(user.address, 2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, 2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, 2); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 2); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await communityLocker.grantRole(await communityLocker.CONSTANT_SETTER_ROLE(), deployer.address); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await erc721OnOriginChain.connect(deployer).mint(user.address, 3); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, 3); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, 3); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 3) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 3) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(90); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 3) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 3) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(2)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(2); await skipTime(20); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 3); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 3); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(3)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(3); await communityLocker.setTimeLimitPerMessage(newSchainName, 0); await erc721OnOriginChain.connect(deployer).mint(user.address, 4); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, 4); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, 4); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 4); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 4); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await communityLocker.setTimeLimitPerMessage(newSchainName, 100); await erc721OnOriginChain.connect(deployer).mint(user.address, 5); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, 5); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, 5); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 5) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 5) .should.be.eventually.rejectedWith("Exceeded message rate limit"); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(4)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(4); await skipTime(110); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, 5); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, 5); - BigNumber.from(await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.deep.equal(BigNumber.from(5)); + (await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)).should.be.equal(5); }); it("should invoke `transferToSchainERC721` and receive tokens without mistakes", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -372,27 +372,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); const data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -403,31 +403,30 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC721WithMetadata2.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain.address); + const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain); const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); }); it("should invoke `transferToSchainERC721` and receive tokens without mistakes double", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -435,27 +434,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -466,56 +465,55 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC721WithMetadata2.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain.address); - const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain); + const targetErc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); const tokenId2 = 2; const tokenURI2 = "Hello2"; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); await erc721OnOriginChain.connect(user).setTokenURI(tokenId2, tokenURI2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId2); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2, tokenURI2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - expect((await targetErc721OnChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await targetErc721OnChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); }); it("should invoke `transferToSchainERC721` and receive tokens without mistakes double with attached token", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -523,27 +521,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -554,55 +552,62 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address).should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); + await tokenManagerERC721WithMetadata2 + .connect(schainOwner) + .addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain) + .should.be.eventually.rejectedWith("TOKEN_REGISTRAR_ROLE is required"); await tokenManagerERC721WithMetadata2.connect(deployer).grantRole(await tokenManagerERC721WithMetadata2.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address).should.be.eventually.rejectedWith("Chain is not connected"); + await tokenManagerERC721WithMetadata2 + .connect(schainOwner) + .addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain) + .should.be.eventually.rejectedWith("Chain is not connected"); await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2 + .connect(schainOwner) + .addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); const tokenId2 = 2; const tokenURI2 = "Hello2"; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); await erc721OnOriginChain.connect(user).setTokenURI(tokenId2, tokenURI2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId2); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2, tokenURI2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnTargetChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -610,27 +615,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -641,63 +646,62 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC721WithMetadata2.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain.address); - const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain); + const targetErc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes with attached tokens", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -705,27 +709,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -736,58 +740,57 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); await tokenManagerERC721WithMetadata2.connect(deployer).grantRole(await tokenManagerERC721WithMetadata2.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes double", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -795,27 +798,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -826,143 +829,142 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data).should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC721WithMetadata2.enableAutomaticDeploy(); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain.address); - const targetErc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + const addressERC721OnSchain = await tokenManagerERC721WithMetadata2.clonesErc721(schainId, erc721OnOriginChain); + const targetErc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); const tokenId2 = 2; const tokenURI2 = "Hello2"; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); await erc721OnOriginChain.connect(user).setTokenURI(tokenId2, tokenURI2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId2); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2, tokenURI2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await targetErc721OnChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - expect((await targetErc721OnChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - expect((await targetErc721OnChain.functions.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); + expect((await targetErc721OnChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await targetErc721OnChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await targetErc721OnChain.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); - await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId2); + await targetErc721OnChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId2); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2, tokenURI2 ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnOriginChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); }); it("should invoke `transferToSchainERC721` and transfer back without mistakes double with attached tokens", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -970,27 +972,27 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -1001,136 +1003,135 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); await tokenManagerERC721WithMetadata2.connect(deployer).grantRole(await tokenManagerERC721WithMetadata2.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Incorrect Token Manager address"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721("Mainnet", erc721OnOriginChain.address, tokenId) + .transferToSchainERC721("Mainnet", erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("This function is not for transferring to Mainnet"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); const tokenId2 = 2; const tokenURI2 = "Hello2"; await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId2); await erc721OnOriginChain.connect(user).setTokenURI(tokenId2, tokenURI2); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId2); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId2); await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2, tokenURI2 ); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnTargetChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId2); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId2); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId2); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId2); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId2, tokenURI2 ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId2)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnOriginChain.ownerOf(tokenId2)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId2)).toString()).to.be.equal(tokenURI2); }); it("should not be able to transfer X->Y->Z", async () => { - await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContract(newSchainName, tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -1138,17 +1139,17 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); const data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -1159,55 +1160,56 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); await tokenManagerERC721WithMetadata2.connect(deployer).grantRole(await tokenManagerERC721WithMetadata2.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); const newSchainNameZ = "NewChainZ"; const erc721OnTargetZChain = await deployERC721OnChain("NewTokenZ", "NTNZ"); const keyStorageZ = await deployKeyStorageMock(); - const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ.address, newSchainNameZ); + const messageProxyForSchainZ = await deployMessageProxyForSchainTester(keyStorageZ, newSchainNameZ); const tokenManagerLinkerZ = await deployTokenManagerLinker(messageProxyForSchainZ, deployer.address); - const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ.address, tokenManagerLinkerZ, fakeCommunityPool); - const tokenManagerERC721WithMetadataZ = await deployTokenManagerERC721WithMetadata(newSchainNameZ, messageProxyForSchainZ.address, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox); - await erc721OnTargetZChain.connect(deployer).grantRole(await erc721OnTargetZChain.MINTER_ROLE(), tokenManagerERC721WithMetadataZ.address); - await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC721WithMetadataZ.address); + const communityLockerZ = await deployCommunityLocker(newSchainName, messageProxyForSchainZ, tokenManagerLinkerZ, fakeCommunityPool); + const tokenManagerERC721WithMetadataZ = await deployTokenManagerERC721WithMetadata( + newSchainNameZ, messageProxyForSchainZ, tokenManagerLinkerZ, communityLockerZ, fakeDepositBox + ); + await erc721OnTargetZChain.connect(deployer).grantRole(await erc721OnTargetZChain.MINTER_ROLE(), tokenManagerERC721WithMetadataZ); + await tokenManagerLinkerZ.registerTokenManager(tokenManagerERC721WithMetadataZ); await messageProxyForSchain2.connect(deployer).grantRole(await messageProxyForSchain2.CHAIN_CONNECTOR_ROLE(), deployer.address); await messageProxyForSchain2.connect(deployer).addConnectedChain(newSchainNameZ); - await tokenManagerERC721WithMetadata2.addTokenManager(newSchainNameZ, tokenManagerERC721WithMetadataZ.address); + await tokenManagerERC721WithMetadata2.addTokenManager(newSchainNameZ, tokenManagerERC721WithMetadataZ); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(newSchainNameZ, erc721OnOriginChain.address, tokenId) + .transferToSchainERC721(newSchainNameZ, erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(newSchainNameZ, erc721OnTargetChain.address, tokenId) + .transferToSchainERC721(newSchainNameZ, erc721OnTargetChain, tokenId) .should.be.eventually.rejectedWith("Incorrect main chain token"); }); it("should not be able to transfer main chain token or clone to mainnet", async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); // add connected chain: await messageProxyForSchain.connect(deployer).grantRole(await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(), deployer.address); @@ -1215,17 +1217,17 @@ describe("TokenManagerERC721WithMetadata", () => { await erc721OnOriginChain.connect(deployer).mint(user.address, tokenId); await erc721OnOriginChain.connect(user).setTokenURI(tokenId, tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); - await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2.address); + await tokenManagerERC721WithMetadata.addTokenManager(newSchainName, tokenManagerERC721WithMetadata2); // execution: await tokenManagerERC721WithMetadata .connect(user) - .transferToSchainERC721(newSchainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(newSchainName, erc721OnOriginChain, tokenId); let data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI, @@ -1236,64 +1238,63 @@ describe("TokenManagerERC721WithMetadata", () => { ); // expectation: - const outgoingMessagesCounter = BigNumber.from( - await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName)); - outgoingMessagesCounter.should.be.deep.equal(BigNumber.from(1)); + const outgoingMessagesCounter = await messageProxyForSchain.getOutgoingMessagesCounter(newSchainName); + outgoingMessagesCounter.should.be.equal(1); // receive: // registration: await messageProxyForSchain2.connect(deployer).addConnectedChain(schainName); - await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata2.addTokenManager(schainName, tokenManagerERC721WithMetadata); await tokenManagerERC721WithMetadata2.connect(deployer).grantRole(await tokenManagerERC721WithMetadata2.TOKEN_REGISTRAR_ROLE(), schainOwner.address); - await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain.address, erc721OnTargetChain.address); + await tokenManagerERC721WithMetadata2.connect(schainOwner).addERC721TokenByOwner(schainName, erc721OnOriginChain, erc721OnTargetChain); - await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2.address, schainId, tokenManagerERC721WithMetadata.address, data); + await messageProxyForSchain2.postMessage(tokenManagerERC721WithMetadata2, schainId, tokenManagerERC721WithMetadata, data); - expect((await erc721OnTargetChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnTargetChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + expect((await erc721OnTargetChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnTargetChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain2.postMessage(communityLocker2.address, mainnetId, fakeCommunityPool, data); + await messageProxyForSchain2.postMessage(communityLocker2, mainnetId, fakeCommunityPool, data); - await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2.address, tokenId); + await erc721OnTargetChain.connect(user).approve(tokenManagerERC721WithMetadata2, tokenId); await tokenManagerERC721WithMetadata2 .connect(user) - .exitToMainERC721(erc721OnOriginChain.address, tokenId) + .exitToMainERC721(erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Not allowed ERC721 Token"); await tokenManagerERC721WithMetadata2 .connect(user) - .exitToMainERC721(erc721OnTargetChain.address, tokenId) + .exitToMainERC721(erc721OnTargetChain, tokenId) .should.be.eventually.rejectedWith("Incorrect main chain token"); await tokenManagerERC721WithMetadata2 .connect(user) - .transferToSchainERC721(schainName, erc721OnOriginChain.address, tokenId); + .transferToSchainERC721(schainName, erc721OnOriginChain, tokenId); data = await messages.encodeTransferErc721MessageWithMetadata( - erc721OnOriginChain.address, + erc721OnOriginChain, user.address, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, newSchainId, tokenManagerERC721WithMetadata2.address, data); - expect((await erc721OnOriginChain.functions.ownerOf(tokenId)).toString()).to.be.equal(user.address); - expect((await erc721OnOriginChain.functions.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, newSchainId, tokenManagerERC721WithMetadata2, data); + expect((await erc721OnOriginChain.ownerOf(tokenId)).toString()).to.be.equal(user.address); + expect((await erc721OnOriginChain.tokenURI(tokenId)).toString()).to.be.equal(tokenURI); - await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata.address, tokenId); + await erc721OnOriginChain.connect(user).approve(tokenManagerERC721WithMetadata, tokenId); await tokenManagerERC721WithMetadata .connect(user) - .exitToMainERC721(erc721OnOriginChain.address, tokenId) + .exitToMainERC721(erc721OnOriginChain, tokenId) .should.be.eventually.rejectedWith("Main chain token could not be transfered to Mainnet"); await tokenManagerERC721WithMetadata .connect(user) - .exitToMainERC721(erc721OnTargetChain.address, tokenId) + .exitToMainERC721(erc721OnTargetChain, tokenId) .should.be.eventually.rejectedWith("ERC721: invalid token ID"); }); @@ -1302,13 +1303,13 @@ describe("TokenManagerERC721WithMetadata", () => { describe("tests for `postMessage` function", async () => { beforeEach(async () => { - await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721WithMetadata); }); it("should transfer ERC721 token token with token info", async () => { // preparation const data = await messages.encodeTransferErc721WithMetadataAndTokenInfoMessage( - token.address, + token, to, tokenId, tokenURI, @@ -1318,34 +1319,34 @@ describe("TokenManagerERC721WithMetadata", () => { } ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("Automatic deploy is disabled"); await tokenManagerERC721WithMetadata.connect(schainOwner).enableAutomaticDeploy(); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, mainnetId, fakeDepositBox, data); - const addressERC721OnSchain = await tokenManagerERC721WithMetadata.clonesErc721(mainnetId, token.address); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, mainnetId, fakeDepositBox, data); + const addressERC721OnSchain = await tokenManagerERC721WithMetadata.clonesErc721(mainnetId, token); const erc721OnChain = await (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await erc721OnChain.functions.ownerOf(tokenId))[0]).to.be.equal(to); - expect((await erc721OnChain.functions.tokenURI(tokenId))[0]).to.be.equal(tokenURI); + expect((await erc721OnChain.ownerOf(tokenId))).to.be.equal(to); + expect((await erc721OnChain.tokenURI(tokenId))).to.be.equal(tokenURI); }); it("should transfer ERC721 token on schain", async () => { // preparation - await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token.address, tokenClone.address); - await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC721WithMetadata.address); + await tokenManagerERC721WithMetadata.connect(schainOwner).addERC721TokenByOwner(mainnetName, token, tokenClone); + await tokenClone.connect(deployer).grantRole(await tokenClone.MINTER_ROLE(), tokenManagerERC721WithMetadata); const data = await messages.encodeTransferErc721MessageWithMetadata( - token.address, + token, to, tokenId, tokenURI ); - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, mainnetId, fakeDepositBox, data); - const addressERC721OnSchain = await tokenManagerERC721WithMetadata.clonesErc721(mainnetId, token.address); + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, mainnetId, fakeDepositBox, data); + const addressERC721OnSchain = await tokenManagerERC721WithMetadata.clonesErc721(mainnetId, token); const erc721OnChain = (await ethers.getContractFactory("ERC721OnChain")).attach(addressERC721OnSchain) as ERC721OnChain; - expect((await erc721OnChain.functions.ownerOf(tokenId))[0]).to.be.equal(to); - expect((await erc721OnChain.functions.tokenURI(tokenId))[0]).to.be.equal(tokenURI); + expect((await erc721OnChain.ownerOf(tokenId))).to.be.equal(to); + expect((await erc721OnChain.tokenURI(tokenId))).to.be.equal(tokenURI); }); it("should reject if message type is unknown", async () => { @@ -1353,7 +1354,7 @@ describe("TokenManagerERC721WithMetadata", () => { "000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0"+ "00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"+ "0000000000000000000000000000000000000000000000000000000000000001"; - await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata.address, mainnetId, fakeDepositBox, data) + await messageProxyForSchain.postMessage(tokenManagerERC721WithMetadata, mainnetId, fakeDepositBox, data) .should.be.eventually.rejectedWith("MessageType is unknown"); }); diff --git a/proxy/test/TokenManagerEth.ts b/test/TokenManagerEth.ts similarity index 82% rename from proxy/test/TokenManagerEth.ts rename to test/TokenManagerEth.ts index ba509ffc2..b530295ff 100644 --- a/proxy/test/TokenManagerEth.ts +++ b/test/TokenManagerEth.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai, { assert } from "chai"; import { CommunityLocker, EthErc20, @@ -33,7 +33,7 @@ import { TokenManagerEth, TokenManagerLinker, } from "../typechain"; -import { stringKeccak256 } from "./utils/helper"; + chai.should(); chai.use(chaiAsPromised); @@ -45,15 +45,14 @@ import { deployEthErc20 } from "./utils/deploy/schain/ethErc20"; import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { deployMessageProxyForSchainTester } from "./utils/deploy/test/messageProxyForSchainTester"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; const schainName = "TestSchain"; -const schainHash = stringKeccak256(schainName); +const schainHash = ethers.id(schainName); describe("TokenManagerEth", () => { let deployer: SignerWithAddress; @@ -67,7 +66,7 @@ describe("TokenManagerEth", () => { let communityLocker: CommunityLocker; let fakeDepositBox: string; let fakeCommunityPool: string; - const mainnetHash = stringKeccak256("Mainnet"); + const mainnetHash = ethers.id("Mainnet"); before(async () => { [deployer, user] = await ethers.getSigners(); @@ -75,14 +74,19 @@ describe("TokenManagerEth", () => { beforeEach(async () => { const keyStorage = await deployKeyStorageMock(); - messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchainTester(keyStorage, schainName); tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, deployer.address); - fakeDepositBox = tokenManagerLinker.address; - fakeCommunityPool = tokenManagerLinker.address; - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, fakeCommunityPool); + fakeDepositBox = user.address; + fakeCommunityPool = user.address; + communityLocker = await deployCommunityLocker( + schainName, + messageProxyForSchain, + tokenManagerLinker, + fakeCommunityPool + ); tokenManagerEth = await deployTokenManagerEth( schainName, - messageProxyForSchain.address, + messageProxyForSchain, tokenManagerLinker, communityLocker, fakeDepositBox, @@ -91,19 +95,19 @@ describe("TokenManagerEth", () => { ethERC20 = await deployEthErc20( tokenManagerEth ); - await tokenManagerLinker.registerTokenManager(tokenManagerEth.address); - await tokenManagerEth.connect(deployer).setEthErc20Address(ethERC20.address); + await tokenManagerLinker.registerTokenManager(tokenManagerEth); + await tokenManagerEth.connect(deployer).setEthErc20Address(ethERC20); messages = await deployMessages(); const data = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, data); + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, data); const extraContractRegistrarRole = await messageProxyForSchain.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); }); it("should set EthErc20 address", async () => { - const newEthErc20Address = tokenManagerLinker.address; + const newEthErc20Address = tokenManagerLinker; // only owner can set EthErc20 address: await tokenManagerEth.connect(user).setEthErc20Address(newEthErc20Address).should.be.rejected; await tokenManagerEth.connect(deployer).setEthErc20Address(newEthErc20Address); @@ -126,6 +130,7 @@ describe("TokenManagerEth", () => { const tokenManagerAddress = user.address; const nullAddress = "0x0000000000000000000000000000000000000000"; const schainName2 = "TestSchain2"; + const schainHash = ethers.id(schainName2); // only owner can add deposit box: await tokenManagerEth.connect(user).addTokenManager(schainName2, tokenManagerAddress).should.be.rejected; @@ -141,7 +146,7 @@ describe("TokenManagerEth", () => { await tokenManagerEth.connect(deployer).addTokenManager(schainName2, tokenManagerAddress). should.be.rejectedWith("Token Manager is already set"); - const storedDepositBox = await tokenManagerEth.tokenManagers(stringKeccak256(schainName2)); + const storedDepositBox = await tokenManagerEth.tokenManagers(schainHash); expect(storedDepositBox).to.equal(tokenManagerAddress); }); @@ -156,7 +161,7 @@ describe("TokenManagerEth", () => { .connect(deployer) .hasTokenManager(schainName2); // expectation - expect(res).to.be.true; + assert(res); }); it("should return false when invoke `hasTokenManager`", async () => { @@ -167,7 +172,7 @@ describe("TokenManagerEth", () => { .connect(deployer) .hasTokenManager(schainName2); // expectation - expect(res).to.be.false; + assert.isFalse(res); }); it("should invoke `removeTokenManager` without mistakes", async () => { @@ -175,12 +180,13 @@ describe("TokenManagerEth", () => { const tokenManagerAddress = user.address; const nullAddress = "0x0000000000000000000000000000000000000000"; const schainName2 = "TestSchain2"; + const schainHash = ethers.id(schainName2); // add deposit box: await tokenManagerEth.connect(deployer).addTokenManager(schainName2, tokenManagerAddress); // execution await tokenManagerEth.connect(deployer).removeTokenManager(schainName2); // expectation - const getMapping = await tokenManagerEth.tokenManagers(stringKeccak256(schainName2)); + const getMapping = await tokenManagerEth.tokenManagers(schainHash); expect(getMapping).to.equal(nullAddress); }); @@ -193,26 +199,26 @@ describe("TokenManagerEth", () => { }); it("should send Eth to somebody on Mainnet, closed to Mainnet, called by schain", async () => { - const amount = BigNumber.from("60"); - const amountAfter = BigNumber.from("54"); - const amountTo = BigNumber.from("6"); - await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerEth.address); + const amount = 60; + const amountAfter = 54; + const amountTo = 6; + await messageProxyForSchain.registerExtraContract("Mainnet", tokenManagerEth); await ethERC20.grantRole(await ethERC20.MINTER_ROLE(), deployer.address); await ethERC20.mint(user.address, amount); - // send Eth to a client on Mainnet: + // // send Eth to a client on Mainnet: await tokenManagerEth.connect(user).exitToMain(amountTo); - expect(BigNumber.from(await ethERC20.balanceOf(user.address)).toString()).to.be.equal(amountAfter.toString()); + expect(await ethERC20.balanceOf(user.address)).to.be.equal(amountAfter.toString()); let data1 = await messages.encodeLockUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, data1); + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, data1); await tokenManagerEth.connect(user).exitToMain(amountTo) .should.be.eventually.rejectedWith("Recipient must be active"); data1 = await messages.encodeActivateUserMessage(user.address); - await messageProxyForSchain.postMessage(communityLocker.address, mainnetHash, fakeCommunityPool, data1); + await messageProxyForSchain.postMessage(communityLocker, mainnetHash, fakeCommunityPool, data1); await tokenManagerEth.connect(user).exitToMain(amountTo) .should.be.eventually.rejectedWith("Exceeded message rate limit"); @@ -241,14 +247,21 @@ describe("TokenManagerEth", () => { const amount = 10; const bytesData = await messages.encodeTransferEthMessage(user.address, amount); const sender = deployer.address; - // redeploy tokenManagerEth with `developer` address instead `messageProxyForSchain.address` + // redeploy tokenManagerEth with `developer` address instead `messageProxyForSchain` // to avoid `Not a sender` error - tokenManagerEth = await deployTokenManagerEth(schainName, deployer.address, tokenManagerLinker, communityLocker, fakeDepositBox, ethERC20.address); + tokenManagerEth = await deployTokenManagerEth( + schainName, + messageProxyForSchain, + tokenManagerLinker, + communityLocker, + fakeDepositBox, + await ethERC20.getAddress() + ); // await tokenManagerEth.setContract("MessageProxy", deployer, {from: deployer}); // execution - await tokenManagerEth + await messageProxyForSchain .connect(deployer) - .postMessage(schainHash, sender, bytesData) + .postMessage(tokenManagerEth, schainHash, sender, bytesData) .should.be.eventually.rejectedWith(error); }); @@ -256,9 +269,16 @@ describe("TokenManagerEth", () => { // for `Invalid data` message bytesData should be `0x` const bytesData = "0x"; const sender = deployer.address; - // redeploy tokenManagerEth with `developer` address instead `messageProxyForSchain.address` + // redeploy tokenManagerEth with `developer` address instead `messageProxyForSchain` // to avoid `Not a sender` error - tokenManagerEth = await deployTokenManagerEth(schainName, deployer.address, tokenManagerLinker, communityLocker, fakeDepositBox, ethERC20.address); + tokenManagerEth = await deployTokenManagerEth( + schainName, + messageProxyForSchain, + tokenManagerLinker, + communityLocker, + fakeDepositBox, + await ethERC20.getAddress() + ); // add schain to avoid the `Receiver chain is incorrect` error await tokenManagerEth .connect(deployer) @@ -272,9 +292,9 @@ describe("TokenManagerEth", () => { it("should transfer eth", async () => { // preparation - await messageProxyForSchain.registerExtraContractForAll(tokenManagerEth.address); + await messageProxyForSchain.registerExtraContractForAll(tokenManagerEth); const fromSchainName = "fromSchainName"; - const fromSchainId = stringKeccak256(fromSchainName); + const fromSchainId = ethers.id(fromSchainName); const amount = "10"; const sender = deployer.address; const to = user.address; @@ -285,32 +305,31 @@ describe("TokenManagerEth", () => { await tokenManagerEth .connect(deployer) .addTokenManager(fromSchainName, deployer.address); - await ethERC20.connect(deployer).grantRole(await ethERC20.MINTER_ROLE(), tokenManagerEth.address); - await ethERC20.connect(deployer).grantRole(await ethERC20.BURNER_ROLE(), tokenManagerEth.address); + await ethERC20.connect(deployer).grantRole(await ethERC20.MINTER_ROLE(), tokenManagerEth); + await ethERC20.connect(deployer).grantRole(await ethERC20.BURNER_ROLE(), tokenManagerEth); // execution await messageProxyForSchain.postMessage( - tokenManagerEth.address, + tokenManagerEth, fromSchainId, sender, bytesData ).should.be.eventually.rejectedWith("Receiver chain is incorrect"); await messageProxyForSchain.postMessage( - tokenManagerEth.address, + tokenManagerEth, mainnetHash, sender, bytesData ).should.be.eventually.rejectedWith("Receiver chain is incorrect"); await messageProxyForSchain.postMessage( - tokenManagerEth.address, + tokenManagerEth, mainnetHash, fakeDepositBox, bytesData ); // expectation - expect(parseInt((BigNumber.from(await ethERC20.balanceOf(to))).toString(), 10)) - .to.be.equal(parseInt(amount, 10)); + expect(await ethERC20.balanceOf(to)).to.be.equal(amount); }); }); }); diff --git a/proxy/test/TokenManagerLinker.ts b/test/TokenManagerLinker.ts similarity index 73% rename from proxy/test/TokenManagerLinker.ts rename to test/TokenManagerLinker.ts index 5c973e0a4..b7d3540e7 100644 --- a/proxy/test/TokenManagerLinker.ts +++ b/test/TokenManagerLinker.ts @@ -24,7 +24,7 @@ */ import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { CommunityLocker, TokenManagerEth, @@ -46,7 +46,7 @@ import { deployMessageProxyForSchainTester } from "./utils/deploy/test/messagePr import { deployCommunityLocker } from "./utils/deploy/schain/communityLocker"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { deployKeyStorageMock } from "./utils/deploy/test/keyStorageMock"; @@ -73,20 +73,20 @@ describe("TokenManagerLinker", () => { beforeEach(async () => { newSchainName = "newSchainName"; const keyStorage = await deployKeyStorageMock(); - messageProxy = await deployMessageProxyForSchainTester(keyStorage.address, schainName); + messageProxy = await deployMessageProxyForSchainTester(keyStorage, schainName); const fakeLinker = deployer.address; linker = await deployTokenManagerLinker(messageProxy, fakeLinker); - fakeDepositBox = linker.address; - fakeCommunityPool = linker.address; - communityLocker = await deployCommunityLocker(schainName, messageProxy.address, linker, fakeCommunityPool); - tokenManagerEth = await deployTokenManagerEth(schainName, messageProxy.address, linker, communityLocker, fakeDepositBox, "0x0000000000000000000000000000000000000000"); - tokenManagerERC20 = await deployTokenManagerERC20(schainName, messageProxy.address, linker, communityLocker, fakeDepositBox); - tokenManagerERC721 = await deployTokenManagerERC721(schainName, messageProxy.address, linker, communityLocker, fakeDepositBox); + fakeDepositBox = deployer.address; + fakeCommunityPool = deployer.address; + communityLocker = await deployCommunityLocker(schainName, messageProxy, linker, fakeCommunityPool); + tokenManagerEth = await deployTokenManagerEth(schainName, messageProxy, linker, communityLocker, fakeDepositBox, "0x0000000000000000000000000000000000000000"); + tokenManagerERC20 = await deployTokenManagerERC20(schainName, messageProxy, linker, communityLocker, fakeDepositBox); + tokenManagerERC721 = await deployTokenManagerERC721(schainName, messageProxy, linker, communityLocker, fakeDepositBox); const chainConnectorRole = await messageProxy.CHAIN_CONNECTOR_ROLE(); - await messageProxy.connect(deployer).grantRole(chainConnectorRole, linker.address); + await messageProxy.connect(deployer).grantRole(chainConnectorRole, linker); const extraContractRegistrarRole = await messageProxy.EXTRA_CONTRACT_REGISTRAR_ROLE(); await messageProxy.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxy.registerExtraContractForAll(linker.address); + await messageProxy.registerExtraContractForAll(linker); }); it("should connect schain", async () => { @@ -97,11 +97,11 @@ describe("TokenManagerLinker", () => { }); it("should connect schain with 1 tokenManager", async () => { - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(false); - await linker.connect(deployer).registerTokenManager(tokenManagerEth.address); + await linker.connect(deployer).registerTokenManager(tokenManagerEth); - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(true); expect(await linker.hasSchain(newSchainName)).to.equal(false); @@ -111,17 +111,17 @@ describe("TokenManagerLinker", () => { }); it("should connect schain with 3 tokenManager", async () => { - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(false); - expect(await linker.hasTokenManager(tokenManagerERC20.address)).to.equal(false); - expect(await linker.hasTokenManager(tokenManagerERC721.address)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerERC20)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerERC721)).to.equal(false); - await linker.connect(deployer).registerTokenManager(tokenManagerEth.address); - await linker.connect(deployer).registerTokenManager(tokenManagerERC20.address); - await linker.connect(deployer).registerTokenManager(tokenManagerERC721.address); + await linker.connect(deployer).registerTokenManager(tokenManagerEth); + await linker.connect(deployer).registerTokenManager(tokenManagerERC20); + await linker.connect(deployer).registerTokenManager(tokenManagerERC721); - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(true); - expect(await linker.hasTokenManager(tokenManagerERC20.address)).to.equal(true); - expect(await linker.hasTokenManager(tokenManagerERC721.address)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerERC20)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerERC721)).to.equal(true); expect(await linker.hasSchain(newSchainName)).to.equal(false); @@ -131,9 +131,9 @@ describe("TokenManagerLinker", () => { }); it("should invoke `disconnectSchain` without mistakes", async () => { - await linker.connect(deployer).registerTokenManager(tokenManagerEth.address); - await linker.connect(deployer).registerTokenManager(tokenManagerERC20.address); - await linker.connect(deployer).registerTokenManager(tokenManagerERC721.address); + await linker.connect(deployer).registerTokenManager(tokenManagerEth); + await linker.connect(deployer).registerTokenManager(tokenManagerERC20); + await linker.connect(deployer).registerTokenManager(tokenManagerERC721); await linker.connect(deployer).connectSchain(newSchainName); @@ -149,17 +149,17 @@ describe("TokenManagerLinker", () => { const nullAddress = "0x0000000000000000000000000000000000000000"; const tokenManagerAddress = user.address; - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(false); - expect(await linker.hasTokenManager(tokenManagerERC20.address)).to.equal(false); - expect(await linker.hasTokenManager(tokenManagerERC721.address)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerERC20)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerERC721)).to.equal(false); - await linker.connect(deployer).registerTokenManager(tokenManagerEth.address); - await linker.connect(deployer).registerTokenManager(tokenManagerERC20.address); - await linker.connect(deployer).registerTokenManager(tokenManagerERC721.address); + await linker.connect(deployer).registerTokenManager(tokenManagerEth); + await linker.connect(deployer).registerTokenManager(tokenManagerERC20); + await linker.connect(deployer).registerTokenManager(tokenManagerERC721); - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(true); - expect(await linker.hasTokenManager(tokenManagerERC20.address)).to.equal(true); - expect(await linker.hasTokenManager(tokenManagerERC721.address)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerERC20)).to.equal(true); + expect(await linker.hasTokenManager(tokenManagerERC721)).to.equal(true); expect(await linker.hasTokenManager(nullAddress)).to.equal(false); expect(await linker.hasTokenManager(tokenManagerAddress)).to.equal(false); @@ -183,13 +183,13 @@ describe("TokenManagerLinker", () => { expect(await linker.hasTokenManager(nullAddress)).to.equal(false); - await linker.connect(deployer).removeTokenManager(tokenManagerEth.address); - await linker.connect(deployer).removeTokenManager(tokenManagerERC20.address); - await linker.connect(deployer).removeTokenManager(tokenManagerERC721.address); + await linker.connect(deployer).removeTokenManager(tokenManagerEth); + await linker.connect(deployer).removeTokenManager(tokenManagerERC20); + await linker.connect(deployer).removeTokenManager(tokenManagerERC721); - expect(await linker.hasTokenManager(tokenManagerEth.address)).to.equal(false); - expect(await linker.hasTokenManager(tokenManagerERC20.address)).to.equal(false); - expect(await linker.hasTokenManager(tokenManagerERC721.address)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerEth)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerERC20)).to.equal(false); + expect(await linker.hasTokenManager(tokenManagerERC721)).to.equal(false); }); }); diff --git a/proxy/test/extensions/ERC721MintingFromSchainToMainnet.ts b/test/extensions/ERC721MintingFromSchainToMainnet.ts similarity index 85% rename from proxy/test/extensions/ERC721MintingFromSchainToMainnet.ts rename to test/extensions/ERC721MintingFromSchainToMainnet.ts index 08aac30c9..9c466b6aa 100644 --- a/proxy/test/extensions/ERC721MintingFromSchainToMainnet.ts +++ b/test/extensions/ERC721MintingFromSchainToMainnet.ts @@ -23,9 +23,9 @@ * @copyright SKALE Labs 2019-Present */ -import { solidity } from "ethereum-waffle"; +// import { solidity } from "ethereum-waffle"; import chaiAsPromised from "chai-as-promised"; -import chai = require("chai"); +import chai from "chai"; import { CommunityLocker, CommunityPool, @@ -47,7 +47,7 @@ import { chai.should(); chai.use(chaiAsPromised); -chai.use(solidity); +// chai.use(solidity); import { deployLinker } from "../utils/deploy/mainnet/linker"; import { deployMessageProxyForMainnet } from "../utils/deploy/mainnet/messageProxyForMainnet"; @@ -66,11 +66,11 @@ import { deployContractManager } from "../utils/skale-manager-utils/contractMana import { deployTokenManagerLinker } from "../utils/deploy/schain/tokenManagerLinker"; import { deployMessageProxyForSchain } from "../utils/deploy/schain/messageProxyForSchain"; -import { stringKeccak256, getPublicKey } from "../utils/helper"; +import { getPublicKey } from "../utils/helper"; import { ethers } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; -import { BigNumber, Wallet } from "ethers"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { BigNumberish, HDNodeWallet, Wallet } from "ethers"; import { expect } from "chai"; import { deployCommunityLocker } from "../utils/deploy/schain/communityLocker"; @@ -81,7 +81,7 @@ describe("ERC721MintingFromSchainToMainnet", () => { let deployer: SignerWithAddress; let user: SignerWithAddress; let richGuy: SignerWithAddress; - let nodeAddress: Wallet; + let nodeAddress: HDNodeWallet; let imaLinker: Linker; let communityPool: CommunityPool; @@ -104,14 +104,14 @@ describe("ERC721MintingFromSchainToMainnet", () => { let extensionSchain: ERC721ReferenceMintAndMetadataSchain; const schainName = "ExtensionChain"; - const schainNameHash = stringKeccak256("ExtensionChain"); + const schainNameHash = ethers.id("ExtensionChain"); const contractManagerAddress = "0x0000000000000000000000000000000000000000"; before(async () => { [deployer, user, richGuy] = await ethers.getSigners(); nodeAddress = Wallet.createRandom().connect(ethers.provider); - const balanceRichGuy = await richGuy.getBalance(); - await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy.sub(ethers.utils.parseEther("1"))}); + const balanceRichGuy = await ethers.provider.getBalance(richGuy.address); + await richGuy.sendTransaction({to: nodeAddress.address, value: balanceRichGuy - BigInt(ethers.parseEther("1"))}); }) beforeEach(async () => { @@ -123,17 +123,17 @@ describe("ERC721MintingFromSchainToMainnet", () => { schainsInternal = await (await ethers.getContractFactory("SchainsInternal")).deploy() as SchainsInternal; skaleVerifier = await (await ethers.getContractFactory("SkaleVerifierMock")).deploy() as SkaleVerifierMock; wallets = await (await ethers.getContractFactory("Wallets")).deploy() as Wallets; - await contractManager.connect(deployer).setContractsAddress("KeyStorage", keyStorage.address); - await contractManager.connect(deployer).setContractsAddress("Nodes", nodes.address); - await contractManager.connect(deployer).setContractsAddress("Schains", schains.address); - await contractManager.connect(deployer).setContractsAddress("SchainsInternal", schainsInternal.address); - await contractManager.connect(deployer).setContractsAddress("SkaleVerifier", skaleVerifier.address); - await contractManager.connect(deployer).setContractsAddress("Wallets", wallets.address); + await contractManager.connect(deployer).setContractsAddress("KeyStorage", keyStorage); + await contractManager.connect(deployer).setContractsAddress("Nodes", nodes); + await contractManager.connect(deployer).setContractsAddress("Schains", schains); + await contractManager.connect(deployer).setContractsAddress("SchainsInternal", schainsInternal); + await contractManager.connect(deployer).setContractsAddress("SkaleVerifier", skaleVerifier); + await contractManager.connect(deployer).setContractsAddress("Wallets", wallets); // add ContractManager to contracts - await schains.connect(deployer).addContractManager(contractManager.address); - await schainsInternal.connect(deployer).addContractManager(contractManager.address); - await wallets.connect(deployer).addContractManager(contractManager.address); + await schains.connect(deployer).addContractManager(contractManager); + await schainsInternal.connect(deployer).addContractManager(contractManager); + await wallets.connect(deployer).addContractManager(contractManager); // setup 16 nodes const nodeCreationParams = { @@ -191,36 +191,36 @@ describe("ERC721MintingFromSchainToMainnet", () => { const extraContractRegistrarRole = await messageProxyForMainnet.EXTRA_CONTRACT_REGISTRAR_ROLE(); const chainConnectorRole2 = await messageProxyForMainnet.CHAIN_CONNECTOR_ROLE(); await messageProxyForMainnet.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); - await messageProxyForMainnet.connect(deployer).grantRole(chainConnectorRole2, imaLinker.address); + await messageProxyForMainnet.connect(deployer).grantRole(chainConnectorRole2, imaLinker); // await messageProxyForMainnet.registerExtraContractForAll(depositBoxEth.address) // await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC20.address) // await messageProxyForMainnet.registerExtraContractForAll(depositBoxERC721.address) - // await messageProxyForMainnet.registerExtraContractForAll(communityPool.address) + // await messageProxyForMainnet.registerExtraContractForAll(communityPool) // IMA schain part deployment - messageProxyForSchain = await deployMessageProxyForSchain(keyStorage.address, schainName); + messageProxyForSchain = await deployMessageProxyForSchain(keyStorage, schainName); await keyStorage.connect(deployer).setBlsCommonPublicKey(BLSPublicKey); - tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, imaLinker.address); - communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain.address, tokenManagerLinker, communityPool.address); + tokenManagerLinker = await deployTokenManagerLinker(messageProxyForSchain, await imaLinker.getAddress()); + communityLocker = await deployCommunityLocker(schainName, messageProxyForSchain, tokenManagerLinker, await communityPool.getAddress()); // tokenManagerEth = await deployTokenManagerEth( // schainName, - // messageProxyForSchain.address, + // messageProxyForSchain, // tokenManagerLinker, // communityLocker, // depositBoxEth.address, // "0x0000000000000000000000000000000000000000"); - // tokenManagerERC20 = await deployTokenManagerERC20(schainName, messageProxyForSchain.address, tokenManagerLinker, communityLocker, depositBoxERC20.address); - // tokenManagerERC721 = await deployTokenManagerERC721(schainName, messageProxyForSchain.address, tokenManagerLinker, communityLocker, depositBoxERC721.address); + // tokenManagerERC20 = await deployTokenManagerERC20(schainName, messageProxyForSchain, tokenManagerLinker, communityLocker, depositBoxERC20.address); + // tokenManagerERC721 = await deployTokenManagerERC721(schainName, messageProxyForSchain, tokenManagerLinker, communityLocker, depositBoxERC721.address); await messageProxyForSchain.connect(deployer).grantRole(extraContractRegistrarRole, deployer.address); // await messageProxyForSchain.registerExtraContractForAll(tokenManagerEth.address) // await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC20.address) // await messageProxyForSchain.registerExtraContractForAll(tokenManagerERC721.address) - // await messageProxyForSchain.registerExtraContractForAll(communityLocker.address) + // await messageProxyForSchain.registerExtraContractForAll(communityLocker) // ethERC20 = await deployEthErc20(tokenManagerEth); // await tokenManagerEth.connect(deployer).setEthErc20Address(ethERC20.address); const chainConnectorRole = await messageProxyForSchain.CHAIN_CONNECTOR_ROLE(); - await messageProxyForSchain.connect(deployer).grantRole(chainConnectorRole, tokenManagerLinker.address); + await messageProxyForSchain.connect(deployer).grantRole(chainConnectorRole, tokenManagerLinker); // await tokenManagerERC20.connect(deployer).grantRole(await tokenManagerERC20.TOKEN_REGISTRAR_ROLE(), schainOwner.address); // await tokenManagerERC721.connect(deployer).grantRole(await tokenManagerERC721.TOKEN_REGISTRAR_ROLE(), schainOwner.address); @@ -230,11 +230,11 @@ describe("ERC721MintingFromSchainToMainnet", () => { // await lockAndDataForSchain.setContract("ERC20Module", erc20ModuleForSchain.address); // await lockAndDataForSchain.setContract("ERC721Module", erc721ModuleForSchain.address); // await lockAndDataForSchain.setContract("TokenManager", tokenManager.address); - // await lockAndDataForSchain.setContract("MessageProxy", messageProxyForSchain.address); + // await lockAndDataForSchain.setContract("MessageProxy", messageProxyForSchain); // await lockAndDataForSchain.setContract("TokenFactory", tokenFactory.address); // IMA registration - await imaLinker.connectSchain(schainName, [communityLocker.address, tokenManagerLinker.address]); + await imaLinker.connectSchain(schainName, [communityLocker, tokenManagerLinker]); // await communityPool.connect(user).rechargeUserWallet(schainName, { value: 1e18.toString() }); // await lockAndDataForSchain.addDepositBox(depositBoxEth.address); // await lockAndDataForSchain.addDepositBox(depositBoxERC20.address); @@ -269,57 +269,57 @@ describe("ERC721MintingFromSchainToMainnet", () => { const extensionMainnetFactory = await ethers.getContractFactory("ERC721ReferenceMintAndMetadataMainnet"); extensionMainnet = await extensionMainnetFactory.deploy( - messageProxyForMainnet.address, - ERC721TokenOnMainnet.address, + messageProxyForMainnet, + ERC721TokenOnMainnet, schainName ) as ERC721ReferenceMintAndMetadataMainnet; extensionSchain = await extensionSchainFactory.deploy( - messageProxyForSchain.address, - ERC721TokenOnSchain.address, - extensionMainnet.address + messageProxyForSchain, + ERC721TokenOnSchain, + extensionMainnet ) as ERC721ReferenceMintAndMetadataSchain; - await extensionMainnet.connect(deployer).setSenderContractOnSchain(extensionSchain.address); + await extensionMainnet.connect(deployer).setSenderContractOnSchain(extensionSchain); // add minter role const minterRoleERC721 = await ERC721TokenOnMainnet.MINTER_ROLE(); - await ERC721TokenOnMainnet.grantRole(minterRoleERC721, extensionMainnet.address); + await ERC721TokenOnMainnet.grantRole(minterRoleERC721, extensionMainnet); }); it("should not send message if not registered", async () => { await ERC721TokenOnSchain.connect(user).setTokenURI(1, "MyToken1"); - await ERC721TokenOnSchain.connect(user).approve(extensionSchain.address, 1); + await ERC721TokenOnSchain.connect(user).approve(extensionSchain, 1); await extensionSchain.connect(user).sendTokenToMainnet(user.address, 1).should.be.eventually.rejectedWith("Sender contract is not registered"); }); it("should send message", async () => { const tokenURI = "MyToken1"; - const mainnetHash = stringKeccak256("Mainnet"); + const mainnetHash = ethers.id("Mainnet"); await ERC721TokenOnSchain.connect(user).setTokenURI(1, tokenURI); - await ERC721TokenOnSchain.connect(user).approve(extensionSchain.address, 1); - await messageProxyForSchain.connect(deployer).registerExtraContract("Mainnet", extensionSchain.address); + await ERC721TokenOnSchain.connect(user).approve(extensionSchain, 1); + await messageProxyForSchain.connect(deployer).registerExtraContract("Mainnet", extensionSchain); const res = await extensionSchain.connect(user).sendTokenToMainnet(user.address, 1); - const encodedData = ethers.utils.defaultAbiCoder.encode(["address", "uint", "string"], [user.address, 1, tokenURI]); + const encodedData = ethers.AbiCoder.defaultAbiCoder().encode(["address", "uint", "string"], [user.address, 1, tokenURI]); await expect(res) .to.emit(messageProxyForSchain, "OutgoingMessage") - .withArgs(mainnetHash, 0, extensionSchain.address, extensionMainnet.address, encodedData); + .withArgs(mainnetHash, 0, extensionSchain, extensionMainnet, encodedData); }); it("should POST message for token 1", async () => { const dataToPost = await extensionSchain.connect(user).encodeParams(user.address, 1, "MyToken1"); const message = { data: dataToPost, - destinationContract: extensionMainnet.address, - sender: extensionSchain.address, + destinationContract: extensionMainnet, + sender: extensionSchain, }; // prepare BLS signature // P.s. this is test signature from test of SkaleManager.SkaleVerifier - please do not use it!!! - const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781"), + const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781", ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -355,14 +355,14 @@ describe("ERC721MintingFromSchainToMainnet", () => { const message = { data: dataToPost, destinationContract: user.address, - sender: extensionSchain.address, + sender: extensionSchain, }; // prepare BLS signature // P.s. this is test signature from test of SkaleManager.SkaleVerifier - please do not use it!!! - const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781"), + const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781", ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; @@ -388,22 +388,22 @@ describe("ERC721MintingFromSchainToMainnet", () => { 0, [message], sign - )).to.emit(messageProxyForMainnet, "PostMessageError").withArgs(0, ethers.utils.hexlify(ethers.utils.toUtf8Bytes("Destination contract is not a contract"))); + )).to.emit(messageProxyForMainnet, "PostMessageError").withArgs(0, ethers.hexlify(ethers.toUtf8Bytes("Destination contract is not a contract"))); }); it("should POST message for token 5", async () => { const dataToPost = await extensionSchain.connect(user).encodeParams(user.address, 5, "MyToken5Unique"); const message = { data: dataToPost, - destinationContract: extensionMainnet.address, - sender: extensionSchain.address, + destinationContract: extensionMainnet, + sender: extensionSchain, }; // prepare BLS signature // P.s. this is test signature from test of SkaleManager.SkaleVerifier - please do not use it!!! - const BlsSignature: [BigNumber, BigNumber] = [ - BigNumber.from("178325537405109593276798394634841698946852714038246117383766698579865918287"), - BigNumber.from("493565443574555904019191451171395204672818649274520396086461475162723833781"), + const BlsSignature: [BigNumberish, BigNumberish] = [ + "178325537405109593276798394634841698946852714038246117383766698579865918287", + "493565443574555904019191451171395204672818649274520396086461475162723833781" ]; const HashA = "3080491942974172654518861600747466851589809241462384879086673256057179400078"; const HashB = "15163860114293529009901628456926790077787470245128337652112878212941459329347"; diff --git a/proxy/test/utils/command_line.ts b/test/utils/command_line.ts similarity index 96% rename from proxy/test/utils/command_line.ts rename to test/utils/command_line.ts index 12d10324a..5f46b6745 100644 --- a/proxy/test/utils/command_line.ts +++ b/test/utils/command_line.ts @@ -23,7 +23,7 @@ * @copyright SKALE Labs 2019-Present */ -import minimist = require("minimist"); +import minimist from "minimist"; const gasMultiplierParameter = "gas_multiplier"; diff --git a/proxy/test/utils/deploy/erc1155OnChain.ts b/test/utils/deploy/erc1155OnChain.ts similarity index 100% rename from proxy/test/utils/deploy/erc1155OnChain.ts rename to test/utils/deploy/erc1155OnChain.ts diff --git a/proxy/test/utils/deploy/erc20OnChain.ts b/test/utils/deploy/erc20OnChain.ts similarity index 100% rename from proxy/test/utils/deploy/erc20OnChain.ts rename to test/utils/deploy/erc20OnChain.ts diff --git a/proxy/test/utils/deploy/erc721OnChain.ts b/test/utils/deploy/erc721OnChain.ts similarity index 100% rename from proxy/test/utils/deploy/erc721OnChain.ts rename to test/utils/deploy/erc721OnChain.ts diff --git a/proxy/test/utils/deploy/mainnet/communityPool.ts b/test/utils/deploy/mainnet/communityPool.ts similarity index 63% rename from proxy/test/utils/deploy/mainnet/communityPool.ts rename to test/utils/deploy/mainnet/communityPool.ts index 21fe02723..fc3221c02 100644 --- a/proxy/test/utils/deploy/mainnet/communityPool.ts +++ b/test/utils/deploy/mainnet/communityPool.ts @@ -10,10 +10,14 @@ export async function deployCommunityPool( const factory = await ethers.getContractFactory("CommunityPool"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as CommunityPool; - await linker.registerMainnetContract(instance.address); - await messageProxy.setCommunityPool(instance.address); + ) as unknown as CommunityPool; + await linker.registerMainnetContract(instance); + await messageProxy.setCommunityPool(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/depositBoxERC1155.ts b/test/utils/deploy/mainnet/depositBoxERC1155.ts similarity index 68% rename from proxy/test/utils/deploy/mainnet/depositBoxERC1155.ts rename to test/utils/deploy/mainnet/depositBoxERC1155.ts index 840ba18fc..fbc033bec 100644 --- a/proxy/test/utils/deploy/mainnet/depositBoxERC1155.ts +++ b/test/utils/deploy/mainnet/depositBoxERC1155.ts @@ -10,9 +10,13 @@ export async function deployDepositBoxERC1155( const factory = await ethers.getContractFactory("DepositBoxERC1155"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as DepositBoxERC1155; - await linker.registerMainnetContract(instance.address); + ) as unknown as DepositBoxERC1155; + await linker.registerMainnetContract(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/depositBoxERC20.ts b/test/utils/deploy/mainnet/depositBoxERC20.ts similarity index 68% rename from proxy/test/utils/deploy/mainnet/depositBoxERC20.ts rename to test/utils/deploy/mainnet/depositBoxERC20.ts index d8242d76e..27fb92d22 100644 --- a/proxy/test/utils/deploy/mainnet/depositBoxERC20.ts +++ b/test/utils/deploy/mainnet/depositBoxERC20.ts @@ -10,9 +10,13 @@ export async function deployDepositBoxERC20( const factory = await ethers.getContractFactory("DepositBoxERC20"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as DepositBoxERC20; - await linker.registerMainnetContract(instance.address); + ) as unknown as DepositBoxERC20; + await linker.registerMainnetContract(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/depositBoxERC721.ts b/test/utils/deploy/mainnet/depositBoxERC721.ts similarity index 68% rename from proxy/test/utils/deploy/mainnet/depositBoxERC721.ts rename to test/utils/deploy/mainnet/depositBoxERC721.ts index d88cb6ebe..2fa3b0a04 100644 --- a/proxy/test/utils/deploy/mainnet/depositBoxERC721.ts +++ b/test/utils/deploy/mainnet/depositBoxERC721.ts @@ -10,9 +10,13 @@ export async function deployDepositBoxERC721( const factory = await ethers.getContractFactory("DepositBoxERC721"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as DepositBoxERC721; - await linker.registerMainnetContract(instance.address); + ) as unknown as DepositBoxERC721; + await linker.registerMainnetContract(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/depositBoxERC721WithMetadata.ts b/test/utils/deploy/mainnet/depositBoxERC721WithMetadata.ts similarity index 68% rename from proxy/test/utils/deploy/mainnet/depositBoxERC721WithMetadata.ts rename to test/utils/deploy/mainnet/depositBoxERC721WithMetadata.ts index 3e99eae15..8fed2b386 100644 --- a/proxy/test/utils/deploy/mainnet/depositBoxERC721WithMetadata.ts +++ b/test/utils/deploy/mainnet/depositBoxERC721WithMetadata.ts @@ -10,9 +10,13 @@ export async function deployDepositBoxERC721WithMetadata( const factory = await ethers.getContractFactory("DepositBoxERC721WithMetadata"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as DepositBoxERC721WithMetadata; - await linker.registerMainnetContract(instance.address); + ) as unknown as DepositBoxERC721WithMetadata; + await linker.registerMainnetContract(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/depositBoxEth.ts b/test/utils/deploy/mainnet/depositBoxEth.ts similarity index 68% rename from proxy/test/utils/deploy/mainnet/depositBoxEth.ts rename to test/utils/deploy/mainnet/depositBoxEth.ts index c203b4e35..956af2c97 100644 --- a/proxy/test/utils/deploy/mainnet/depositBoxEth.ts +++ b/test/utils/deploy/mainnet/depositBoxEth.ts @@ -10,9 +10,13 @@ export async function deployDepositBoxEth( const factory = await ethers.getContractFactory("DepositBoxEth"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as DepositBoxEth; - await linker.registerMainnetContract(instance.address); + ) as unknown as DepositBoxEth; + await linker.registerMainnetContract(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/linker.ts b/test/utils/deploy/mainnet/linker.ts similarity index 72% rename from proxy/test/utils/deploy/mainnet/linker.ts rename to test/utils/deploy/mainnet/linker.ts index 4602ff154..7aa6debd3 100644 --- a/proxy/test/utils/deploy/mainnet/linker.ts +++ b/test/utils/deploy/mainnet/linker.ts @@ -8,9 +8,12 @@ export async function deployLinker( const factory = await ethers.getContractFactory("Linker"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, messageProxy.address], + [ + await contractManager.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address)"} - ) as Linker; - await instance.registerMainnetContract(instance.address); + ) as unknown as Linker; + await instance.registerMainnetContract(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/mainnet/messageProxyForMainnet.ts b/test/utils/deploy/mainnet/messageProxyForMainnet.ts similarity index 81% rename from proxy/test/utils/deploy/mainnet/messageProxyForMainnet.ts rename to test/utils/deploy/mainnet/messageProxyForMainnet.ts index adbca47fd..e169c9312 100644 --- a/proxy/test/utils/deploy/mainnet/messageProxyForMainnet.ts +++ b/test/utils/deploy/mainnet/messageProxyForMainnet.ts @@ -10,8 +10,8 @@ export async function deployMessageProxyForMainnet( if (await contractManager.getContract(name) !== "0x0000000000000000000000000000000000000000") { return factory.attach(await contractManager.getContract(name)) as MessageProxyForMainnet; } else { - const instance = await upgrades.deployProxy(factory, [contractManager.address]) as MessageProxyForMainnet; - await contractManager.setContractsAddress(name, instance.address); + const instance = await upgrades.deployProxy(factory, [await contractManager.getAddress()]) as unknown as MessageProxyForMainnet; + await contractManager.setContractsAddress(name, instance); return instance; } -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/messages.ts b/test/utils/deploy/messages.ts similarity index 100% rename from proxy/test/utils/deploy/messages.ts rename to test/utils/deploy/messages.ts diff --git a/proxy/test/utils/deploy/schain/communityLocker.ts b/test/utils/deploy/schain/communityLocker.ts similarity index 50% rename from proxy/test/utils/deploy/schain/communityLocker.ts rename to test/utils/deploy/schain/communityLocker.ts index 07ae96d76..51ee758a8 100644 --- a/proxy/test/utils/deploy/schain/communityLocker.ts +++ b/test/utils/deploy/schain/communityLocker.ts @@ -1,18 +1,23 @@ import { ethers, upgrades } from "hardhat"; -import { CommunityLocker, TokenManagerLinker } from "../../../../typechain"; +import { CommunityLocker, MessageProxyForSchain, TokenManagerLinker } from "../../../../typechain"; const name = "CommunityLocker"; export async function deployCommunityLocker( schainName: string, - messageProxyForSchain: string, + messageProxyForSchain: MessageProxyForSchain, tokenManagerLinker: TokenManagerLinker, communityPool: string ) { const factory = await ethers.getContractFactory(name); const instance = await upgrades.deployProxy( factory, - [schainName, messageProxyForSchain, tokenManagerLinker.address, communityPool] - ) as CommunityLocker; + [ + schainName, + await messageProxyForSchain.getAddress(), + await tokenManagerLinker.getAddress(), + communityPool + ] + ) as unknown as CommunityLocker; return instance; } diff --git a/proxy/test/utils/deploy/schain/ethErc20.ts b/test/utils/deploy/schain/ethErc20.ts similarity index 70% rename from proxy/test/utils/deploy/schain/ethErc20.ts rename to test/utils/deploy/schain/ethErc20.ts index 566f4743a..8cef065c5 100644 --- a/proxy/test/utils/deploy/schain/ethErc20.ts +++ b/test/utils/deploy/schain/ethErc20.ts @@ -5,6 +5,6 @@ export async function deployEthErc20( tokenManagerEth: TokenManagerEth ) { const factory = await ethers.getContractFactory("EthErc20"); - const instance = await upgrades.deployProxy(factory, [tokenManagerEth.address]) as EthErc20; + const instance = await upgrades.deployProxy(factory, [await tokenManagerEth.getAddress()]) as unknown as EthErc20; return instance; } diff --git a/proxy/test/utils/deploy/schain/messageProxyForSchain.ts b/test/utils/deploy/schain/messageProxyForSchain.ts similarity index 57% rename from proxy/test/utils/deploy/schain/messageProxyForSchain.ts rename to test/utils/deploy/schain/messageProxyForSchain.ts index a64829039..6d5de6e16 100644 --- a/proxy/test/utils/deploy/schain/messageProxyForSchain.ts +++ b/test/utils/deploy/schain/messageProxyForSchain.ts @@ -1,13 +1,13 @@ import { ethers, upgrades } from "hardhat"; -import { MessageProxyForSchain } from "../../../../typechain"; +import { KeyStorage, MessageProxyForSchain } from "../../../../typechain"; const name = "MessageProxyForSchain"; -export async function deployMessageProxyForSchain(keyStorageAddress: string, schainName: string) { +export async function deployMessageProxyForSchain(keyStorageAddress: KeyStorage, schainName: string) { const factory = await ethers.getContractFactory(name); const instance = await upgrades.deployProxy( factory, - [keyStorageAddress, schainName] - ) as MessageProxyForSchain; + [await keyStorageAddress.getAddress(), schainName] + ) as unknown as MessageProxyForSchain; return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/schain/tokenManagerERC1155.ts b/test/utils/deploy/schain/tokenManagerERC1155.ts similarity index 64% rename from proxy/test/utils/deploy/schain/tokenManagerERC1155.ts rename to test/utils/deploy/schain/tokenManagerERC1155.ts index 49c7cb204..5580bfe0f 100644 --- a/proxy/test/utils/deploy/schain/tokenManagerERC1155.ts +++ b/test/utils/deploy/schain/tokenManagerERC1155.ts @@ -1,11 +1,11 @@ import { ethers, upgrades } from "hardhat"; -import { TokenManagerERC1155, TokenManagerLinker, CommunityLocker } from "../../../../typechain"; +import { TokenManagerERC1155, TokenManagerLinker, CommunityLocker, MessageProxyForSchain } from "../../../../typechain"; const name = "TokenManagerERC1155"; export async function deployTokenManagerERC1155( schainName: string, - messageProxyForSchain: string, + messageProxyForSchain: MessageProxyForSchain, tokenManagerLinker: TokenManagerLinker, communityLocker: CommunityLocker, newDepositBox: string @@ -15,11 +15,11 @@ export async function deployTokenManagerERC1155( factory, [ schainName, - messageProxyForSchain, - tokenManagerLinker.address, - communityLocker.address, + await messageProxyForSchain.getAddress(), + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), newDepositBox ] - ) as TokenManagerERC1155; + ) as unknown as TokenManagerERC1155; return instance; } diff --git a/proxy/test/utils/deploy/schain/tokenManagerERC20.ts b/test/utils/deploy/schain/tokenManagerERC20.ts similarity index 57% rename from proxy/test/utils/deploy/schain/tokenManagerERC20.ts rename to test/utils/deploy/schain/tokenManagerERC20.ts index 1849dd686..1f9dda8e8 100644 --- a/proxy/test/utils/deploy/schain/tokenManagerERC20.ts +++ b/test/utils/deploy/schain/tokenManagerERC20.ts @@ -1,11 +1,11 @@ import { ethers, upgrades } from "hardhat"; -import { TokenManagerERC20, TokenManagerLinker, CommunityLocker } from "../../../../typechain"; +import { TokenManagerERC20, TokenManagerLinker, CommunityLocker, MessageProxyForSchain } from "../../../../typechain"; const name = "TokenManagerERC20"; export async function deployTokenManagerERC20( schainName: string, - messageProxyForSchain: string, + messageProxyForSchain: MessageProxyForSchain, tokenManagerLinker: TokenManagerLinker, communityLocker: CommunityLocker, newDepositBox: string @@ -15,11 +15,11 @@ export async function deployTokenManagerERC20( factory, [ schainName, - messageProxyForSchain, - tokenManagerLinker.address, - communityLocker.address, + await messageProxyForSchain.getAddress(), + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), newDepositBox ] - ) as TokenManagerERC20; + ) as unknown as TokenManagerERC20; return instance; } diff --git a/proxy/test/utils/deploy/schain/tokenManagerERC721.ts b/test/utils/deploy/schain/tokenManagerERC721.ts similarity index 64% rename from proxy/test/utils/deploy/schain/tokenManagerERC721.ts rename to test/utils/deploy/schain/tokenManagerERC721.ts index f811d1658..198543e42 100644 --- a/proxy/test/utils/deploy/schain/tokenManagerERC721.ts +++ b/test/utils/deploy/schain/tokenManagerERC721.ts @@ -1,11 +1,11 @@ import { ethers, upgrades } from "hardhat"; -import { TokenManagerERC721, TokenManagerLinker, CommunityLocker } from "../../../../typechain"; +import { TokenManagerERC721, TokenManagerLinker, CommunityLocker, MessageProxyForSchain } from "../../../../typechain"; const name = "TokenManagerERC721"; export async function deployTokenManagerERC721( schainName: string, - messageProxyForSchain: string, + messageProxyForSchain: MessageProxyForSchain, tokenManagerLinker: TokenManagerLinker, communityLocker: CommunityLocker, newDepositBox: string @@ -15,11 +15,11 @@ export async function deployTokenManagerERC721( factory, [ schainName, - messageProxyForSchain, - tokenManagerLinker.address, - communityLocker.address, + await messageProxyForSchain.getAddress(), + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), newDepositBox ] - ) as TokenManagerERC721; + ) as unknown as TokenManagerERC721; return instance; } diff --git a/proxy/test/utils/deploy/schain/tokenManagerERC721WithMetadata.ts b/test/utils/deploy/schain/tokenManagerERC721WithMetadata.ts similarity index 63% rename from proxy/test/utils/deploy/schain/tokenManagerERC721WithMetadata.ts rename to test/utils/deploy/schain/tokenManagerERC721WithMetadata.ts index d8c7ce15e..5a6108502 100644 --- a/proxy/test/utils/deploy/schain/tokenManagerERC721WithMetadata.ts +++ b/test/utils/deploy/schain/tokenManagerERC721WithMetadata.ts @@ -1,11 +1,11 @@ import { ethers, upgrades } from "hardhat"; -import { TokenManagerERC721WithMetadata, TokenManagerLinker, CommunityLocker } from "../../../../typechain"; +import { TokenManagerERC721WithMetadata, TokenManagerLinker, CommunityLocker, MessageProxyForSchain } from "../../../../typechain"; const name = "TokenManagerERC721WithMetadata"; export async function deployTokenManagerERC721WithMetadata( schainName: string, - messageProxyForSchain: string, + messageProxyForSchain: MessageProxyForSchain, tokenManagerLinker: TokenManagerLinker, communityLocker: CommunityLocker, newDepositBox: string @@ -15,11 +15,11 @@ export async function deployTokenManagerERC721WithMetadata( factory, [ schainName, - messageProxyForSchain, - tokenManagerLinker.address, - communityLocker.address, + await messageProxyForSchain.getAddress(), + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), newDepositBox ] - ) as TokenManagerERC721WithMetadata; + ) as unknown as TokenManagerERC721WithMetadata; return instance; } diff --git a/proxy/test/utils/deploy/schain/tokenManagerEth.ts b/test/utils/deploy/schain/tokenManagerEth.ts similarity index 59% rename from proxy/test/utils/deploy/schain/tokenManagerEth.ts rename to test/utils/deploy/schain/tokenManagerEth.ts index 0903ac4a0..2af3a232a 100644 --- a/proxy/test/utils/deploy/schain/tokenManagerEth.ts +++ b/test/utils/deploy/schain/tokenManagerEth.ts @@ -1,11 +1,11 @@ import { ethers, upgrades } from "hardhat"; -import { TokenManagerEth, TokenManagerLinker, CommunityLocker } from "../../../../typechain"; +import { TokenManagerEth, TokenManagerLinker, CommunityLocker, MessageProxyForSchain } from "../../../../typechain"; const name = "TokenManagerEth"; export async function deployTokenManagerEth( schainName: string, - messageProxyForSchain: string, + messageProxyForSchain: MessageProxyForSchain, tokenManagerLinker: TokenManagerLinker, communityLocker: CommunityLocker, newDepositBox: string, @@ -16,12 +16,12 @@ export async function deployTokenManagerEth( factory, [ schainName, - messageProxyForSchain, - tokenManagerLinker.address, - communityLocker.address, + await messageProxyForSchain.getAddress(), + await tokenManagerLinker.getAddress(), + await communityLocker.getAddress(), newDepositBox, ethErc20Address ] - ) as TokenManagerEth; + ) as unknown as TokenManagerEth; return instance; } diff --git a/proxy/test/utils/deploy/schain/tokenManagerLinker.ts b/test/utils/deploy/schain/tokenManagerLinker.ts similarity index 70% rename from proxy/test/utils/deploy/schain/tokenManagerLinker.ts rename to test/utils/deploy/schain/tokenManagerLinker.ts index 4d181c11c..11c8ff9bc 100644 --- a/proxy/test/utils/deploy/schain/tokenManagerLinker.ts +++ b/test/utils/deploy/schain/tokenManagerLinker.ts @@ -6,6 +6,12 @@ export async function deployTokenManagerLinker( newLinkerAddress: string ) { const factory = await ethers.getContractFactory("TokenManagerLinker"); - const instance = await upgrades.deployProxy(factory, [messageProxyForSchain.address, newLinkerAddress]) as TokenManagerLinker; + const instance = await upgrades.deployProxy( + factory, + [ + await messageProxyForSchain.getAddress(), + newLinkerAddress + ] + ) as unknown as TokenManagerLinker; return instance; } diff --git a/proxy/test/utils/deploy/test/communityPoolTester.ts b/test/utils/deploy/test/communityPoolTester.ts similarity index 64% rename from proxy/test/utils/deploy/test/communityPoolTester.ts rename to test/utils/deploy/test/communityPoolTester.ts index 1fcaf8a00..3803f4fe6 100644 --- a/proxy/test/utils/deploy/test/communityPoolTester.ts +++ b/test/utils/deploy/test/communityPoolTester.ts @@ -10,10 +10,14 @@ export async function deployCommunityPoolTester( const factory = await ethers.getContractFactory("CommunityPool"); const instance = await upgrades.deployProxy( factory, - [contractManager.address, linker.address, messageProxy.address], + [ + await contractManager.getAddress(), + await linker.getAddress(), + await messageProxy.getAddress() + ], {"initializer": "initialize(address,address,address)"} - ) as CommunityPool; - await linker.registerMainnetContract(instance.address); - await messageProxy.setCommunityPool(instance.address); + ) as unknown as CommunityPool; + await linker.registerMainnetContract(instance); + await messageProxy.setCommunityPool(instance); return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/test/fallbackEthTester.ts b/test/utils/deploy/test/fallbackEthTester.ts similarity index 67% rename from proxy/test/utils/deploy/test/fallbackEthTester.ts rename to test/utils/deploy/test/fallbackEthTester.ts index d8e922a07..8a9208cc5 100644 --- a/proxy/test/utils/deploy/test/fallbackEthTester.ts +++ b/test/utils/deploy/test/fallbackEthTester.ts @@ -8,6 +8,10 @@ export async function deployFallbackEthTester( schainName: string ) { const factory = await ethers.getContractFactory("FallbackEthTester"); - const instance = await factory.deploy(depositBoxEth.address, communityPool.address, schainName) as FallbackEthTester; + const instance = await factory.deploy( + await depositBoxEth.getAddress(), + await communityPool.getAddress(), + schainName + ) as FallbackEthTester; return instance; -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/test/keyStorageMock.ts b/test/utils/deploy/test/keyStorageMock.ts similarity index 100% rename from proxy/test/utils/deploy/test/keyStorageMock.ts rename to test/utils/deploy/test/keyStorageMock.ts diff --git a/proxy/test/utils/deploy/test/messageProxyCaller.ts b/test/utils/deploy/test/messageProxyCaller.ts similarity index 100% rename from proxy/test/utils/deploy/test/messageProxyCaller.ts rename to test/utils/deploy/test/messageProxyCaller.ts diff --git a/proxy/test/utils/deploy/test/messageProxyForMainnetTester.ts b/test/utils/deploy/test/messageProxyForMainnetTester.ts similarity index 86% rename from proxy/test/utils/deploy/test/messageProxyForMainnetTester.ts rename to test/utils/deploy/test/messageProxyForMainnetTester.ts index 23b864798..2a2ac35eb 100644 --- a/proxy/test/utils/deploy/test/messageProxyForMainnetTester.ts +++ b/test/utils/deploy/test/messageProxyForMainnetTester.ts @@ -12,9 +12,9 @@ export async function deployMessageProxyForMainnetTester( } else { const instance = await upgrades.deployProxy( factory, - [contractManager.address] - ) as MessageProxyForMainnetTester; - await contractManager.setContractsAddress(name, instance.address); + [await contractManager.getAddress()] + ) as unknown as MessageProxyForMainnetTester; + await contractManager.setContractsAddress(name, instance); return instance; } -} \ No newline at end of file +} diff --git a/proxy/test/utils/deploy/test/messageProxyForSchainTester.ts b/test/utils/deploy/test/messageProxyForSchainTester.ts similarity index 72% rename from proxy/test/utils/deploy/test/messageProxyForSchainTester.ts rename to test/utils/deploy/test/messageProxyForSchainTester.ts index 18d88f20c..742a6d55d 100644 --- a/proxy/test/utils/deploy/test/messageProxyForSchainTester.ts +++ b/test/utils/deploy/test/messageProxyForSchainTester.ts @@ -1,9 +1,9 @@ import { ethers } from "hardhat"; -import { MessageProxyForSchainTester } from "../../../../typechain"; +import { KeyStorage, MessageProxyForSchainTester } from "../../../../typechain"; const name = "MessageProxyForSchainTester"; -export async function deployMessageProxyForSchainTester(keyStorageAddress: string, schainName: string) { +export async function deployMessageProxyForSchainTester(keyStorageAddress: KeyStorage, schainName: string) { const factory = await ethers.getContractFactory(name); const instance = await factory.deploy(keyStorageAddress, schainName) as MessageProxyForSchainTester; return instance; diff --git a/proxy/test/utils/helper.ts b/test/utils/helper.ts similarity index 77% rename from proxy/test/utils/helper.ts rename to test/utils/helper.ts index ed5b8f4dc..07b00360a 100644 --- a/proxy/test/utils/helper.ts +++ b/test/utils/helper.ts @@ -1,4 +1,4 @@ -import { Wallet, BytesLike } from "ethers"; +import { Wallet, BytesLike, HDNodeWallet } from "ethers"; import { ethers } from "hardhat"; import { ec } from "elliptic"; @@ -46,15 +46,11 @@ export function stringFromHex(value: string) { return str; } -export function stringKeccak256(value: string): string { - return ethers.utils.solidityKeccak256(["string"], [value]); -} - -export function getPublicKey(wallet: Wallet): [BytesLike, BytesLike] { +export function getPublicKey(wallet: HDNodeWallet | Wallet): [BytesLike, BytesLike] { const publicKey = secp256k1EC.keyFromPrivate(wallet.privateKey.slice(2)).getPublic(); - return [ethers.utils.hexlify(publicKey.getX().toBuffer()), ethers.utils.hexlify(publicKey.getY().toBuffer())] + return [ethers.hexlify(publicKey.getX().toBuffer()), ethers.hexlify(publicKey.getY().toBuffer())] } export async function getBalance(address: string): Promise { - return parseFloat(ethers.utils.formatEther(await ethers.provider.getBalance(address))); + return parseFloat(ethers.formatEther(await ethers.provider.getBalance(address))); } diff --git a/proxy/test/utils/skale-manager-utils/contractManager.ts b/test/utils/skale-manager-utils/contractManager.ts similarity index 90% rename from proxy/test/utils/skale-manager-utils/contractManager.ts rename to test/utils/skale-manager-utils/contractManager.ts index d8fa85173..6c21724a2 100644 --- a/proxy/test/utils/skale-manager-utils/contractManager.ts +++ b/test/utils/skale-manager-utils/contractManager.ts @@ -17,30 +17,30 @@ export async function deployContractManager(contractManagerAddress: string) { } if (await instance.getContract("KeyStorage") === "0x0000000000000000000000000000000000000000") { const keyStorageInstance = await (await ethers.getContractFactory("KeyStorageMock")).deploy() as KeyStorageMock; - await instance.setContractsAddress("KeyStorage", keyStorageInstance.address); + await instance.setContractsAddress("KeyStorage", keyStorageInstance); } if (await instance.getContract(nameNodes) === "0x0000000000000000000000000000000000000000") { const nodesInstance = await (await ethers.getContractFactory(nameNodes)).deploy() as Nodes; - await instance.setContractsAddress(nameNodes, nodesInstance.address); + await instance.setContractsAddress(nameNodes, nodesInstance); } if (await instance.getContract(nameSchains) === "0x0000000000000000000000000000000000000000") { const schainsInstance = await (await ethers.getContractFactory(nameSchains)).deploy() as Schains; - await schainsInstance.addContractManager(instance.address); - await instance.setContractsAddress(nameSchains, schainsInstance.address); + await schainsInstance.addContractManager(instance); + await instance.setContractsAddress(nameSchains, schainsInstance); } if (await instance.getContract(nameSchainsInternal) === "0x0000000000000000000000000000000000000000") { const schainsInternalInstance = await (await ethers.getContractFactory(nameSchainsInternal)).deploy() as SchainsInternal; - await schainsInternalInstance.addContractManager(instance.address); - await instance.setContractsAddress(nameSchainsInternal, schainsInternalInstance.address); + await schainsInternalInstance.addContractManager(instance); + await instance.setContractsAddress(nameSchainsInternal, schainsInternalInstance); } if (await instance.getContract(nameSkaleVerifier) === "0x0000000000000000000000000000000000000000") { const skaleVerifierInstance = await (await ethers.getContractFactory(nameSkaleVerifier)).deploy() as SkaleVerifierMock; - await instance.setContractsAddress("SkaleVerifier", skaleVerifierInstance.address); + await instance.setContractsAddress("SkaleVerifier", skaleVerifierInstance); } if (await instance.getContract(nameWallets) === "0x0000000000000000000000000000000000000000") { const walletsInstance = await (await ethers.getContractFactory(nameWallets)).deploy() as Wallets; - await walletsInstance.addContractManager(instance.address); - await instance.setContractsAddress(nameWallets, walletsInstance.address); + await walletsInstance.addContractManager(instance); + await instance.setContractsAddress(nameWallets, walletsInstance); } return instance; } diff --git a/proxy/test/utils/skale-manager-utils/keyStorage.ts b/test/utils/skale-manager-utils/keyStorage.ts similarity index 86% rename from proxy/test/utils/skale-manager-utils/keyStorage.ts rename to test/utils/skale-manager-utils/keyStorage.ts index 631fecfe1..b5bc9ff2e 100644 --- a/proxy/test/utils/skale-manager-utils/keyStorage.ts +++ b/test/utils/skale-manager-utils/keyStorage.ts @@ -1,6 +1,5 @@ import { ethers } from "hardhat"; import { ContractManager, KeyStorageMock } from "../../../typechain"; -import { stringKeccak256 } from "../helper"; const BLSPublicKey = { x: { @@ -17,14 +16,15 @@ export async function setCommonPublicKey( contractManager: ContractManager, schainName: string ) { + const schainHash = ethers.id(schainName); const factory = await ethers.getContractFactory("KeyStorageMock"); let keyStorageInstance: KeyStorageMock; if (await contractManager.getContract("KeyStorage") === "0x0000000000000000000000000000000000000000") { console.log("Schains Internal deployment"); keyStorageInstance = await factory.deploy() as KeyStorageMock; - await contractManager.setContractsAddress("KeyStorage", keyStorageInstance.address); + await contractManager.setContractsAddress("KeyStorage", keyStorageInstance); } else { keyStorageInstance = factory.attach(await contractManager.getContract("KeyStorage")) as KeyStorageMock; } - await keyStorageInstance.setBlsCommonPublicKeyForSchain(stringKeccak256(schainName), BLSPublicKey); + await keyStorageInstance.setBlsCommonPublicKeyForSchain(schainHash, BLSPublicKey); } diff --git a/proxy/test/utils/skale-manager-utils/nodes.ts b/test/utils/skale-manager-utils/nodes.ts similarity index 100% rename from proxy/test/utils/skale-manager-utils/nodes.ts rename to test/utils/skale-manager-utils/nodes.ts diff --git a/proxy/test/utils/skale-manager-utils/schainsInternal.ts b/test/utils/skale-manager-utils/schainsInternal.ts similarity index 80% rename from proxy/test/utils/skale-manager-utils/schainsInternal.ts rename to test/utils/skale-manager-utils/schainsInternal.ts index 4cb5f20ff..b0e8753a0 100644 --- a/proxy/test/utils/skale-manager-utils/schainsInternal.ts +++ b/test/utils/skale-manager-utils/schainsInternal.ts @@ -1,6 +1,5 @@ import { ethers } from "hardhat"; import { ContractManager, SchainsInternal } from "../../../typechain"; -import { stringKeccak256 } from "../helper"; const nameSchainsInternal = "SchainsInternal"; @@ -25,21 +24,22 @@ export async function addNodesToSchain( const schainsInternalFactory = await ethers.getContractFactory(nameSchainsInternal); const schainsInternalAddres = await contractManager.getContract(nameSchainsInternal); const schainsInternal = schainsInternalFactory.attach(schainsInternalAddres) as SchainsInternal; - await schainsInternal.addNodesToSchainsGroups(ethers.utils.id(schainName), nodes); + await schainsInternal.addNodesToSchainsGroups(ethers.id(schainName), nodes); } export async function isSchainActive( contractManager: ContractManager, schainName: string ) { + const schainHash = ethers.id(schainName); const factory = await ethers.getContractFactory(nameSchainsInternal); let schainsInternalInstance: SchainsInternal; if (await contractManager.getContract(nameSchainsInternal) === "0x0000000000000000000000000000000000000000") { console.log("Schains Internal deployment"); schainsInternalInstance = await factory.deploy() as SchainsInternal; - await contractManager.setContractsAddress(nameSchainsInternal, schainsInternalInstance.address); + await contractManager.setContractsAddress(nameSchainsInternal, schainsInternalInstance); } else { - schainsInternalInstance = await factory.attach(await contractManager.getContract(nameSchainsInternal)) as SchainsInternal; + schainsInternalInstance = factory.attach(await contractManager.getContract(nameSchainsInternal)) as SchainsInternal; } - return await schainsInternalInstance.isSchainActive(stringKeccak256(schainName)); + return await schainsInternalInstance.isSchainActive(schainHash); } diff --git a/proxy/test/utils/skale-manager-utils/wallets.ts b/test/utils/skale-manager-utils/wallets.ts similarity index 90% rename from proxy/test/utils/skale-manager-utils/wallets.ts rename to test/utils/skale-manager-utils/wallets.ts index 248f95dbb..3697b60b2 100644 --- a/proxy/test/utils/skale-manager-utils/wallets.ts +++ b/test/utils/skale-manager-utils/wallets.ts @@ -1,7 +1,6 @@ import { initializeSchain, isSchainActive } from "./schainsInternal"; import { ethers } from "hardhat"; import { ContractManager, Wallets } from "../../../typechain"; -import { stringKeccak256 } from "../helper"; const nameWallets = "Wallets"; @@ -16,8 +15,8 @@ export async function rechargeSchainWallet( if (await contractManager.getContract(nameWallets) === "0x0000000000000000000000000000000000000000") { console.log("Schains Internal deployment"); walletsInstance = await walletsFactory.deploy() as Wallets; - await walletsInstance.addContractManager(contractManager.address); - await contractManager.setContractsAddress(nameWallets, walletsInstance.address); + await walletsInstance.addContractManager(contractManager); + await contractManager.setContractsAddress(nameWallets, walletsInstance); } else { walletsInstance = await walletsFactory.attach(await contractManager.getContract(nameWallets)) as Wallets; } @@ -26,6 +25,6 @@ export async function rechargeSchainWallet( if ( !schainActive ) await initializeSchain(contractManager, schainName, owner, 1, 1); - const schainHash = stringKeccak256(schainName); + const schainHash = ethers.id(schainName); await walletsInstance.rechargeSchainWallet(schainHash, {value: amountEth /*"1000000000000000000"*/}); } diff --git a/proxy/test/utils/time.ts b/test/utils/time.ts similarity index 77% rename from proxy/test/utils/time.ts rename to test/utils/time.ts index 12bff326a..cfb91b655 100644 --- a/proxy/test/utils/time.ts +++ b/test/utils/time.ts @@ -31,5 +31,12 @@ export async function skipTime(seconds: number) { } export async function currentTime() { - return (await ethers.provider.getBlock("latest")).timestamp; + try { + const block = await ethers.provider.getBlock('latest'); + if (!block) throw new Error('Failed to retrieve the latest block.'); + return block.timestamp; + } catch (error) { + console.error('Error fetching the latest block:', error); + throw error; + } } diff --git a/proxy/tsconfig.json b/tsconfig.json similarity index 75% rename from proxy/tsconfig.json rename to tsconfig.json index d0d126c84..8463ccd9b 100644 --- a/proxy/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2018", + "target": "es2020", "module": "commonjs", "strict": true, "moduleResolution": "node", @@ -10,7 +10,7 @@ "emitDecoratorMetadata": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "lib": ["es2018", "esnext.asynciterable"], + "lib": ["es2020", "esnext.asynciterable"], "sourceMap": true, "typeRoots": ["./node_modules/@types", "./typechain"], "types": ["node"], @@ -18,5 +18,10 @@ "skipLibCheck": true }, "include": ["**/*.ts"], - "exclude": ["node_modules", "example", "build", "test-tokens"] + "exclude": [ + "node_modules", + "example", + "build", + "test-tokens" + ] } diff --git a/yarn.lock b/yarn.lock index 747169a4d..e26a347b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,43 +2,1695 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@adraffy/ens-normalize@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" + integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== + +"@aws-crypto/sha256-js@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" + integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== dependencies: - "@babel/highlight" "^7.22.5" + "@aws-crypto/util" "^1.2.2" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@aws-crypto/util@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" + integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/types@^3.1.0": + version "3.664.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.664.0.tgz#e6de1c0a2cdfe4f1e43271223dc0b55e613ced58" + integrity sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw== + dependencies: + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== +"@babel/code-frame@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.9.tgz#895b6c7e04a7271a0cbfd575d2e8131751914cc7" + integrity sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ== + dependencies: + "@babel/highlight" "^7.25.9" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/highlight@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6" + integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.25.9" + chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@cspell/cspell-bundled-dicts@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.15.4.tgz#dcba969630b8ce132e649721027a2e67ff483174" + integrity sha512-t5b2JwGeUmzmjl319mCuaeKGxTvmzLLRmrpdHr+ZZGRO4nf7L48Lbe9A6uwNUvsZe0cXohiNXsrrsuzRVXswVA== + dependencies: + "@cspell/dict-ada" "^4.0.5" + "@cspell/dict-aws" "^4.0.7" + "@cspell/dict-bash" "^4.1.8" + "@cspell/dict-companies" "^3.1.7" + "@cspell/dict-cpp" "^5.1.22" + "@cspell/dict-cryptocurrencies" "^5.0.3" + "@cspell/dict-csharp" "^4.0.5" + "@cspell/dict-css" "^4.0.16" + "@cspell/dict-dart" "^2.2.4" + "@cspell/dict-django" "^4.1.3" + "@cspell/dict-docker" "^1.1.11" + "@cspell/dict-dotnet" "^5.0.8" + "@cspell/dict-elixir" "^4.0.6" + "@cspell/dict-en-common-misspellings" "^2.0.7" + "@cspell/dict-en-gb" "1.1.33" + "@cspell/dict-en_us" "^4.3.26" + "@cspell/dict-filetypes" "^3.0.7" + "@cspell/dict-flutter" "^1.0.3" + "@cspell/dict-fonts" "^4.0.3" + "@cspell/dict-fsharp" "^1.0.4" + "@cspell/dict-fullstack" "^3.2.3" + "@cspell/dict-gaming-terms" "^1.0.8" + "@cspell/dict-git" "^3.0.3" + "@cspell/dict-golang" "^6.0.16" + "@cspell/dict-google" "^1.0.4" + "@cspell/dict-haskell" "^4.0.4" + "@cspell/dict-html" "^4.0.9" + "@cspell/dict-html-symbol-entities" "^4.0.3" + "@cspell/dict-java" "^5.0.10" + "@cspell/dict-julia" "^1.0.4" + "@cspell/dict-k8s" "^1.0.9" + "@cspell/dict-latex" "^4.0.3" + "@cspell/dict-lorem-ipsum" "^4.0.3" + "@cspell/dict-lua" "^4.0.6" + "@cspell/dict-makefile" "^1.0.3" + "@cspell/dict-monkeyc" "^1.0.9" + "@cspell/dict-node" "^5.0.4" + "@cspell/dict-npm" "^5.1.8" + "@cspell/dict-php" "^4.0.13" + "@cspell/dict-powershell" "^5.0.13" + "@cspell/dict-public-licenses" "^2.0.11" + "@cspell/dict-python" "^4.2.12" + "@cspell/dict-r" "^2.0.4" + "@cspell/dict-ruby" "^5.0.7" + "@cspell/dict-rust" "^4.0.9" + "@cspell/dict-scala" "^5.0.6" + "@cspell/dict-software-terms" "^4.1.11" + "@cspell/dict-sql" "^2.1.8" + "@cspell/dict-svelte" "^1.0.5" + "@cspell/dict-swift" "^2.0.4" + "@cspell/dict-terraform" "^1.0.5" + "@cspell/dict-typescript" "^3.1.10" + "@cspell/dict-vue" "^3.0.3" + +"@cspell/cspell-json-reporter@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.15.4.tgz#f8902234bd000040d40ae3574860d221c991aff9" + integrity sha512-solraYhZG4l++NeVCOtpc8DMvwHc46TmJt8DQbgvKtk6wOjTEcFrwKfA6Ei9YKbvyebJlpWMenO3goOll0loYg== + dependencies: + "@cspell/cspell-types" "8.15.4" + +"@cspell/cspell-pipe@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-8.15.4.tgz#c3c958d3b900ccdcc4f2a8610fe464882e3f1759" + integrity sha512-WfCmZVFC6mX6vYlf02hWwelcSBTbDQgc5YqY+1miuMk+OHSUAHSACjZId6/a4IAID94xScvFfj7jgrdejUVvIQ== + +"@cspell/cspell-resolver@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-8.15.4.tgz#83ade61a1e11b88be756a805138ec8b31191e0d0" + integrity sha512-Zr428o+uUTqywrdKyjluJVnDPVAJEqZ1chQLKIrHggUah1cgs5aQ7rZ+0Rv5euYMlC2idZnP7IL6TDaIib80oA== + dependencies: + global-directory "^4.0.1" + +"@cspell/cspell-service-bus@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-8.15.4.tgz#76a0c380e0102a4521ce96a64ade580331ca8404" + integrity sha512-pXYofnV/V9Y3LZdfFGbmhdxPX/ABjiD3wFjGHt5YhIU9hjVVuvjFlgY7pH2AvRjs4F8xKXv1ReWl44BJOL9gLA== + +"@cspell/cspell-types@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-8.15.4.tgz#307db2055ff669d99487c1772edb393243bb5098" + integrity sha512-1hDtgYDQVW11zgtrr12EmGW45Deoi7IjZOhzPFLb+3WkhZ46ggWdbrRalWwBolQPDDo6+B2Q6WXz5hdND+Tpwg== + +"@cspell/dict-ada@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.0.5.tgz#c14aae2faaecbad2d99f0d701e4700a48c68ef60" + integrity sha512-6/RtZ/a+lhFVmrx/B7bfP7rzC4yjEYe8o74EybXcvu4Oue6J4Ey2WSYj96iuodloj1LWrkNCQyX5h4Pmcj0Iag== + +"@cspell/dict-aws@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.7.tgz#f96f3b70cd52a25b895eb08e297de5a5cc3fc5b6" + integrity sha512-PoaPpa2NXtSkhGIMIKhsJUXB6UbtTt6Ao3x9JdU9kn7fRZkwD4RjHDGqulucIOz7KeEX/dNRafap6oK9xHe4RA== + +"@cspell/dict-bash@^4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.1.8.tgz#26dc898e06eddea069cf1ad475ee0e867c89e632" + integrity sha512-I2CM2pTNthQwW069lKcrVxchJGMVQBzru2ygsHCwgidXRnJL/NTjAPOFTxN58Jc1bf7THWghfEDyKX/oyfc0yg== + +"@cspell/dict-companies@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.1.7.tgz#c9abd6f5293f103062f54dde01f2bee939189f79" + integrity sha512-ncVs/efuAkP1/tLDhWbXukBjgZ5xOUfe03neHMWsE8zvXXc5+Lw6TX5jaJXZLOoES/f4j4AhRE20jsPCF5pm+A== + +"@cspell/dict-cpp@^5.1.22": + version "5.1.22" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-5.1.22.tgz#ee14d2b193c0a25dc58c609979f1500cd2f6e870" + integrity sha512-g1/8P5/Q+xnIc8Js4UtBg3XOhcFrFlFbG3UWVtyEx49YTf0r9eyDtDt1qMMDBZT91pyCwLcAEbwS+4i5PIfNZw== + +"@cspell/dict-cryptocurrencies@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.3.tgz#502f9fffcb2835a3379668ddebdc487678ce6207" + integrity sha512-bl5q+Mk+T3xOZ12+FG37dB30GDxStza49Rmoax95n37MTLksk9wBo1ICOlPJ6PnDUSyeuv4SIVKgRKMKkJJglA== + +"@cspell/dict-csharp@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.5.tgz#c677c50be09ca5bb3a2cc0be15f3cd05141fd2f7" + integrity sha512-c/sFnNgtRwRJxtC3JHKkyOm+U3/sUrltFeNwml9VsxKBHVmvlg4tk4ar58PdpW9/zTlGUkWi2i85//DN1EsUCA== + +"@cspell/dict-css@^4.0.16": + version "4.0.16" + resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.16.tgz#b7b87b5ea0f1157b023205bdb00070a7d231e367" + integrity sha512-70qu7L9z/JR6QLyJPk38fNTKitlIHnfunx0wjpWQUQ8/jGADIhMCrz6hInBjqPNdtGpYm8d1dNFyF8taEkOgrQ== + +"@cspell/dict-dart@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.2.4.tgz#8b877161ccdc65cead912b742b71aa55099c1706" + integrity sha512-of/cVuUIZZK/+iqefGln8G3bVpfyN6ZtH+LyLkHMoR5tEj+2vtilGNk9ngwyR8L4lEqbKuzSkOxgfVjsXf5PsQ== + +"@cspell/dict-data-science@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-2.0.5.tgz#816e9b394c2a423d14cdc9a5de5d6fc6141d3900" + integrity sha512-nNSILXmhSJox9/QoXICPQgm8q5PbiSQP4afpbkBqPi/u/b3K9MbNH5HvOOa6230gxcGdbZ9Argl2hY/U8siBlg== + +"@cspell/dict-django@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.3.tgz#a02a4a9ef8c9f47344f2d4a0c3964bcb62069ef5" + integrity sha512-yBspeL3roJlO0a1vKKNaWABURuHdHZ9b1L8d3AukX0AsBy9snSggc8xCavPmSzNfeMDXbH+1lgQiYBd3IW03fg== + +"@cspell/dict-docker@^1.1.11": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.11.tgz#6fce86eb6d86d73f77e18d3e7b9747bad3ca98de" + integrity sha512-s0Yhb16/R+UT1y727ekbR/itWQF3Qz275DR1ahOa66wYtPjHUXmhM3B/LT3aPaX+hD6AWmK23v57SuyfYHUjsw== + +"@cspell/dict-dotnet@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.8.tgz#8a110ca302946025e0273a9940079483ec33a88a" + integrity sha512-MD8CmMgMEdJAIPl2Py3iqrx3B708MbCIXAuOeZ0Mzzb8YmLmiisY7QEYSZPg08D7xuwARycP0Ki+bb0GAkFSqg== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@cspell/dict-elixir@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.6.tgz#3d8965c558d8afd190356e9a900b02c546741feb" + integrity sha512-TfqSTxMHZ2jhiqnXlVKM0bUADtCvwKQv2XZL/DI0rx3doG8mEMS8SGPOmiyyGkHpR/pGOq18AFH3BEm4lViHIw== + +"@cspell/dict-en-common-misspellings@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.0.7.tgz#62861cc9e813c947ebd71c7a50fc720767b4b543" + integrity sha512-qNFo3G4wyabcwnM+hDrMYKN9vNVg/k9QkhqSlSst6pULjdvPyPs1mqz1689xO/v9t8e6sR4IKc3CgUXDMTYOpA== + +"@cspell/dict-en-gb@1.1.33": + version "1.1.33" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz#7f1fd90fc364a5cb77111b5438fc9fcf9cc6da0e" + integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== + +"@cspell/dict-en_us@^4.3.26": + version "4.3.26" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.3.26.tgz#f0d2c9492715e85b60a78f62f03918525639aa48" + integrity sha512-hDbHYJsi3UgU1J++B0WLiYhWQdsmve3CH53FIaMRAdhrWOHcuw7h1dYkQXHFEP5lOjaq53KUHp/oh5su6VkIZg== + +"@cspell/dict-filetypes@^3.0.7": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.8.tgz#016d523ca2c34dea972ea0ca931255868348d81a" + integrity sha512-D3N8sm/iptzfVwsib/jvpX+K/++rM8SRpLDFUaM4jxm8EyGmSIYRbKZvdIv5BkAWmMlTWoRqlLn7Yb1b11jKJg== + +"@cspell/dict-flutter@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-flutter/-/dict-flutter-1.0.3.tgz#23e552209ab2238733d30ca3f2a141359756af51" + integrity sha512-52C9aUEU22ptpgYh6gQyIdA4MP6NPwzbEqndfgPh3Sra191/kgs7CVqXiO1qbtZa9gnYHUoVApkoxRE7mrXHfg== + +"@cspell/dict-fonts@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.3.tgz#abf578c10a2e7b2bd8f4374002677625288560d9" + integrity sha512-sPd17kV5qgYXLteuHFPn5mbp/oCHKgitNfsZLFC3W2fWEgZlhg4hK+UGig3KzrYhhvQ8wBnmZrAQm0TFKCKzsA== + +"@cspell/dict-fsharp@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.0.4.tgz#19a7263a61ca89cd3ec9c17537e424907b81ef38" + integrity sha512-G5wk0o1qyHUNi9nVgdE1h5wl5ylq7pcBjX8vhjHcO4XBq20D5eMoXjwqMo/+szKAqzJ+WV3BgAL50akLKrT9Rw== + +"@cspell/dict-fullstack@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.2.3.tgz#f6fff74eff00c6759cba510168acada0619004cc" + integrity sha512-62PbndIyQPH11mAv0PyiyT0vbwD0AXEocPpHlCHzfb5v9SspzCCbzQ/LIBiFmyRa+q5LMW35CnSVu6OXdT+LKg== + +"@cspell/dict-gaming-terms@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.8.tgz#fb8a737f61e7cf560b4de7b2aaeae952f2550398" + integrity sha512-7OL0zTl93WFWhhtpXFrtm9uZXItC3ncAs8d0iQDMMFVNU1rBr6raBNxJskxE5wx2Ant12fgI66ZGVagXfN+yfA== + +"@cspell/dict-git@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.0.3.tgz#3a3805ab9902bffc9255ec48f648145b957eb30b" + integrity sha512-LSxB+psZ0qoj83GkyjeEH/ZViyVsGEF/A6BAo8Nqc0w0HjD2qX/QR4sfA6JHUgQ3Yi/ccxdK7xNIo67L2ScW5A== + +"@cspell/dict-golang@^6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.16.tgz#b247a801404f9a65e7c8674893bdb5aad42353a2" + integrity sha512-hZOBlgcguv2Hdc93n2zjdAQm1j3grsN9T9WhPnQ1wh2vUDoCLEujg+6gWhjcLb8ECOcwZTWgNyQLWeOxEsAj/w== + +"@cspell/dict-google@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-google/-/dict-google-1.0.4.tgz#e15a7ea2dee73800231a81840a59d3b50d49346f" + integrity sha512-JThUT9eiguCja1mHHLwYESgxkhk17Gv7P3b1S7ZJzXw86QyVHPrbpVoMpozHk0C9o+Ym764B7gZGKmw9uMGduQ== + +"@cspell/dict-haskell@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.4.tgz#37e9cb9a7f5be337a697bcffd0a0d25e80aab50d" + integrity sha512-EwQsedEEnND/vY6tqRfg9y7tsnZdxNqOxLXSXTsFA6JRhUlr8Qs88iUUAfsUzWc4nNmmzQH2UbtT25ooG9x4nA== + +"@cspell/dict-html-symbol-entities@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.3.tgz#bf2887020ca4774413d8b1f27c9b6824ba89e9ef" + integrity sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A== + +"@cspell/dict-html@^4.0.9": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.10.tgz#7b536b2adca4b58ed92752c9d3c7ffc724dd5991" + integrity sha512-I9uRAcdtHbh0wEtYZlgF0TTcgH0xaw1B54G2CW+tx4vHUwlde/+JBOfIzird4+WcMv4smZOfw+qHf7puFUbI5g== -acorn-jsx@^5.2.0: +"@cspell/dict-java@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.10.tgz#e6383ca645046b9f05a04a2c2e858fcc80c6fc63" + integrity sha512-pVNcOnmoGiNL8GSVq4WbX/Vs2FGS0Nej+1aEeGuUY9CU14X8yAVCG+oih5ZoLt1jaR8YfR8byUF8wdp4qG4XIw== + +"@cspell/dict-julia@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.0.4.tgz#e478c20d742cd6857b6de41dc61a92036dafb4bc" + integrity sha512-bFVgNX35MD3kZRbXbJVzdnN7OuEqmQXGpdOi9jzB40TSgBTlJWA4nxeAKV4CPCZxNRUGnLH0p05T/AD7Aom9/w== + +"@cspell/dict-k8s@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.9.tgz#e9392a002797c67ffc3e96893156cc15af3774d1" + integrity sha512-Q7GELSQIzo+BERl2ya/nBEnZeQC+zJP19SN1pI6gqDYraM51uYJacbbcWLYYO2Y+5joDjNt/sd/lJtLaQwoSlA== + +"@cspell/dict-latex@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-4.0.3.tgz#a1254c7d9c3a2d70cd6391a9f2f7694431b1b2cb" + integrity sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw== + +"@cspell/dict-lorem-ipsum@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.3.tgz#c5fc631d934f1daf8b10c88b795278701a2469ec" + integrity sha512-WFpDi/PDYHXft6p0eCXuYnn7mzMEQLVeqpO+wHSUd+kz5ADusZ4cpslAA4wUZJstF1/1kMCQCZM6HLZic9bT8A== + +"@cspell/dict-lua@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.6.tgz#7de412bfaead794445e26d566aec222e20ad69ba" + integrity sha512-Jwvh1jmAd9b+SP9e1GkS2ACbqKKRo9E1f9GdjF/ijmooZuHU0hPyqvnhZzUAxO1egbnNjxS/J2T6iUtjAUK2KQ== + +"@cspell/dict-makefile@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.3.tgz#08d3349bf7cbd8f5dacf8641f3d35092ca0b8b38" + integrity sha512-R3U0DSpvTs6qdqfyBATnePj9Q/pypkje0Nj26mQJ8TOBQutCRAJbr2ZFAeDjgRx5EAJU/+8txiyVF97fbVRViw== + +"@cspell/dict-monkeyc@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.9.tgz#58b5f6f15fc7c11ce0eeffd0742fba4b39fc0b8b" + integrity sha512-Jvf6g5xlB4+za3ThvenYKREXTEgzx5gMUSzrAxIiPleVG4hmRb/GBSoSjtkGaibN3XxGx5x809gSTYCA/IHCpA== + +"@cspell/dict-node@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-5.0.4.tgz#dfe1f159a1ffb1c4f389ec43b15f705123113658" + integrity sha512-Hz5hiuOvZTd7Cp1IBqUZ7/ChwJeQpD5BJuwCaDn4mPNq4iMcQ1iWBYMThvNVqCEDgKv63X52nT8RAWacss98qg== + +"@cspell/dict-npm@^5.1.8": + version "5.1.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.1.8.tgz#d179e555d351aecd4c7e5a87756f3b1192701ee8" + integrity sha512-AJELYXeB4fQdIoNfmuaQxB1Hli3cX6XPsQCjfBxlu0QYXhrjB/IrCLLQAjWIywDqJiWyGUFTz4DqaANm8C/r9Q== + +"@cspell/dict-php@^4.0.13": + version "4.0.13" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.13.tgz#86f1e6fb2174b2b0fa012baf86c448b2730f04f9" + integrity sha512-P6sREMZkhElzz/HhXAjahnICYIqB/HSGp1EhZh+Y6IhvC15AzgtDP8B8VYCIsQof6rPF1SQrFwunxOv8H1e2eg== + +"@cspell/dict-powershell@^5.0.13": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.13.tgz#f557aa04ee9bda4fe091308a0bcaea09ed12fa76" + integrity sha512-0qdj0XZIPmb77nRTynKidRJKTU0Fl+10jyLbAhFTuBWKMypVY06EaYFnwhsgsws/7nNX8MTEQuewbl9bWFAbsg== + +"@cspell/dict-public-licenses@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.11.tgz#37550c4e0cd445991caba528bf4ba58ce7a935c3" + integrity sha512-rR5KjRUSnVKdfs5G+gJ4oIvQvm8+NJ6cHWY2N+GE69/FSGWDOPHxulCzeGnQU/c6WWZMSimG9o49i9r//lUQyA== + +"@cspell/dict-python@^4.2.12": + version "4.2.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.2.12.tgz#ea6298bb72a6bcf2c188d5c55142e0afab8a6c1c" + integrity sha512-U25eOFu+RE0aEcF2AsxZmq3Lic7y9zspJ9SzjrC0mfJz+yr3YmSCw4E0blMD3mZoNcf7H/vMshuKIY5AY36U+Q== + dependencies: + "@cspell/dict-data-science" "^2.0.5" + +"@cspell/dict-r@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.0.4.tgz#31b5abd91cc12aebfffdde4be4d2902668789311" + integrity sha512-cBpRsE/U0d9BRhiNRMLMH1PpWgw+N+1A2jumgt1if9nBGmQw4MUpg2u9I0xlFVhstTIdzXiLXMxP45cABuiUeQ== + +"@cspell/dict-ruby@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.0.7.tgz#3593a955baaffe3c5d28fb178b72fdf93c7eec71" + integrity sha512-4/d0hcoPzi5Alk0FmcyqlzFW9lQnZh9j07MJzPcyVO62nYJJAGKaPZL2o4qHeCS/od/ctJC5AHRdoUm0ktsw6Q== + +"@cspell/dict-rust@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.9.tgz#8af5e405f3280afffe41f212da3ae0e777243842" + integrity sha512-Dhr6TIZsMV92xcikKIWei6p/qswS4M+gTkivpWwz4/1oaVk2nRrxJmCdRoVkJlZkkAc17rjxrS12mpnJZI0iWw== + +"@cspell/dict-scala@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.6.tgz#5e925def2fe6dc27ee2ad1c452941c3d6790fb6d" + integrity sha512-tl0YWAfjUVb4LyyE4JIMVE8DlLzb1ecHRmIWc4eT6nkyDqQgHKzdHsnusxFEFMVLIQomgSg0Zz6hJ5S1E4W4ww== + +"@cspell/dict-software-terms@^4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-4.1.11.tgz#54e1cfcda53f308135215f7163797d7ed8f69ee4" + integrity sha512-77CTHxWFTVw6tVoMN8WBMrlNW2F2FbgATwD/6vcOuiyrJUmh8klN5ZK3m+yyK3ZzsnaW2Bduoc0fw2Ckcm/riQ== + +"@cspell/dict-sql@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.1.8.tgz#45ea53b3e57fd2cc5f839f49b644aa743dac4990" + integrity sha512-dJRE4JV1qmXTbbGm6WIcg1knmR6K5RXnQxF4XHs5HA3LAjc/zf77F95i5LC+guOGppVF6Hdl66S2UyxT+SAF3A== + +"@cspell/dict-svelte@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.5.tgz#09752e01ff6667e737566d9dfc704c8dcc9a6492" + integrity sha512-sseHlcXOqWE4Ner9sg8KsjxwSJ2yssoJNqFHR9liWVbDV+m7kBiUtn2EB690TihzVsEmDr/0Yxrbb5Bniz70mA== + +"@cspell/dict-swift@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.4.tgz#bc19522418ed68cf914736b612c4e4febbf07e8d" + integrity sha512-CsFF0IFAbRtYNg0yZcdaYbADF5F3DsM8C4wHnZefQy8YcHP/qjAF/GdGfBFBLx+XSthYuBlo2b2XQVdz3cJZBw== + +"@cspell/dict-terraform@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.0.5.tgz#14c427ae47d2f78b4acd6fe9ed12bcae53aec441" + integrity sha512-qH3epPB2d6d5w1l4hR2OsnN8qDQ4P0z6oDB7+YiNH+BoECXv4Z38MIV1H8cxIzD2wkzkt2JTcFYaVW72MDZAlg== + +"@cspell/dict-typescript@^3.1.10": + version "3.1.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.1.11.tgz#40586f13b0337bd9cba958e0661b35888580b249" + integrity sha512-FwvK5sKbwrVpdw0e9+1lVTl8FPoHYvfHRuQRQz2Ql5XkC0gwPPkpoyD1zYImjIyZRoYXk3yp9j8ss4iz7A7zoQ== + +"@cspell/dict-vue@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.3.tgz#295c288f6fd363879898223202ec3be048663b98" + integrity sha512-akmYbrgAGumqk1xXALtDJcEcOMYBYMnkjpmGzH13Ozhq1mkPF4VgllFQlm1xYde+BUKNnzMgPEzxrL2qZllgYA== + +"@cspell/dynamic-import@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-8.15.4.tgz#6aee2c81a3a45d3ec6c3f225fbe24557d46e0f85" + integrity sha512-tr0F6EYN6qtniNvt1Uib+PgYQHeo4dQHXE2Optap+hYTOoQ2VoQ+SwBVjZ+Q2bmSAB0fmOyf0AvgsUtnWIpavw== + dependencies: + import-meta-resolve "^4.1.0" + +"@cspell/filetypes@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/filetypes/-/filetypes-8.15.4.tgz#cdc64f21f5b1b824490aa003d53b9a07703c5818" + integrity sha512-sNl6jr3ym/4151EY76qlI/00HHsiLZBqW7Vb1tqCzsgSg3EpL30ddjr74So6Sg2PN26Yf09hvxGTJzXn1R4aYw== + +"@cspell/strong-weak-map@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.15.4.tgz#0e5419862e0a8634e2db20a9e660b827321a6436" + integrity sha512-m5DeQksbhJFqcSYF8Q0Af/WXmXCMAJocCUShkzOXK+uZNXnvhBZN7VyQ9hL+GRzX8JTPEPdVcz2lFyVE5p+LzQ== + +"@cspell/url@8.15.4": + version "8.15.4" + resolved "https://registry.yarnpkg.com/@cspell/url/-/url-8.15.4.tgz#759a9832e9fd6f9fd022c4eb3031c1b28c272faa" + integrity sha512-K2oZu/oLQPs5suRpLS8uu04O3YMUioSlEU1D66fRoOxzI5NzLt7i7yMg3HQHjChGa09N5bzqmrVdhmQrRZXwGg== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint-community/regexpp@^4.6.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + 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.9", "@ethersproject/abi@^5.1.2": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + 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": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^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" + 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.0.2", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + 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": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^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" + 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": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^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" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^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" + 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/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^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" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^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" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^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" + 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/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + 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": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + 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/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + 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" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@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" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + 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" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@1.6.0", "@noble/curves@^1.4.0", "@noble/curves@~1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" + integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== + dependencies: + "@noble/hashes" "1.5.0" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@1.5.0", "@noble/hashes@^1.3.3", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + 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" + 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": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nomicfoundation/edr-darwin-arm64@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.4.tgz#6eaa64a6ea5201e4c92b121f2b7fd197b26e450a" + integrity sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ== + +"@nomicfoundation/edr-darwin-x64@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.4.tgz#d15ca89e9deef7d0a710cf90e79f3cc270a5a999" + integrity sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg== + +"@nomicfoundation/edr-linux-arm64-gnu@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.4.tgz#e73c41ca015dfddb5f4cb6cd3d9b2cbe5cc28989" + integrity sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA== + +"@nomicfoundation/edr-linux-arm64-musl@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.4.tgz#90906f733e4ad26657baeb22d28855d934ab7541" + integrity sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q== + +"@nomicfoundation/edr-linux-x64-gnu@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.4.tgz#11b8bd73df145a192e5a08199e5e81995fcde502" + integrity sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA== + +"@nomicfoundation/edr-linux-x64-musl@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.4.tgz#a34b9a2c9e34853207824dc81622668a069ca642" + integrity sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw== + +"@nomicfoundation/edr-win32-x64-msvc@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.4.tgz#ca035c6f66ae9f88fa3ef123a1f3a2099cce7a5a" + integrity sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw== + +"@nomicfoundation/edr@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.4.tgz#1cd336c46a60f5af774e6cf0f1943f49f63dded6" + integrity sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.4" + "@nomicfoundation/edr-darwin-x64" "0.6.4" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.4" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.4" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.4" + "@nomicfoundation/edr-linux-x64-musl" "0.6.4" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.4" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/hardhat-chai-matchers@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz#9c7cfc4ad0f0a5e9cf16aba8ab668c02f6e273aa" + integrity sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg== + dependencies: + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-ethers@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" + integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/hardhat-verify@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz#6a433d777ce0172d1f0edf7f2d3e1df14b3ecfc1" + integrity sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA== + 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/slang-darwin-arm64@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz#8cded3c24322624e3b6618760caba8e840bd1c1d" + integrity sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA== + +"@nomicfoundation/slang-darwin-x64@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz#6ebeb33a2ced89fc6023f6cda4af96403486038a" + integrity sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g== + +"@nomicfoundation/slang-linux-arm64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz#41c7e57a9b1a3aee6911f0cab22e683c149fb470" + integrity sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw== + +"@nomicfoundation/slang-linux-arm64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz#9c4b51689274ae75c2c8a4cddd2e1cc0a79c191d" + integrity sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA== + +"@nomicfoundation/slang-linux-x64-gnu@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz#c3a3b6a7b775fc617832958d10e6664bf86d39d0" + integrity sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg== + +"@nomicfoundation/slang-linux-x64-musl@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz#725118ff99a7217b9f1d1bd84411d9442084077d" + integrity sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ== + +"@nomicfoundation/slang-win32-arm64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz#9c8bc4ccf21eaaac0cfcb6d3954ede4e2dea4c02" + integrity sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q== + +"@nomicfoundation/slang-win32-ia32-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz#3fc5d00a3f8c1d85a5e94146af78a5526a4f3d27" + integrity sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg== + +"@nomicfoundation/slang-win32-x64-msvc@0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz#f6a5e3250fa07cbda49151edeb80f09090e5b71a" + integrity sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA== + +"@nomicfoundation/slang@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-0.17.0.tgz#d9c25cd711ebf3490c9d0c99e9b4ca2481341a6b" + integrity sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ== + dependencies: + "@nomicfoundation/slang-darwin-arm64" "0.17.0" + "@nomicfoundation/slang-darwin-x64" "0.17.0" + "@nomicfoundation/slang-linux-arm64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-arm64-musl" "0.17.0" + "@nomicfoundation/slang-linux-x64-gnu" "0.17.0" + "@nomicfoundation/slang-linux-x64-musl" "0.17.0" + "@nomicfoundation/slang-win32-arm64-msvc" "0.17.0" + "@nomicfoundation/slang-win32-ia32-msvc" "0.17.0" + "@nomicfoundation/slang-win32-x64-msvc" "0.17.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@openzeppelin/contracts-upgradeable@^4.7.1": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" + integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== + +"@openzeppelin/defender-sdk-base-client@^1.14.4", "@openzeppelin/defender-sdk-base-client@^1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.15.0.tgz#5c6af6929c399dd7ef9ca1eb4ca042ae7e772367" + integrity sha512-nuf/xegMIuKCO0hMrxI1KQKTzQw1iCl/9kew2nJM9MrFIohhfEXItc5rbJRoV/jehmK/Jhi9ATF9OHH09StEsQ== + dependencies: + amazon-cognito-identity-js "^6.3.6" + async-retry "^1.3.3" + +"@openzeppelin/defender-sdk-deploy-client@^1.14.4": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.15.0.tgz#affbeb93bf633ab9914ae7ca6326ff9dcdbbb670" + integrity sha512-2ODMN4j5pPYWyIOvA/zRQmJ0tJyqi6NV3S/PyvufBXa3oj/MDnVO5bMGSQFH0M2VE3bg+i/rcUb0hdbX9Rtm5Q== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.15.0" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/defender-sdk-network-client@^1.14.4": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-1.15.0.tgz#43eb2bb06fa69a127305f073089fa3201a65367c" + integrity sha512-tNynCqFB1XYancq/8yGuj0HCSIyNLSRSuH53Hp2Tl+DpM7W5vIkzSRfvJJxC+8Sld83bVavyNJzTN9xid992Ag== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.15.0" + axios "^1.7.2" + lodash "^4.17.21" + +"@openzeppelin/hardhat-upgrades@^3.1.1": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.5.0.tgz#90ed0508fed8415b7fa9ee1c04ade8ec57091d46" + integrity sha512-Ju/JnT7NRiOMi5m5Y0dGiz37d8wnjVBep1v5Vr7+6+MFNuQa1yddUEVWhWhoEw4udI3/mYwyw4Sfz3sq7vhicQ== + dependencies: + "@openzeppelin/defender-sdk-base-client" "^1.14.4" + "@openzeppelin/defender-sdk-deploy-client" "^1.14.4" + "@openzeppelin/defender-sdk-network-client" "^1.14.4" + "@openzeppelin/upgrades-core" "^1.40.0" + chalk "^4.1.0" + debug "^4.1.1" + ethereumjs-util "^7.1.5" + proper-lockfile "^4.1.1" + undici "^6.11.1" + +"@openzeppelin/upgrades-core@^1.40.0": + version "1.40.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.40.0.tgz#f01647afb99b46356b3e7b98e3b2c7f864d85add" + integrity sha512-4bPSXdEqHsNRL5T1ybPLneWGYjzGl6XWGWkv7aUoFFgz8mOdarstRBX1Wi4XJFw6IeHPUI7mMSQr2jdz8Y2ypQ== + dependencies: + "@nomicfoundation/slang" "^0.17.0" + cbor "^9.0.0" + chalk "^4.1.0" + compare-versions "^6.0.0" + debug "^4.1.1" + ethereumjs-util "^7.0.3" + minimatch "^9.0.5" + minimist "^1.2.7" + proper-lockfile "^4.1.1" + solidity-ast "^0.4.51" + +"@renovatebot/pep440@^3.0.20": + version "3.0.20" + resolved "https://registry.yarnpkg.com/@renovatebot/pep440/-/pep440-3.0.20.tgz#eac961dec19ac7dca488c1ec20a91df17161f0e2" + integrity sha512-Jw8jzHh2r1LAPTrjQlIwh/+8J3N2MqXZgPuTt6HdNeJIBjJskV8bsEfGs9rBzXi/omeHob3BXnvlECu2rCCUYw== + +"@safe-global/api-kit@2.5.4": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@safe-global/api-kit/-/api-kit-2.5.4.tgz#1759f5f04aee82656f826a9a067be0c01c4ec77c" + integrity sha512-L12qTaEQdQqdlPhsjC+JCpH5qxphyegPptrc98cRFnxsES0Dz3i/2df7kSAIntaYIP4aFEbulpVwOjOgWf+hDQ== + dependencies: + "@safe-global/protocol-kit" "^5.0.4" + "@safe-global/types-kit" "^1.0.0" + node-fetch "^2.7.0" + viem "^2.21.8" + +"@safe-global/api-kit@^2.4.1": + version "2.5.3" + resolved "https://registry.yarnpkg.com/@safe-global/api-kit/-/api-kit-2.5.3.tgz#8b0e996836a55e1c4cac6609b97a46c48bcb58fc" + integrity sha512-BHKKKohtM6cqtWmu2BIBl5YVMFeIzE1kBe2kfDi0JG9UbzTKYUYU8d/RnteFe5Nj/KiO7F7bJ708Z7ZxQ9Ap0g== + dependencies: + "@safe-global/protocol-kit" "^5.0.3" + "@safe-global/types-kit" "^1.0.0" + node-fetch "^2.7.0" + viem "^2.21.8" + +"@safe-global/protocol-kit@^5.0.1", "@safe-global/protocol-kit@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-5.0.3.tgz#187cfdeaf892c832265cb356d0ef5e230cb8fc4f" + integrity sha512-xVpuj1Ge/XYdLucPe36MXl09yK83f3drPqFK0UPhrONg//SP/K/sgyXnKy5o4zJrjidNV9V0PV7Xw84HOqOxtg== + dependencies: + "@noble/hashes" "^1.3.3" + "@safe-global/safe-deployments" "^1.37.12" + "@safe-global/safe-modules-deployments" "^2.2.4" + "@safe-global/types-kit" "^1.0.0" + abitype "^1.0.2" + semver "^7.6.3" + viem "^2.21.8" + +"@safe-global/protocol-kit@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-5.0.4.tgz#bd1b02520f0a68183de83bcd474e2dc3881c8c28" + integrity sha512-e2BhyiS/7jMzJY8oNpkMIHWAViENyL42/SAvFOcFsEc6JBvnh+4GGvLRwLVEiQ8e+54sJinRjo1/iTCrTIoqOQ== + dependencies: + "@noble/hashes" "^1.3.3" + "@safe-global/safe-deployments" "^1.37.14" + "@safe-global/safe-modules-deployments" "^2.2.4" + "@safe-global/types-kit" "^1.0.0" + abitype "^1.0.2" + semver "^7.6.3" + viem "^2.21.8" + +"@safe-global/safe-core-sdk-types@^5.0.1": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-5.1.0.tgz#af8d877b9af231242d023c7182f78ff4223bc3f4" + integrity sha512-UzXR4zWmVzux25FcIm4H049QhZZpVpIBL5HE+V0p5gHpArZROL+t24fZmsKUf403CtBxIJM5zZSVQL0nFJi+IQ== + dependencies: + abitype "^1.0.2" + +"@safe-global/safe-deployments@^1.37.12": + version "1.37.12" + resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.37.12.tgz#c01b0a272991ae0e63a37d506024a809de53c370" + integrity sha512-6UM5wS6b0h4Uu2BCK6sWLNC5UYFBd1Xu4YsuZpoSjlo/6UDbbK6lzYVEgtqbsy8p1z2ZO+Z73WgRo3mlh7awig== + dependencies: + semver "^7.6.2" + +"@safe-global/safe-deployments@^1.37.14": + version "1.37.14" + resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.37.14.tgz#31c1d1ff924d94ce639c136bef154de3adf5f75e" + integrity sha512-uHpYizq52j1arwWRxHbEbrZsECD5tG87NwLo/xDViRVw/GIrkRC6HerkzfZwiHVjVrC8gN8o3ApLsknYbxrF4w== + dependencies: + semver "^7.6.2" + +"@safe-global/safe-modules-deployments@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@safe-global/safe-modules-deployments/-/safe-modules-deployments-2.2.4.tgz#6e3b22af3a4eeba8e0a8f0952e575d25c5be216e" + integrity sha512-m396ZrBPhZVYkapTTIuizyOOtoZsCKbicl0ztgDFfDbi7KbS6AtDP6cV89AYosQxUQS+v0q4ksQd30/j3L1BtQ== + +"@safe-global/types-kit@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@safe-global/types-kit/-/types-kit-1.0.0.tgz#d1f29d65a8ac22f03b0cd3ab54fb518dcf7a85c3" + integrity sha512-jZNUeHbWobeVrURbcEvfas4Q1IDasQni5UYm2umUtAR6SBDazp1kGni8IjZPRKq3+8q+fYwu9FmKpX50rUYn3w== + dependencies: + abitype "^1.0.2" + +"@scure/base@~1.1.0", "@scure/base@~1.1.6", "@scure/base@~1.1.7", "@scure/base@~1.1.8": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip32@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.5.0.tgz#dd4a2e1b8a9da60e012e776d954c4186db6328e6" + integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== + dependencies: + "@noble/curves" "~1.6.0" + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.7" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.4.0.tgz#664d4f851564e2e1d4bffa0339f9546ea55960a6" + integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== + dependencies: + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.8" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + 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.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + 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" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@skalenetwork/etherbase-interfaces@^0.0.1-develop.20": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@skalenetwork/etherbase-interfaces/-/etherbase-interfaces-0.0.1.tgz#97ed2069256a835efa1b088a58de17e2783a9e71" + integrity sha512-CgAo41sSL1KT9e1d3sUTxW5WPbEvHQwoqo3hLt+VW/6kGYukCuW4AHWMyDr5Jjw9KtjDKSOySDcoukhaeKxToQ== + +"@skalenetwork/ima-interfaces@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@skalenetwork/ima-interfaces/-/ima-interfaces-2.0.0.tgz#93cb73a5200f7d9753a44c1be3e15156e7ceaf9c" + integrity sha512-Kqm45GHQl56H4pqdWHIcTUfFrE60LAUKI3j2CecebN0T9rKa0DDokvE42VDa3PfK2z6XIJxh7SkF+i6NsLbpjA== + dependencies: + "@skalenetwork/skale-manager-interfaces" "^0.1.2" + +"@skalenetwork/skale-contracts-ethers-v6@^1.0.2-develop.30": + version "1.0.2-develop.30" + resolved "https://registry.yarnpkg.com/@skalenetwork/skale-contracts-ethers-v6/-/skale-contracts-ethers-v6-1.0.2-develop.30.tgz#d4adf188041fa5de7c34d6cefbabdd4835547266" + integrity sha512-mWYCyK1kneEAd4RsAYXoiVj2kmcYhKtB/gnAGM7nOGaaLjMsHPGLxGU9bGytiZZRiwGf5758x/F2Trrn5bKR9g== + dependencies: + "@skalenetwork/skale-contracts" "1.0.2-develop.30" + ethers "^6.13.4" + +"@skalenetwork/skale-contracts@1.0.2-develop.30": + version "1.0.2-develop.30" + resolved "https://registry.yarnpkg.com/@skalenetwork/skale-contracts/-/skale-contracts-1.0.2-develop.30.tgz#ed165d49ef6de6c4bbc831a741b206ffb833d5ab" + integrity sha512-h84NQxobzbI5KZcPZtcgKZYL9/iOJym2mF876pfUY7ftBd0aIu/xtJqIPfeoAcDaevhxJEg9QeabCXKp+9tbCA== + dependencies: + "@renovatebot/pep440" "^3.0.20" + axios "^1.4.0" + semver "^7.6.0" + +"@skalenetwork/skale-manager-interfaces@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@skalenetwork/skale-manager-interfaces/-/skale-manager-interfaces-2.0.0.tgz#afb63131e5c498cfa69219567f9f52b85f0856c9" + integrity sha512-Pge3p4vpeNaXHjwntX+8b38NEcT81a67I32bbnU+l1uSo4kmyXd0VblHMO84H1Azr9TzF3ZmNCG+GI2yntSx2w== + +"@skalenetwork/skale-manager-interfaces@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@skalenetwork/skale-manager-interfaces/-/skale-manager-interfaces-0.1.2.tgz#88e543c8cc298cd0cc9559892d746d2d74786da8" + integrity sha512-gapSQJahwWMlTB/xp/kMzB6k+9+Skx/N0fvEloiW4CUrkGkSa8+fj16YmUXX45p1hOc45W+JydiJPNgZtx32Dg== + +"@skalenetwork/upgrade-tools@3.0.0-develop.34": + version "3.0.0-develop.34" + resolved "https://registry.yarnpkg.com/@skalenetwork/upgrade-tools/-/upgrade-tools-3.0.0-develop.34.tgz#8dfe1f64f241fd734acdbe0f5e35010847aa992b" + integrity sha512-yA4S8y/eHJwjxe3288+A4aLjt0z+Wj40pphbQ3poug/p4Uny17jj2+FMG+JN/EQjwkXLNI/BD8m66atOOeoQ8A== + dependencies: + "@safe-global/api-kit" "^2.4.1" + "@safe-global/protocol-kit" "^5.0.1" + "@safe-global/safe-core-sdk-types" "^5.0.1" + "@skalenetwork/skale-contracts-ethers-v6" "^1.0.2-develop.30" + axios "^1.4.0" + ethereumjs-util "^7.1.4" + semaphore-async-await "^1.5.1" + +"@smithy/types@^3.5.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.6.0.tgz#03a52bfd62ee4b7b2a1842c8ae3ada7a0a5ff3a4" + integrity sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w== + dependencies: + tslib "^2.6.2" + +"@solidity-parser/parser@^0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.13.2.tgz#b6c71d8ca0b382d90a7bbed241f9bc110af65cbe" + integrity sha512-RwHnpRnfrnD2MSPveYoPh8nhofEvX7fgjHk1Oq+NNvCcLx4r1js91CO9o+F/F3fBzOCyvm8kKRTriFICX/odWw== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== + +"@trufflesuite/bigint-buffer@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== + dependencies: + node-gyp-build "4.4.0" + +"@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0": + version "20.30.0-unofficial.0" + resolved "https://registry.yarnpkg.com/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.30.0-unofficial.0.tgz#2fbc2f8ef7e82fbeea6abaf7e8a9d42a02b479d3" + integrity sha512-r5X0aOQcuT6pLwTRLD+mPnAM/nlKtvIK4Z+My++A8tTOR0qTjNRx8UB8jzRj3D+p9PMAp5LnpCUUGmz7/TppwA== + dependencies: + ws "8.13.0" + optionalDependencies: + bufferutil "4.0.7" + utf-8-validate "6.0.3" + +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== + dependencies: + fs-extra "^9.1.0" + +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" + integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w== + dependencies: + "@types/node" "*" + +"@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" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/chai-almost@^1.0.1": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/chai-almost/-/chai-almost-1.0.3.tgz#bfd9767d5816895dc18c1b453ee07b4626a9a8f2" + integrity sha512-NMLjvnFjgxS0Z36whNuoma2p/2Fu6m+dV8eddO8tRAztMAqTqYxFYGyJNsAsOlwx89siUMfxQ1Wdqew2xXsiEg== + dependencies: + "@types/chai" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.0.0.tgz#7f981e71e69c9b2d422f58f78de1c59179782133" + integrity sha512-+DwhEHAaFPPdJ2ral3kNHFQXnTfscEEFsUxzD+d7nlcLrFK23JtNjH71RGasTcHb88b4vVi4mTyfpf8u2L8bdA== + +"@types/chai@^4.2.12": + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== + +"@types/elliptic@^6.4.14": + version "6.4.18" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1" + integrity sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw== + dependencies: + "@types/bn.js" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/lru-cache@5.1.1", "@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" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/mocha@^9.1.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "22.7.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.8.tgz#a1dbf0dc5f71bdd2642fc89caef65d58747ce825" + integrity sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg== + dependencies: + undici-types "~6.19.2" + +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/resolve@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + +"@types/sinon-chai@^3.2.5": + version "3.2.12" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.12.tgz#c7cb06bee44a534ec84f3a5534c3a3a46fd779b6" + integrity sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ== + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa" + integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.5" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" + integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== + +"@typescript-eslint/eslint-plugin@^8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz#7dc0e419c87beadc8f554bf5a42e5009ed3748dc" + integrity sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/type-utils" "8.14.0" + "@typescript-eslint/utils" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.14.0.tgz#0a7e9dbc11bc07716ab2d7b1226217e9f6b51fc8" + integrity sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA== + dependencies: + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz#01f37c147a735cd78f0ff355e033b9457da1f373" + integrity sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw== + dependencies: + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + +"@typescript-eslint/type-utils@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz#455c6af30c336b24a1af28bc4f81b8dd5d74d94d" + integrity sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ== + dependencies: + "@typescript-eslint/typescript-estree" "8.14.0" + "@typescript-eslint/utils" "8.14.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.14.0.tgz#0d33d8d0b08479c424e7d654855fddf2c71e4021" + integrity sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g== + +"@typescript-eslint/typescript-estree@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz#a7a3a5a53a6c09313e12fb4531d4ff582ee3c312" + integrity sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ== + dependencies: + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/visitor-keys" "8.14.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.14.0.tgz#ac2506875e03aba24e602364e43b2dfa45529dbd" + integrity sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.14.0" + "@typescript-eslint/types" "8.14.0" + "@typescript-eslint/typescript-estree" "8.14.0" + +"@typescript-eslint/visitor-keys@8.14.0": + version "8.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz#2418d5a54669af9658986ade4e6cfb7767d815ad" + integrity sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ== + dependencies: + "@typescript-eslint/types" "8.14.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +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: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +abitype@1.0.6, abitype@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" + integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== + +abstract-level@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^6.0.7: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^8.9.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" + integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + 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" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2: +ajv@^6.10.2, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -48,13 +1700,61 @@ ajv@^6.10.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-escapes@^4.2.1: +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +amazon-cognito-identity-js@^6.3.6: + version "6.3.12" + resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz#af73df033094ad4c679c19cf6122b90058021619" + integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== + dependencies: + "@aws-crypto/sha256-js" "1.2.2" + buffer "4.9.2" + fast-base64-decode "^1.0.0" + isomorphic-unfetch "^3.0.0" + js-cookie "^2.2.1" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^4.1.1, ansi-colors@^4.1.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@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + 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" @@ -72,119 +1772,386 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +antlr4@4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" + 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" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: - sprintf-js "~1.0.2" + 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" + 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" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + 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" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-eventemitter@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + 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" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axios@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^1.4.0, axios@^1.7.2: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +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, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, 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" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + balanced-match "^1.0.0" + concat-map "0.0.1" -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" + balanced-match "^1.0.0" -array.prototype.findlastindex@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz#bc229aef98f6bd0533a2bc61ff95209875526c9b" - integrity sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + fill-range "^7.1.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -array.prototype.flat@^1.3.1: +browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + 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" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +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== 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" + base64-js "^1.3.1" + ieee754 "^1.2.1" -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +bufferutil@4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + callsites "^2.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" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -chalk@^2.0.0, chalk@^2.1.0: +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +catering@^2.0.0, catering@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +cbor@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" + integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== + dependencies: + nofilter "^3.1.0" + +chai-almost@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chai-almost/-/chai-almost-1.0.1.tgz#43d026cf3be79a1cd513cf15af840a81243a4b60" + integrity sha512-UrNSx5f2B1/ESrOz0a4iLpDnQvDnK/3O0ZE/KGYQ+NcndKy0VQkMkv8yoGIHNSbjzKBid3EAMdDMA5wb9CxvSA== + dependencies: + deep-eql "^2.0.2" + type-detect "^4.0.3" + +chai-as-promised@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== + dependencies: + check-error "^1.0.2" + +chai@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + +chalk-template@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" + integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== + dependencies: + chalk "^5.2.0" + +chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -193,7 +2160,7 @@ chalk@^2.0.0, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -201,22 +2168,96 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: - restore-cursor "^3.1.0" + get-func-name "^2.0.2" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +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" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== + dependencies: + parent-module "^2.0.0" + resolve-from "^5.0.0" + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" color-convert@^1.9.0: version "1.9.3" @@ -242,11 +2283,117 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + 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" + 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" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +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" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + +commander@2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" + integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== + +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +comment-json@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.5.tgz#482e085f759c2704b60bc6f97f55b8c01bc41e70" + integrity sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + +compare-versions@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" + integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-util-is@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.7: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +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" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.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" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -258,39 +2405,205 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cspell-config-lib@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-8.15.4.tgz#c9530304e072cbc8d9d4cd76fdb3abcf45dab8af" + integrity sha512-vUgikQTRkRMTdkZqSs7F2cTdPpX61cTjr/9L/VCkXkbW38ObCr4650ioiF1Wq3zDF3Gy2bc4ECTpD2PZUXX5SA== + dependencies: + "@cspell/cspell-types" "8.15.4" + comment-json "^4.2.5" + yaml "^2.6.0" + +cspell-dictionary@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-8.15.4.tgz#be701af741a0be1a8680674bcbd3dadd7bc5c1fe" + integrity sha512-8+p/l9Saac7qyCbqtELneDoT7CwHu9gYmnI8uXMu34/lPGjhVhy10ZeI0+t1djaO2YyASK400YFKq5uP/5KulA== + dependencies: + "@cspell/cspell-pipe" "8.15.4" + "@cspell/cspell-types" "8.15.4" + cspell-trie-lib "8.15.4" + fast-equals "^5.0.1" + +cspell-gitignore@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-8.15.4.tgz#79bcfcc343466cc483c1805baf0c53f6bdef1753" + integrity sha512-9n5PpQ8gEf8YcvEtoZGZ2Ma6wnqSFkD2GrmyjISy39DfIX/jNLN7GX2wJm6OD2P4FjXer95ypmIb/JWTlfmbTw== + dependencies: + "@cspell/url" "8.15.4" + cspell-glob "8.15.4" + cspell-io "8.15.4" + find-up-simple "^1.0.0" + +cspell-glob@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-8.15.4.tgz#24934982f3ecf664a32618f0fdf3965de63f05da" + integrity sha512-TTfRRHRAN+PN9drIz4MAEgKKYnPThBOlPMdFddyuisvU33Do1sPAnqkkOjTEFdi3jAA5KwnSva68SVH6IzzMBQ== + dependencies: + "@cspell/url" "8.15.4" + micromatch "^4.0.8" + +cspell-grammar@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-8.15.4.tgz#28619d564f4c128618fcecb1d71e31e30b69d213" + integrity sha512-MKiKyYi05mRtXOxPoTv3Ksi0GwYLiK84Uq0C+5PaMrnIjXeed0bsddSFXCT+7ywFJc7PdjhTtz0M/9WWK3UgbA== + dependencies: + "@cspell/cspell-pipe" "8.15.4" + "@cspell/cspell-types" "8.15.4" + +cspell-io@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-8.15.4.tgz#5d55471cbcff9f2d061a6f3504cd525152da754e" + integrity sha512-rXIEREPTFV9dwwg4EKfvzqlCNOvT6910AYED5YrSt8Y68usRJ9lbqdx0BrDndVCd33bp1o+9JBfHuRiFIQC81g== + dependencies: + "@cspell/cspell-service-bus" "8.15.4" + "@cspell/url" "8.15.4" + +cspell-lib@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-8.15.4.tgz#ebab39a5e9f74d2a50c588cd8397f0a2f5f7c4d0" + integrity sha512-iLp/625fvCyFFxSyZYLMgqHIKcrhN4hT7Hw5+ySa38Bp/OfA81ANqWHpsDQ0bGsALTRn/DHBpQYj4xCW/aN9tw== + dependencies: + "@cspell/cspell-bundled-dicts" "8.15.4" + "@cspell/cspell-pipe" "8.15.4" + "@cspell/cspell-resolver" "8.15.4" + "@cspell/cspell-types" "8.15.4" + "@cspell/dynamic-import" "8.15.4" + "@cspell/filetypes" "8.15.4" + "@cspell/strong-weak-map" "8.15.4" + "@cspell/url" "8.15.4" + clear-module "^4.1.2" + comment-json "^4.2.5" + cspell-config-lib "8.15.4" + cspell-dictionary "8.15.4" + cspell-glob "8.15.4" + cspell-grammar "8.15.4" + cspell-io "8.15.4" + cspell-trie-lib "8.15.4" + env-paths "^3.0.0" + fast-equals "^5.0.1" + gensequence "^7.0.0" + import-fresh "^3.3.0" + resolve-from "^5.0.0" + vscode-languageserver-textdocument "^1.0.12" + vscode-uri "^3.0.8" + xdg-basedir "^5.1.0" + +cspell-trie-lib@8.15.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-8.15.4.tgz#48027e9bddc311f4b578b47286fc5d530c6da14a" + integrity sha512-sg9klsNHyrfos0Boiio+qy5d6fI9cCNjBqFYrNxvpKpwZ4gEzDzjgEKdZY1C76RD2KoBQ8I1NF5YcGc0+hhhCw== + dependencies: + "@cspell/cspell-pipe" "8.15.4" + "@cspell/cspell-types" "8.15.4" + gensequence "^7.0.0" + +cspell@^8.14.4: + version "8.15.4" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-8.15.4.tgz#8292a6ece4ef05f0602c4ba6fb9ef8e962cb0433" + integrity sha512-hUOxcwmNWuHzVeGHyN5v/T9MkyCE5gi0mvatxsM794B2wOuR1ZORgjZH62P2HY1uBkXe/x5C6ITWrSyh0WgAcg== + dependencies: + "@cspell/cspell-json-reporter" "8.15.4" + "@cspell/cspell-pipe" "8.15.4" + "@cspell/cspell-types" "8.15.4" + "@cspell/dynamic-import" "8.15.4" + "@cspell/url" "8.15.4" + chalk "^5.3.0" + chalk-template "^1.1.0" + commander "^12.1.0" + cspell-dictionary "8.15.4" + cspell-gitignore "8.15.4" + cspell-glob "8.15.4" + cspell-io "8.15.4" + cspell-lib "8.15.4" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^9.1.0" + get-stdin "^9.0.0" + semver "^7.6.3" + tinyglobby "^0.2.9" + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" + integrity sha512-uts3fF4HnV1bcNx8K5c9NMjXXKtLOf1obUMq04uEuMaF8i1m0SfugbpDMd59cYfodQcMqeUISvL4Pmx5NZ7lcw== dependencies: - ms "^2.1.1" + type-detect "^3.0.0" -debug@^4.0.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: - ms "2.1.2" + 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" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +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" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" + heap ">= 0.2.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - esutils "^2.0.2" + path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" @@ -299,6 +2612,42 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dotenv@^16.0.0: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.2, elliptic@^6.5.4, elliptic@^6.5.7: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -309,254 +2658,224 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - 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.10" - 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.10" - -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" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" + ansi-colors "^4.1.1" + strip-ansi "^6.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" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -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" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 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" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -eslint-config-standard@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: - debug "^3.2.7" - -eslint-plugin-es@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" - integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.20.2: - version "2.28.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz#8d66d6925117b06c4018d491ae84469eb3cb1005" - integrity sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q== - dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.12.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" - resolve "^1.22.3" - semver "^6.3.1" - tsconfig-paths "^3.14.2" - -eslint-plugin-node@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" - integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== - dependencies: - eslint-plugin-es "^3.0.0" - eslint-utils "^2.0.0" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-promise@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" - integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== - -eslint-plugin-standard@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== + esrecurse "^4.1.0" + estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" - estraverse "^4.1.1" + estraverse "^5.2.0" -eslint-utils@^1.4.3: +eslint-utils@^1.3.1: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^5.6.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" + ajv "^6.9.1" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob "^7.1.2" + globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" + inquirer "^6.2.2" + js-yaml "^3.13.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.14" + lodash "^4.17.11" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.3" + optionator "^0.8.2" + path-is-inside "^1.0.2" progress "^2.0.0" regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" table "^5.2.3" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== +eslint@^8.46.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + 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.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + 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" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" -esprima@^4.0.0: +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== +esquery@^1.0.1, esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 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" + 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" @@ -572,6 +2891,123 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethereum-bloom-filters@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz#8294f074c1a6cbd32c39d2cc77ce86ff14797dab" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== + dependencies: + "@noble/hashes" "^1.4.0" + +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" + 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-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + 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.0.0, ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +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" + 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" + +ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + 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" + +ethers@^6.1.0, ethers@^6.13.4: + version "6.13.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.4.tgz#bd3e1c3dc1e7dc8ce10f9ffb4ee40967a651b53c" + integrity sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + 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: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -581,25 +3017,68 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -fast-deep-equal@^3.1.1: +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +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" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-json-stable-stringify@^2.0.0: +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-equals@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + +fast-glob@^3.0.3, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +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" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fdir@^6.4.0: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== dependencies: escape-string-regexp "^1.0.5" @@ -610,6 +3089,54 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +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" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-entry-cache@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.1.0.tgz#2e66ad98ce93f49aed1b178c57b0b5741591e075" + integrity sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg== + dependencies: + flat-cache "^5.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up-simple@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" + integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.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" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -619,74 +3146,209 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat-cache@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-5.0.0.tgz#26c4da7b0f288b408bb2b506b2cb66c240ddf062" + integrity sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ== + dependencies: + flatted "^3.3.1" + keyv "^4.5.4" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +flatted@^3.2.9, flatted@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + 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== + +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" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - is-callable "^1.1.3" + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.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" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -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" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +ganache@7.9.2: + version "7.9.2" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.9.2.tgz#77f506ad2735dd9109696ffa1834a9dd2f806449" + integrity sha512-7gsVVDpO9AhrFyDMWWl7SpMsPpqGcnAzjxz3k32LheIPNd64p2XsY9GYRdhWmKuryb60W1iaWPZWDkFKlbRWHA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" + "@trufflesuite/bigint-buffer" "1.1.10" + "@trufflesuite/uws-js-unofficial" "20.30.0-unofficial.0" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + abstract-level "1.0.3" + abstract-leveldown "7.2.0" + async-eventemitter "0.2.4" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" + +gensequence@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-7.0.0.tgz#bb6aedec8ff665e3a6c42f92823121e3a6ea7718" + integrity sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ== + +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" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + chalk "^2.4.2" + node-emoji "^1.10.0" -glob-parent@^5.0.0: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.3: +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +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== + 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.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -698,31 +3360,142 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: - type-fest "^0.8.1" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== dependencies: - define-properties "^1.1.3" + ini "4.1.1" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: - get-intrinsic "^1.1.3" + global-prefix "^3.0.0" -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" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + 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== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hardhat@^2.22.15: + version "2.22.15" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.15.tgz#319b4948f875968fde3f0d09a7edfe74e16b1365" + integrity sha512-BpTGa9PE/sKAaHi4s/S1e9WGv63DR1m7Lzfd60C8gSEchDPfAJssVRSq0MZ2v2k76ig9m0kHAwVLf5teYwu/Mw== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.6.4" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chalk "^2.4.2" + chokidar "^4.0.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" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + 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-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" @@ -734,55 +3507,109 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-own-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - get-intrinsic "^1.1.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.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" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: - has-symbols "^1.0.2" + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +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" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: - function-bind "^1.1.1" + agent-base "6" + debug "4" -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" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.4, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + 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" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -790,11 +3617,21 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-meta-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 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" + 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" @@ -803,81 +3640,80 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + fp-ts "^1.0.0" -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.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" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -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" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +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" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + binary-extensions "^2.0.0" -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" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-core-module@^2.11.0, is-core-module@^2.12.0, is-core-module@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - has "^1.0.3" + hasown "^2.0.2" -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" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== is-extglob@^2.1.1: version "2.1.1" @@ -894,84 +3730,77 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +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" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-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" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" +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" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -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" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - 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" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -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" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" +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" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" +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" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-unfetch@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +isows@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" + integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +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" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.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== @@ -979,22 +3808,127 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + 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" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + 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" 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" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + 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" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + 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" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +keccak@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyv@^4.5.3, keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== dependencies: - minimist "^1.2.0" + catering "^2.1.0" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -1004,138 +3938,400 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lodash@^4.17.14, lodash@^4.17.19: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + 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" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +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-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + +micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +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" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +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" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.6: +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@^0.5.1: +mkdirp@0.5.x, mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -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== +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" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0, mocha@^10.2.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" + integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +module-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== -ms@^2.1.1: +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +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" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" + lodash "^4.17.21" -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== +node-fetch@^2.6.1, node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + whatwg-url "^5.0.0" -object.groupby@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.0.tgz#cb29259cf90f37e7bac6437686c1ea8c916d12a9" - integrity sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw== +node-gyp-build@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.21.2" - get-intrinsic "^1.2.1" + abbrev "1" + +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" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +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" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@^1.3.0: +once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: - wrappy "1" + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.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" + 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" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - mimic-fn "^2.1.0" + p-limit "^3.0.2" -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" + aggregate-error "^3.0.0" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== parent-module@^1.0.0: version "1.0.1" @@ -1144,86 +4340,282 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + 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" + 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" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-parse@^1.0.7: +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + 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" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + 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" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +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" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + 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" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== +prettier@^1.14.3: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +prettier@^2.1.2, prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +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" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + 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" + 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" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" + minimatch "^3.0.5" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + 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" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.10.1, resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + 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: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" + path-parse "^1.0.6" -resolve@^1.22.3: - version "1.22.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283" - integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== +resolve@^1.1.6, resolve@^1.8.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.12.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== dependencies: - onetime "^5.1.0" + onetime "^2.0.0" signal-exit "^3.0.2" +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -1231,52 +4623,145 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -run-async@^2.4.0: +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-async@^2.2.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== -rxjs@^6.6.0: +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.4.0: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^5.5.0: +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +secp256k1@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== + dependencies: + elliptic "^6.5.7" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== + +semver@^5.5.0, semver@^5.5.1: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.1.0, semver@^6.1.2, semver@^6.3.1: +semver@^6.3.0: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + 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" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -1284,25 +4769,42 @@ shebang-command@^1.2.0: 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" + 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" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -1312,11 +4814,130 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +solhint@3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.6.tgz#abe9af185a9a7defefba480047b3e42cbe9a1210" + integrity sha512-HWUxTAv2h7hx3s3hAab3ifnlwb02ZWhwFU/wSudUHqteMS3ll9c+m1FlGn9V8ztE2rf3Z82fQZA005Wv7KpcFA== + dependencies: + "@solidity-parser/parser" "^0.13.2" + ajv "^6.6.1" + antlr4 "4.7.1" + ast-parents "0.0.1" + chalk "^2.4.2" + commander "2.18.0" + cosmiconfig "^5.0.7" + eslint "^5.6.0" + fast-diff "^1.1.2" + glob "^7.1.3" + ignore "^4.0.6" + js-yaml "^3.12.0" + lodash "^4.17.11" + semver "^6.3.0" + optionalDependencies: + prettier "^1.14.3" + +solidity-ast@^0.4.51: + version "0.4.59" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.59.tgz#290a2815aef70a61092591ab3e991da080ae5931" + integrity sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g== + +solidity-coverage@^0.8.4: + version "0.8.13" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.13.tgz#8eeada2e82ae19d25568368aa782a2baad0e0ce7" + integrity sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.18.0" + chalk "^2.4.2" + death "^1.1.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.21" + mocha "^10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + +source-map-support@^0.5.13, source-map-support@^0.5.17: + 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== + 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" + 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" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + 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" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -1326,7 +4947,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -1335,34 +4956,21 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -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" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +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: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + safe-buffer "~5.2.0" -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" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + ansi-regex "^3.0.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -1376,16 +4984,30 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +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" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" -strip-json-comments@^3.0.1: +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: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + 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" @@ -1400,11 +5022,28 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-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" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -1415,6 +5054,17 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.8.0: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -1425,28 +5075,126 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tmp@^0.0.33: +tinyglobby@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.9.tgz#6baddd1b0fe416403efb0dd40442c7d7c03c1c66" + integrity sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw== + dependencies: + fdir "^6.4.0" + picomatch "^4.0.2" + +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== +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" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" + 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" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-api-utils@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" + integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" + integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ== + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -tslib@^1.9.0: +ts-generator@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" + integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== + dependencies: + "@types/mkdirp" "^0.5.2" + "@types/prettier" "^2.1.1" + "@types/resolve" "^0.0.8" + chalk "^2.4.1" + glob "^7.1.2" + mkdirp "^0.5.1" + prettier "^2.1.2" + resolve "^1.8.1" + ts-essentials "^1.0.0" + +ts-node@^8.10.2: + version "8.10.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tslib@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.3.1, tslib@^2.6.2: + version "2.8.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" + integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +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" + 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" @@ -1454,64 +5202,103 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" + integrity sha512-pwZo7l1T0a8wmTMDc4FtXuHseRaqa9nyaUArp4xHaBMUlRzr72PvgF6ouXIIj5rjbVWqo8pZu6vw74jDKg4Dvw== + +type-detect@^4.0.0, type-detect@^4.0.3, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + 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" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typechain@^8.3.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typescript@^5.1.6: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + "@fastify/busboy" "^2.0.0" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - 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.10" +undici@^6.11.1: + version "6.20.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.20.1.tgz#fbb87b1e2b69d963ff2d5410a40ffb4c9e81b621" + integrity sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA== -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - 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" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== uri-js@^4.2.2: version "4.4.1" @@ -1520,45 +5307,148 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -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" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + +utf-8-validate@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" + integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== + dependencies: + node-gyp-build "^4.3.0" -which-boxed-primitive@^1.0.2: +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== + +util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +viem@^2.21.8: + version "2.21.32" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.32.tgz#b7f43b2004967036f83500260290cee45189f62a" + integrity sha512-2oXt5JNIb683oy7C8wuIJ/SeL3XtHVMEQpy1U2TA6WMnJQ4ScssRvyPwYLcaP6mKlrGXE/cR/V7ncWpvLUVPYQ== + dependencies: + "@adraffy/ens-normalize" "1.11.0" + "@noble/curves" "1.6.0" + "@noble/hashes" "1.5.0" + "@scure/bip32" "1.5.0" + "@scure/bip39" "1.4.0" + abitype "1.0.6" + isows "1.0.6" + webauthn-p256 "0.0.10" + ws "8.18.0" + +vscode-languageserver-textdocument@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== + +vscode-uri@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + 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" + +webauthn-p256@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.10.tgz#877e75abe8348d3e14485932968edf3325fd2fdd" + integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 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" + tr46 "~0.0.3" + webidl-conversions "^3.0.0" -which@^1.2.9: +which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +word-wrap@^1.2.5, word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + 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" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -1570,3 +5460,76 @@ write@1.0.3: integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" + +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaml@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3" + integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + 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" + 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" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==