diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index 2bb7248e..00000000
--- a/.editorconfig
+++ /dev/null
@@ -1,15 +0,0 @@
-# EditorConfig is awesome: https://EditorConfig.org
-
-# top-most EditorConfig file
-root = true
-
-[*]
-charset = utf-8
-end_of_line = lf
-indent_size = 2
-indent_style = space
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.sol]
-indent_size = 4
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 8012259e..00000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,47 +0,0 @@
-module.exports = {
- extends: [],
- parserOptions: { ecmaVersion: 2018 },
- root: true,
- rules: {
- 'prettier/prettier': ['error', { singleQuote: true }],
- 'sort-imports': [
- 'error',
- {
- ignoreCase: true,
- ignoreDeclarationSort: true,
- ignoreMemberSort: false,
- },
- ],
- 'import/no-unresolved': 'off',
- 'import/order': [
- 'error',
- {
- groups: ['builtin', 'external', 'internal'],
- 'newlines-between': 'always',
- },
- ],
- 'no-plusplus': 'off',
- 'no-undef': 'off',
- 'func-names': 'off',
- 'no-param-reassign': 'off',
- 'no-console': 'off',
- 'no-multi-str': 'off',
- 'no-unused-expressions': 'off',
- 'no-restricted-syntax': 'off',
- },
- overrides: [
- {
- files: ['test/**/*.spec.js'],
- env: {
- mocha: true,
- },
- globals: {
- artifacts: 'readonly',
- contract: 'readonly',
- },
- rules: {
- 'no-await-in-loop': 'off',
- },
- },
- ],
-};
diff --git a/.github/scripts/coverage.sh b/.github/scripts/coverage.sh
new file mode 100755
index 00000000..cc84f336
--- /dev/null
+++ b/.github/scripts/coverage.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+FAIL=0
+
+echo "Generating coverage report..."
+COVERAGE_OUTPUT=$(forge coverage --no-match-coverage "(test|script|dependencies|FormatResolver)" --report summary)
+
+# Display the coverage report
+echo "=== Coverage Report ==="
+echo "$COVERAGE_OUTPUT"
+echo "======================="
+
+TOTAL_LINE=$(echo "$COVERAGE_OUTPUT" | grep "| Total.*|")
+
+if [ -z "$TOTAL_LINE" ]; then
+ echo "❌ Could not find Total coverage line"
+ exit 1
+fi
+
+LINE_COV=$(echo "$TOTAL_LINE" | awk -F'|' '{print $3}' | grep -o '[0-9]*\.[0-9]*%' | sed 's/%//')
+STMT_COV=$(echo "$TOTAL_LINE" | awk -F'|' '{print $4}' | grep -o '[0-9]*\.[0-9]*%' | sed 's/%//')
+BRANCH_COV=$(echo "$TOTAL_LINE" | awk -F'|' '{print $5}' | grep -o '[0-9]*\.[0-9]*%' | sed 's/%//')
+FUNC_COV=$(echo "$TOTAL_LINE" | awk -F'|' '{print $6}' | grep -o '[0-9]*\.[0-9]*%' | sed 's/%//')
+
+if [ "$(echo "$LINE_COV < 100" | bc -l)" = "1" ]; then
+ echo "❌ Line coverage ($LINE_COV%) is below 100%"
+ FAIL=1
+fi
+
+if [ "$(echo "$STMT_COV < 100" | bc -l)" = "1" ]; then
+ echo "❌ Statement coverage ($STMT_COV%) is below 100%"
+ FAIL=1
+fi
+
+if [ "$(echo "$BRANCH_COV < 100" | bc -l)" = "1" ]; then
+ echo "❌ Branch coverage ($BRANCH_COV%) is below 100%"
+ FAIL=1
+fi
+
+if [ "$(echo "$FUNC_COV < 100" | bc -l)" = "1" ]; then
+ echo "❌ Function coverage ($FUNC_COV%) is below 100%"
+ FAIL=1
+fi
+
+if [ $FAIL = 1 ]; then
+ echo ""
+ echo "Coverage check failed! All metrics must be 100%"
+ exit 1
+else
+ echo "✅ Coverage requirements met!"
+fi
diff --git a/.github/workflows/foundry-gas-diff.yml b/.github/workflows/foundry-gas-diff.yml
new file mode 100644
index 00000000..9e6475f1
--- /dev/null
+++ b/.github/workflows/foundry-gas-diff.yml
@@ -0,0 +1,52 @@
+name: Report gas diff
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ paths:
+ - contracts/**
+ - .github/workflows/foundry-gas-diff.yml
+
+env:
+ HUSKY: 0
+ ALCHEMY_KEY: ${{ secrets.ALCHEMY_KEY }}
+
+jobs:
+ compare_gas_reports:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: stable
+
+ - name: Install dependencies
+ run: forge soldeer install
+
+ - name: Run tests
+ run: forge test --gas-report > gasreport.ansi
+ env:
+ FOUNDRY_FUZZ_SEED: 0x${{ github.event.pull_request.base.sha || github.sha }}
+
+ - name: Compare gas reports
+ uses: Rubilmax/foundry-gas-diff@v3
+ with:
+ summaryQuantile: 0.9
+ sortCriteria: avg,max
+ sortOrders: desc,asc
+ ignore: test/**/*
+ id: gas_diff
+
+ - name: Add gas diff to sticky comment
+ if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target'
+ uses: marocchino/sticky-pull-request-comment@v2
+ with:
+ # delete the comment in case changes no longer impact gas costs
+ delete: ${{ !steps.gas_diff.outputs.markdown }}
+ message: ${{ steps.gas_diff.outputs.markdown }}
diff --git a/.github/workflows/foundry.yml b/.github/workflows/foundry.yml
new file mode 100644
index 00000000..acc2d027
--- /dev/null
+++ b/.github/workflows/foundry.yml
@@ -0,0 +1,47 @@
+name: Foundry
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ workflow_dispatch:
+
+env:
+ HUSKY: 0
+ ALCHEMY_KEY: ${{ secrets.ALCHEMY_KEY }}
+
+jobs:
+ check:
+ strategy:
+ fail-fast: true
+
+ name: Foundry project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: stable
+
+ - name: Show Forge version
+ run: forge --version
+
+ - name: Install dependencies
+ run: forge soldeer install
+
+ - name: Run fmt
+ run: forge fmt --check
+
+ - name: Run build
+ run: forge build --sizes
+
+ - name: Run tests
+ run: forge test -vvv
+
+ - name: Run coverage
+ run: ./.github/scripts/coverage.sh
diff --git a/.github/workflows/publish-prerelease.yml b/.github/workflows/publish-prerelease.yml
deleted file mode 100644
index 3c08a55c..00000000
--- a/.github/workflows/publish-prerelease.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-name: Publish Beta Package
-
-on:
- release:
- types: [published]
-
-jobs:
- build:
- if: "github.event.release.prerelease"
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v3
- with:
- node-version: 16
- - run: npm ci
- - run: npm run build
-
- publish-gpr:
- needs: build
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v3
- with:
- node-version: 16
- registry-url: https://npm.pkg.github.com/
- scope: '@onchain-id'
- - run: npm ci
- - run: npm run build
- - run: npm publish --tag beta
- env:
- NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
-
- publish-npm:
- needs: build
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v3
- with:
- node-version: 16
- registry-url: https://registry.npmjs.org/
- scope: '@onchain-id'
- - run: npm ci
- - run: npm run build
- - run: npm publish --tag beta
- env:
- NODE_AUTH_TOKEN: ${{secrets.npm_token}}
diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml
deleted file mode 100644
index 3eb38acd..00000000
--- a/.github/workflows/publish-release.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-name: Publish Release Package
-
-on:
- release:
- types: [published]
-
-jobs:
- build:
- if: "!github.event.release.prerelease"
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v3
- with:
- node-version: 16
- - run: npm ci
- - run: npm run build
-
- publish-gpr:
- needs: build
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v3
- with:
- node-version: 16
- registry-url: https://npm.pkg.github.com/
- scope: '@onchain-id'
- - run: npm ci
- - run: npm run build
- - run: npm publish
- env:
- NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
-
- publish-npm:
- needs: build
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-node@v3
- with:
- node-version: 16
- registry-url: https://registry.npmjs.org/
- scope: '@onchain-id'
- - run: npm ci
- - run: npm run build
- - run: npm publish
- env:
- NODE_AUTH_TOKEN: ${{secrets.npm_token}}
diff --git a/.github/workflows/push_checking.yml b/.github/workflows/push_checking.yml
deleted file mode 100644
index 1be57ec5..00000000
--- a/.github/workflows/push_checking.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: Unit tests workflow
-on: push
-
-jobs:
-
- lint:
- name: "Lint"
- runs-on: ubuntu-latest
- container: node:16
-
- strategy:
- matrix:
- node-version: [16.x]
-
- steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- registry-url: https://npm.pkg.github.com/
- scope: '@tokenyico'
- - name: Install dependencies
- run: npm ci
- env:
- NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN_FOR_GPR}}
- - name: Lint sources
- run:
- npm run lint
-
-
- test:
- name: "Build and Test"
- runs-on: ubuntu-latest
- container: node:16
-
- strategy:
- matrix:
- node-version: [16.x]
-
- steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- registry-url: https://npm.pkg.github.com/
- scope: '@tokenyico'
- - name: Install dependencies
- run: npm ci
- env:
- NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN_FOR_GPR}}
- - name: Build application
- run: npm run build
- - name: Run tests
- run: npm run coverage
diff --git a/.gitignore b/.gitignore
index 2f8aad0a..4995de07 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,30 @@
+# Compiler files
+cache/
+out/
+coverage/
+coverage.json
+lcov.info
+typechain-types/
+artifacts/
+
+# Dependencies
+node_modules/
+
+# Ignores development broadcast logs
+!/broadcast
+/broadcast/*/31337/
+/broadcast/**/dry-run/
+
+# Docs
+docs/
+
# Logs
logs
*.log
-# Coverage
-coverage
-
-# Dependencies
-node_modules
-
# Build
build/
+gas-report.txt
# macOS
.DS_Store
@@ -18,8 +33,9 @@ build/
.idea
.vscode
-# Artifacts
-artifacts
-coverage.json
-cache
-typechain-types
+# Environment variables
+.env
+.env.local
+
+# Soldeer
+/dependencies
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100644
index 00000000..99b9bf1e
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname "$0")/_/h"
+
+npx commitlint --edit $1
\ No newline at end of file
diff --git a/.husky/post-checkout b/.husky/post-checkout
new file mode 100644
index 00000000..32d365c9
--- /dev/null
+++ b/.husky/post-checkout
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname "$0")/_/h"
+
+npm i
\ No newline at end of file
diff --git a/.husky/post-merge b/.husky/post-merge
new file mode 100644
index 00000000..32d365c9
--- /dev/null
+++ b/.husky/post-merge
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname "$0")/_/h"
+
+npm i
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000..d98b8fd2
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,3 @@
+STAGED_FILES=$(git diff --cached --name-only --diff-filter=d)
+forge fmt
+echo "$STAGED_FILES" | xargs -r git add
\ No newline at end of file
diff --git a/.solcover.js b/.solcover.js
deleted file mode 100644
index c48012f9..00000000
--- a/.solcover.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- skipFiles: [
- "_testContracts",
- ],
-};
diff --git a/.solhint.json b/.solhint.json
deleted file mode 100644
index 85c7185b..00000000
--- a/.solhint.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "extends": "solhint:recommended",
- "rules": {
- "compiler-version": ["error", "^0.8.17"],
- "func-visibility": ["warn", { "ignoreConstructors": true }],
- "reentrancy": "error",
- "state-visibility": "error",
- "quotes": ["error", "double"],
- "const-name-snakecase": "error",
- "contract-name-camelcase": "error",
- "event-name-camelcase": "error",
- "func-name-mixedcase": "error",
- "func-param-name-mixedcase": "error",
- "modifier-name-mixedcase": "error",
- "private-vars-leading-underscore": ["error", { "strict": false }],
- "use-forbidden-name": "error",
- "var-name-mixedcase": "error",
- "imports-on-top": "error",
- "ordering": "error",
- "visibility-modifier-order": "error",
- "code-complexity": ["error", 11],
- "function-max-lines": ["error", 50],
- "max-line-length": ["error", 130],
- "max-states-count": ["error", 15],
- "no-empty-blocks": "error",
- "no-unused-vars": "error",
- "payable-fallback": "error",
- "constructor-syntax": "error",
- "not-rely-on-time": "off",
- "reason-string": "off"
- },
- "plugins": ["prettier"]
-}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3969feae..64f3ac12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,20 @@
# Changelog
+
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [2.2.2]
+
+### Updated
+
+- changed solidity version from fixed to flexible (adding ^ before version) to allow using other compilation settings on contracts importing the interfaces
+
## [2.2.1]
### Changed
+
- Replaced the storage slot used for ImplementationAuthority on the proxies, to avoid conflict with ERC-1822 on
block explorers. By using the same storage slot, the explorers were identifying this proxy as an ERC-1822, while
it's a different implementation here, the storage slot is not used to store the address of the implementation but
@@ -15,24 +23,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2.2.0]
### Added
+
- Identities are now required to implement the standardized `function isClaimValid(IIdentity _identity, uint256
claimTopic, bytes calldata sig, bytes calldata data) external view returns (bool)`, used for self-attested claims
-(`_identity` is the address of the Identity contract).
+ (`_identity` is the address of the Identity contract).
- Implemented the `isClaimValid` function in the `Identity` contract.
- IdFactory now implements the `implementationAuthority()` getter.
## [2.1.0]
### Added
+
- Implemented a new contract `Gateway` to interact with the `IdFactory`. The `Gateway` contract allows individual
-accounts (being EOA or contracts) to deploy identities for their own address as a salt. To deploy using
-a custom salt, a signature from an approved signer is required.
+ accounts (being EOA or contracts) to deploy identities for their own address as a salt. To deploy using
+ a custom salt, a signature from an approved signer is required.
- Implemented a new base contract `Verifier` to be extended by contract requiring identity verification based on claims
-and trusted issuers.
+ and trusted issuers.
## [2.0.1]
### Added
+
- added method createIdentityWithManagementKeys() that allows the factory to issue identities with multiple
management keys.
- tests for the createIdentityWithManagementKeys() method
@@ -44,31 +55,40 @@ Version 2.0.0 Audited by Hacken, more details [here](https://tokeny.com/wp-conte
### Breaking changes
## Deprecation Notice
+
- ClaimIssuer `revokeClaim` is now deprecated, usage of `revokeClaimBySignature(bytes signature)` is preferred.
### Added
+
- Add typechain-types (targeting ethers v5).
- Add tests cases for `execute` and `approve` methods.
- Add method `revokeClaimBySignature(bytes signature)` in ClaimIssuer, prefer using this method instead of the now
-deprecated `revokeClaim` method.
+ deprecated `revokeClaim` method.
- Add checks on ClaimIssuer to prevent revoking an already revoked claim.
- Added Factory for ONCHAINIDs
### Updated
+
- Switch development tooling to hardhat.
- Implemented tests for hardhat (using fixture for faster testing time).
- Prevent calling `approve` method with a non-request execute nonce (added a require on `executionNone`).
- Update NatSpec of `execute` and `approve` methods.
## [1.4.0] - 2021-01-26
+
### Updated
+
- Remove constructor's visibility
## [1.3.0] - 2021-01-21
+
### Added
+
- Ownable 0.8.0
- Context 0.8.0
+
### Updated
+
- Update version to 1.3.0
- Update contracts to SOL =0.8.0
- Update test to work with truffle
@@ -76,27 +96,39 @@ deprecated `revokeClaim` method.
- Update solhint config
## [1.2.0] - 2020-11-27
+
### Added
+
- Custom Upgradable Proxy contract that behaves similarly to the [EIP-1822](https://eips.ethereum.org/EIPS/eip-1822): Universal Upgradeable Proxy Standard (UUPS), except that it points to an Authority contract which in itself points to an implementation (which can be updated).
- New ImplementationAuthority contract that acts as an authority for proxy contracts
- Library Lock contract to ensure no one can manipulate the Logic Contract once it is deployed
- Version contract that gives the versioning information of the implementation contract
+
### Moved
+
- variables in a separate contract (Storage.sol)
- structs in a separate contract (Structs.sol)
+
### Updated
+
- Update contracts to SOL =0.6.9
## [1.1.2] - 2020-09-30
+
### Fixed
+
- Add Constructor on ClaimIssuer Contract
## [1.1.1] - 2020-09-22
+
### Fixed
+
- Fix CI
## [1.1.0] - 2020-09-16
+
### Added
+
- ONCHAINID contract uses Proxy based on [EIP-1167](https://eips.ethereum.org/EIPS/eip-1167).
- New contracts,CloneFactory and IdentityFactory
- Github workflows actions
@@ -108,6 +140,7 @@ deprecated `revokeClaim` method.
- new Tests for Proxy behavior
### Changed
+
- Replaced Constructor by "Set" function on ERC734
- "Set" function is callable only once on ERC734
- Replaced Yarn by Npm
diff --git a/LICENSE.md b/LICENSE.md
index f288702d..a5eae152 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,190 +1,190 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
+Copyright (C) 2007 Free Software Foundation, Inc.
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
Preamble
- The GNU General Public License is a free, copyleft license for
+The GNU General Public License is a free, copyleft license for
software and other kinds of works.
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
+software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
+any other work released this way by its authors. You can apply it to
your programs, too.
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
- For example, if you distribute copies of such a program, whether
+For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
know their rights.
- Developers that use the GNU GPL protect your rights with two steps:
+Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
- Some devices are designed to deny users access to install or run
+Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
+use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
+products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
- Finally, every program is threatened constantly by software patents.
+Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
+make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
- The precise terms and conditions for copying, distribution and
+The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
- 0. Definitions.
+0. Definitions.
- "This License" refers to version 3 of the GNU General Public License.
+"This License" refers to version 3 of the GNU General Public License.
- "Copyright" also means copyright-like laws that apply to other kinds of
+"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
+"The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
- To "modify" a work means to copy from or adapt all or part of the work
+To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
+exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
- A "covered work" means either the unmodified Program or a work based
+A "covered work" means either the unmodified Program or a work based
on the Program.
- To "propagate" a work means to do anything with it that, without
+To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
+computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
+To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
- An interactive user interface displays "Appropriate Legal Notices"
+An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
+work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
- 1. Source Code.
+1. Source Code.
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
+The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
form of a work.
- A "Standard Interface" means an interface that either is an official
+A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
- The "System Libraries" of an executable work include anything, other
+The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
+implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
- The "Corresponding Source" for a work in object code form means all
+The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
+control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
+which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
- The Corresponding Source need not include anything that users
+The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
- The Corresponding Source for a work in source code form is that
+The Corresponding Source for a work in source code form is that
same work.
- 2. Basic Permissions.
+2. Basic Permissions.
- All rights granted under this License are granted for the term of
+All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
+content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
- You may make, run and propagate covered works that you do not
+You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
+in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
+not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
+Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+3. Protecting Users' Legal Rights From Anti-Circumvention Law.
- No covered work shall be deemed part of an effective technological
+No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
- When you convey a covered work, you waive any legal power to forbid
+When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
@@ -192,9 +192,9 @@ modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
- 4. Conveying Verbatim Copies.
+4. Conveying Verbatim Copies.
- You may convey verbatim copies of the Program's source code as you
+You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
@@ -202,12 +202,12 @@ non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
- You may charge any price or no price for each copy that you convey,
+You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
- 5. Conveying Modified Source Versions.
+5. Conveying Modified Source Versions.
- You may convey a work based on the Program, or the modifications to
+You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
@@ -232,19 +232,19 @@ terms of section 4, provided that you also meet all of these conditions:
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
- A compilation of a covered work with other separate and independent
+A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
+beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
- 6. Conveying Non-Source Forms.
+6. Conveying Non-Source Forms.
- You may convey a covered work in object code form under the terms
+You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
@@ -290,75 +290,75 @@ in one of these ways:
Source of the work are being offered to the general public at no
charge under subsection 6d.
- A separable portion of the object code, whose source code is excluded
+A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
- A "User Product" is either (1) a "consumer product", which means any
+A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
+actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
- "Installation Information" for a User Product means any methods,
+"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
+a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
- If you convey an object code work under this section in, or with, or
+If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
+by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
- The requirement to provide Installation Information does not include a
+The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
+the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
- Corresponding Source conveyed, and Installation Information provided,
+Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
- 7. Additional Terms.
+7. Additional Terms.
- "Additional permissions" are terms that supplement the terms of this
+"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
+that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
- When you convey a copy of a covered work, you may at your option
+When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
- Notwithstanding any other provision of this License, for material you
+Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
@@ -385,74 +385,74 @@ that material) supplement the terms of this License with terms:
any liability that these contractual assumptions directly impose on
those licensors and authors.
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
+All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
+restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
- If you add terms to a covered work in accord with this section, you
+If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
- Additional terms, permissive or non-permissive, may be stated in the
+Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
- 8. Termination.
+8. Termination.
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
- However, if you cease all violation of this License, then your
+However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
- Moreover, your license from a particular copyright holder is
+Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
- Termination of your rights under this section does not terminate the
+Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
+this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
- 9. Acceptance Not Required for Having Copies.
+9. Acceptance Not Required for Having Copies.
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
+You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
+to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
- 10. Automatic Licensing of Downstream Recipients.
+10. Automatic Licensing of Downstream Recipients.
- Each time you convey a covered work, the recipient automatically
+Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
+propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
- An "entity transaction" is a transaction transferring control of an
+An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
+organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
@@ -460,43 +460,43 @@ give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
- 11. Patents.
+11. Patents.
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
+A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
- A contributor's "essential patent claims" are all patent claims
+A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
+consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
- Each contributor grants you a non-exclusive, worldwide, royalty-free
+Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
- In the following three paragraphs, a "patent license" is any express
+In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
+sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
- If you convey a covered work, knowingly relying on a patent license,
+If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
@@ -504,13 +504,13 @@ then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
+license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
- If, pursuant to or in connection with a single transaction or
+If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
@@ -518,10 +518,10 @@ or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
- A patent license is "discriminatory" if it does not include within
+A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
+specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
@@ -533,73 +533,73 @@ for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
- Nothing in this License shall be construed as excluding or limiting
+Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
- 12. No Surrender of Others' Freedom.
+12. No Surrender of Others' Freedom.
- If conditions are imposed on you (whether by court order, agreement or
+If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
+excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
+not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
- 13. Use with the GNU Affero General Public License.
+13. Use with the GNU Affero General Public License.
- Notwithstanding any other provision of this License, you have
+Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
+combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
- 14. Revised Versions of this License.
+14. Revised Versions of this License.
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
+The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
- Each version is given a distinguishing version number. If the
+Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
+Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
- If the Program specifies that a proxy can decide which future
+If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
- 15. Disclaimer of Warranty.
+15. Disclaimer of Warranty.
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
- 16. Limitation of Liability.
+16. Limitation of Liability.
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
@@ -609,9 +609,9 @@ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
- 17. Interpretation of Sections 15 and 16.
+17. Interpretation of Sections 15 and 16.
- If the disclaimer of warranty and limitation of liability provided
+If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
@@ -622,11 +622,11 @@ copy of the Program in return for a fee.
How to Apply These Terms to Your New Programs
- If you develop a new program, and you want it to be of the greatest
+If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
- To do so, attach the following notices to the program. It is safest
+To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
@@ -649,7 +649,7 @@ the "copyright" line and a pointer to where the full notice is found.
Also add information on how to contact you by electronic and paper mail.
- If the program does terminal interaction, make it output a short
+If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Copyright (C)
@@ -658,17 +658,17 @@ notice like this when it starts in an interactive mode:
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
+parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
- You should also get your employer (if you work as a programmer) or school,
+You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
.
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
+The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
.
diff --git a/README.md b/README.md
index 9eaa5c05..6ded77d5 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-
----
+## 


@@ -8,6 +7,7 @@

---
+
# OnchainID Smart Contracts
Smart Contracts for secure Blockchain Identities, implementation of the ERC734 and ERC735 proposal standards.
@@ -19,11 +19,15 @@ Learn more about OnchainID and Blockchain Identities on the official OnchainID w
- Install contracts package to use in your repository `yarn add @onchain-id/solidity`
- Require desired contracts in-code (should you need to deploy them):
```javascript
- const { contracts: { ERC734, Identity } } = require('@onchain-id/solidity');
+ const {
+ contracts: { ERC734, Identity },
+ } = require("@onchain-id/solidity");
```
- Require desired interfaces in-code (should you need to interact with deployed contracts):
```javascript
- const { interfaces: { IERC734, IERC735 } } = require('@onchain-id/solidity');
+ const {
+ interfaces: { IERC734, IERC735 },
+ } = require("@onchain-id/solidity");
```
- Access contract ABI `ERC734.abi` and ByteCode `ERC734.bytecode`.
diff --git a/contracts/ClaimIssuer.sol b/contracts/ClaimIssuer.sol
index ac66bbf9..a08506fb 100644
--- a/contracts/ClaimIssuer.sol
+++ b/contracts/ClaimIssuer.sol
@@ -1,20 +1,56 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
-
-import "./interface/IClaimIssuer.sol";
-import "./Identity.sol";
-
-contract ClaimIssuer is IClaimIssuer, Identity {
- mapping (bytes => bool) public revokedClaims;
+pragma solidity ^0.8.27;
+
+import { IIdentity, Identity } from "./Identity.sol";
+import { IClaimIssuer } from "./interface/IClaimIssuer.sol";
+import { Errors } from "./libraries/Errors.sol";
+import { IdentityTypes } from "./libraries/IdentityTypes.sol";
+import { KeyPurposes } from "./libraries/KeyPurposes.sol";
+import { UUPSUpgradeable } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
+import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+
+/**
+ * @title ClaimIssuer
+ * @notice Extension of Identity that can issue, validate, and revoke claims for other identities.
+ * @dev Adds claim revocation tracking, claim issuance to external identities, and
+ * signature-based claim validation. Uses UUPS upgradeability for proxy deployments.
+ */
+contract ClaimIssuer is IClaimIssuer, Identity, UUPSUpgradeable {
+
+ /// @notice Tracks revoked claim signatures. True if the claim signature has been revoked.
+ mapping(bytes => bool) public revokedClaims;
+ /**
+ * @notice Constructor for direct deployments (non-proxy)
+ * @param initialManagementKey The initial management key for the ClaimIssuer
+ */
// solhint-disable-next-line no-empty-blocks
- constructor(address initialManagementKey) Identity(initialManagementKey, false) {}
+ constructor(address initialManagementKey) Identity(initialManagementKey, false) { }
+
+ /**
+ * @notice External initializer for proxy deployments
+ * @dev This function should be called when deploying ClaimIssuer through a proxy.
+ * The _identityType parameter is ignored — ClaimIssuer always sets type 5.
+ * @param initialManagementKey The initial management key for the ClaimIssuer
+ */
+ function initialize(
+ address initialManagementKey,
+ uint256 /* _identityType */
+ )
+ external
+ override
+ initializer
+ {
+ __UUPSUpgradeable_init();
+ _getClaimStorage().identityType = IdentityTypes.CLAIM_ISSUER;
+ __Identity_init(initialManagementKey);
+ }
/**
* @dev See {IClaimIssuer-revokeClaimBySignature}.
*/
function revokeClaimBySignature(bytes calldata signature) external override delegatedOnly onlyManager {
- require(!revokedClaims[signature], "Conflict: Claim already revoked");
+ require(!revokedClaims[signature], Errors.ClaimAlreadyRevoked());
revokedClaims[signature] = true;
@@ -24,59 +60,96 @@ contract ClaimIssuer is IClaimIssuer, Identity {
/**
* @dev See {IClaimIssuer-revokeClaim}.
*/
- function revokeClaim(bytes32 _claimId, address _identity) external override delegatedOnly onlyManager returns(bool) {
+ function revokeClaim(bytes32 _claimId, address _identity)
+ external
+ override
+ delegatedOnly
+ onlyManager
+ returns (bool)
+ {
uint256 foundClaimTopic;
uint256 scheme;
address issuer;
bytes memory sig;
bytes memory data;
- ( foundClaimTopic, scheme, issuer, sig, data, ) = Identity(_identity).getClaim(_claimId);
+ (foundClaimTopic, scheme, issuer, sig, data,) = Identity(_identity).getClaim(_claimId);
- require(!revokedClaims[sig], "Conflict: Claim already revoked");
+ require(!revokedClaims[sig], Errors.ClaimAlreadyRevoked());
revokedClaims[sig] = true;
emit ClaimRevoked(sig);
return true;
}
+ /**
+ * @dev See {IClaimIssuer-addClaimTo}.
+ */
+ function addClaimTo(
+ uint256 _topic,
+ uint256 _scheme,
+ bytes calldata _signature,
+ bytes calldata _data,
+ string calldata _uri,
+ IIdentity _identity
+ ) external delegatedOnly onlyManager {
+ require(isClaimValid(_identity, _topic, _signature, _data), Errors.InvalidClaim());
+
+ bytes memory addClaimData = abi.encodeWithSelector(
+ _identity.addClaim.selector, _topic, _scheme, address(this), _signature, _data, _uri
+ );
+
+ try _identity.execute(address(_identity), 0, addClaimData) { }
+ catch {
+ revert Errors.CallFailed();
+ }
+ emit ClaimAddedTo(address(_identity), _topic, _signature, _data);
+ }
+
/**
* @dev See {IClaimIssuer-isClaimValid}.
*/
- function isClaimValid(
- IIdentity _identity,
- uint256 claimTopic,
- bytes memory sig,
- bytes memory data)
- public override(Identity, IClaimIssuer) view returns (bool claimValid)
+ function isClaimValid(IIdentity _identity, uint256 claimTopic, bytes memory sig, bytes memory data)
+ public
+ view
+ override(Identity, IClaimIssuer)
+ returns (bool claimValid)
{
bytes32 dataHash = keccak256(abi.encode(_identity, claimTopic, data));
// Use abi.encodePacked to concatenate the message prefix and the message to sign.
bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash));
- // Recover address of data signer
- address recovered = getRecoveredAddress(sig, prefixedHash);
+ // Recover address of data signer using OpenZeppelin's ECDSA
+ (address recovered, ECDSA.RecoverError error,) = ECDSA.tryRecover(prefixedHash, sig);
+
+ // If recovery failed, return false
+ if (error != ECDSA.RecoverError.NoError) {
+ return false;
+ }
// Take hash of recovered address
bytes32 hashedAddr = keccak256(abi.encode(recovered));
- // Does the trusted identifier have they key which signed the user's claim?
- // && (isClaimRevoked(_claimId) == false)
- if (keyHasPurpose(hashedAddr, 3) && (isClaimRevoked(sig) == false)) {
- return true;
- }
-
- return false;
+ // Check if the recovered address has CLAIM_SIGNER purpose (CLAIM_ADDER cannot sign claims)
+ return keyHasPurpose(hashedAddr, KeyPurposes.CLAIM_SIGNER) && !isClaimRevoked(sig);
}
/**
* @dev See {IClaimIssuer-isClaimRevoked}.
*/
- function isClaimRevoked(bytes memory _sig) public override view returns (bool) {
- if (revokedClaims[_sig]) {
- return true;
- }
+ function isClaimRevoked(bytes memory _sig) public view override returns (bool) {
+ return revokedClaims[_sig];
+ }
- return false;
+ /**
+ * @dev Internal function to authorize the upgrade of the contract.
+ * This function is required by UUPSUpgradeable and restricts upgrades to management keys only.
+ *
+ * @param newImplementation The address of the new implementation contract
+ */
+ function _authorizeUpgrade(address newImplementation) internal override(UUPSUpgradeable) onlyManager {
+ // Only management keys can authorize upgrades
+ // This prevents unauthorized upgrades and potential security issues
}
+
}
diff --git a/contracts/Identity.sol b/contracts/Identity.sol
index 335594fa..18f6f412 100644
--- a/contracts/Identity.sol
+++ b/contracts/Identity.sol
@@ -1,45 +1,93 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
-
-import "./interface/IIdentity.sol";
-import "./interface/IClaimIssuer.sol";
-import "./version/Version.sol";
-import "./storage/Storage.sol";
+pragma solidity ^0.8.27;
+
+import { KeyManager } from "./KeyManager.sol";
+import { IClaimIssuer } from "./interface/IClaimIssuer.sol";
+import { IERC734 } from "./interface/IERC734.sol";
+import { IERC735 } from "./interface/IERC735.sol";
+import { IIdentity } from "./interface/IIdentity.sol";
+import { Errors } from "./libraries/Errors.sol";
+import { KeyPurposes } from "./libraries/KeyPurposes.sol";
+import { Structs } from "./storage/Structs.sol";
+import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+import { MulticallUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol";
+import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
+import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
/**
+ * @title Identity
* @dev Implementation of the `IERC734` "KeyHolder" and the `IERC735` "ClaimHolder" interfaces
* into a common Identity Contract.
- * This implementation has a separate contract were it declares all storage,
- * allowing for it to be used as an upgradable logic contract.
+ *
+ * This implementation uses ERC-7201 storage slots for upgradeability, providing:
+ * - O(1) key and claim management operations via EnumerableSet
+ * - Separation of key and claim storage for better organization
+ * - Upgradeable version management through ERC-7201 storage slots
+ *
+ * The contract supports four key purposes:
+ * - MANAGEMENT: Keys that can manage the identity
+ * - ACTION: Keys that can perform actions on behalf of the identity
+ * - CLAIM_SIGNER: Keys that can sign claims for other identities
+ * - ENCRYPTION: Keys used for data encryption
+ *
+ * @custom:security This contract uses ERC-7201 storage slots to prevent storage collision attacks
+ * in upgradeable contracts.
*/
-contract Identity is Storage, IIdentity, Version {
+contract Identity is Initializable, IIdentity, KeyManager, MulticallUpgradeable {
+
+ using EnumerableSet for EnumerableSet.Bytes32Set;
/**
- * @notice Prevent any direct calls to the implementation contract (marked by _canInteract = false).
+ * @dev Storage struct for claim management data
+ * @custom:storage-location erc7201:onchainid.identity.claim.storage
*/
- modifier delegatedOnly() {
- require(_canInteract == true, "Interacting with the library contract is forbidden.");
- _;
+ struct ClaimStorage {
+ /// @dev Mapping of claim ID to Claim struct as defined by IERC735
+ mapping(bytes32 => Structs.Claim) claims;
+ /// @dev Identity type as defined in IdentityTypes library
+ uint256 identityType;
+ /// @dev Mapping of topic to set of claim IDs (EnumerableSet for O(1) add/remove/contains)
+ mapping(uint256 => EnumerableSet.Bytes32Set) claimsByTopic;
}
/**
- * @notice requires management key to call this function, or internal call
+ * @dev ERC-7201 Storage Slot for claim management data
+ * This slot ensures no storage collision between different versions of the contract
+ *
+ * Formula: keccak256(abi.encode(uint256(keccak256(bytes(id))) - 1)) & ~bytes32(uint256(0xff))
+ * where id is the namespace identifier
*/
- modifier onlyManager() {
- require(msg.sender == address(this) || keyHasPurpose(keccak256(abi.encode(msg.sender)), 1)
- , "Permissions: Sender does not have management key");
+ bytes32 internal constant _CLAIM_STORAGE_SLOT = keccak256(
+ abi.encode(uint256(keccak256(bytes("onchainid.identity.claim.storage"))) - 1)
+ ) & ~bytes32(uint256(0xff));
+
+ // Key management functionality is inherited from KeyManager contract
+
+ // ========= Modifiers =========
+
+ /// @notice requires claim key (CLAIM_SIGNER or CLAIM_ADDER) to call this function, or internal call
+ modifier onlyClaimKey() {
+ require(
+ msg.sender == address(this) || keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.CLAIM_SIGNER)
+ || keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.CLAIM_ADDER),
+ Errors.SenderDoesNotHaveClaimSignerKey()
+ );
_;
}
- /**
- * @notice requires claim key to call this function, or internal call
- */
- modifier onlyClaimKey() {
- require(msg.sender == address(this) || keyHasPurpose(keccak256(abi.encode(msg.sender)), 3)
- , "Permissions: Sender does not have claim signer key");
+ /// @notice requires CLAIM_SIGNER key to call this function, or internal call
+ /// @dev CLAIM_ADDER keys are excluded — they can add but not remove claims
+ modifier onlyClaimSignerKey() {
+ require(
+ msg.sender == address(this) || keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.CLAIM_SIGNER),
+ Errors.SenderDoesNotHaveClaimSignerKey()
+ );
_;
}
+ // ========= Constructor =========
+
/**
* @notice constructor of the Identity contract
* @param initialManagementKey the address of the management key at deployment
@@ -47,298 +95,83 @@ contract Identity is Storage, IIdentity, Version {
* calls __Identity_init if contract is not library
*/
constructor(address initialManagementKey, bool _isLibrary) {
- require(initialManagementKey != address(0), "invalid argument - zero address");
-
if (!_isLibrary) {
__Identity_init(initialManagementKey);
} else {
- _initialized = true;
+ _getKeyStorage().initialized = true;
}
}
/**
* @notice When using this contract as an implementation for a proxy, call this initializer with a delegatecall.
- *
+ * @dev This function initializes the contract and sets up the initial management key and identity type.
* @param initialManagementKey The ethereum address to be set as the management key of the ONCHAINID.
+ * @param _identityType The type of the identity.
*/
- function initialize(address initialManagementKey) external {
- require(initialManagementKey != address(0), "invalid argument - zero address");
+ function initialize(address initialManagementKey, uint256 _identityType) external virtual initializer {
+ _getClaimStorage().identityType = _identityType;
__Identity_init(initialManagementKey);
}
/**
- * @dev See {IERC734-execute}.
- * @notice Passes an execution instruction to the keymanager.
- * If the sender is an ACTION key and the destination address is not the identity contract itself, then the
- * execution is immediately approved and performed.
- * If the destination address is the identity itself, then the execution would be performed immediately only if
- * the sender is a MANAGEMENT key.
- * Otherwise the execution request must be approved via the `approve` method.
- * @return executionId to use in the approve function, to approve or reject this execution.
+ * @dev See {IERC735-getClaimIdsByTopic}.
+ * * @notice Implementation of the getClaimIdsByTopic function from the ERC-735 standard.
+ * used to get all the claims from the specified topic
+ * @param _topic The identity of the claim i.e. keccak256(abi.encode(_issuer, _topic))
+ * @return claimIds Returns an array of claim IDs by topic.
*/
- function execute(address _to, uint256 _value, bytes memory _data)
- external
- delegatedOnly
- override
- payable
- returns (uint256 executionId)
- {
- uint256 _executionId = _executionNonce;
- _executions[_executionId].to = _to;
- _executions[_executionId].value = _value;
- _executions[_executionId].data = _data;
- _executionNonce++;
-
- emit ExecutionRequested(_executionId, _to, _value, _data);
-
- if (keyHasPurpose(keccak256(abi.encode(msg.sender)), 1)) {
- approve(_executionId, true);
- }
- else if (_to != address(this) && keyHasPurpose(keccak256(abi.encode(msg.sender)), 2)){
- approve(_executionId, true);
- }
-
- return _executionId;
+ function getClaimIdsByTopic(uint256 _topic) external view override(IERC735) returns (bytes32[] memory claimIds) {
+ return _getClaimStorage().claimsByTopic[_topic].values();
}
/**
- * @dev See {IERC734-getKey}.
- * @notice Implementation of the getKey function from the ERC-734 standard
- * @param _key The public key. for non-hex and long keys, its the Keccak256 hash of the key
- * @return purposes Returns the full key data, if present in the identity.
- * @return keyType Returns the full key data, if present in the identity.
- * @return key Returns the full key data, if present in the identity.
+ * @dev Returns the identity type set at initialization.
+ * @return The identity type as defined in IdentityTypes library
*/
- function getKey(bytes32 _key)
- external
- override
- view
- returns(uint256[] memory purposes, uint256 keyType, bytes32 key)
- {
- return (_keys[_key].purposes, _keys[_key].keyType, _keys[_key].key);
+ function getIdentityType() external view returns (uint256) {
+ return _getClaimStorage().identityType;
}
/**
- * @dev See {IERC734-getKeyPurposes}.
- * @notice gets the purposes of a key
- * @param _key The public key. for non-hex and long keys, its the Keccak256 hash of the key
- * @return _purposes Returns the purposes of the specified key
- */
- function getKeyPurposes(bytes32 _key)
- external
- override
- view
- returns(uint256[] memory _purposes)
- {
- return (_keys[_key].purposes);
- }
-
- /**
- * @dev See {IERC734-getKeysByPurpose}.
- * @notice gets all the keys with a specific purpose from an identity
- * @param _purpose a uint256[] Array of the key types, like 1 = MANAGEMENT, 2 = ACTION, 3 = CLAIM, 4 = ENCRYPTION
- * @return keys Returns an array of public key bytes32 hold by this identity and having the specified purpose
- */
- function getKeysByPurpose(uint256 _purpose)
- external
- override
- view
- returns(bytes32[] memory keys)
- {
- return _keysByPurpose[_purpose];
- }
-
- /**
- * @dev See {IERC735-getClaimIdsByTopic}.
- * @notice Implementation of the getClaimIdsByTopic function from the ERC-735 standard.
- * used to get all the claims from the specified topic
- * @param _topic The identity of the claim i.e. keccak256(abi.encode(_issuer, _topic))
- * @return claimIds Returns an array of claim IDs by topic.
- */
- function getClaimIdsByTopic(uint256 _topic)
- external
- override
- view
- returns(bytes32[] memory claimIds)
- {
- return _claimsByTopic[_topic];
- }
-
- /**
- * @notice implementation of the addKey function of the ERC-734 standard
- * Adds a _key to the identity. The _purpose specifies the purpose of key. Initially we propose four purposes:
- * 1: MANAGEMENT keys, which can manage the identity
- * 2: ACTION keys, which perform actions in this identities name (signing, logins, transactions, etc.)
- * 3: CLAIM signer keys, used to sign claims on other identities which need to be revokable.
- * 4: ENCRYPTION keys, used to encrypt data e.g. hold in claims.
- * MUST only be done by keys of purpose 1, or the identity itself.
- * If its the identity itself, the approval process will determine its approval.
- * @param _key keccak256 representation of an ethereum address
- * @param _type type of key used, which would be a uint256 for different key types. e.g. 1 = ECDSA, 2 = RSA, etc.
- * @param _purpose a uint256 specifying the key type, like 1 = MANAGEMENT, 2 = ACTION, 3 = CLAIM, 4 = ENCRYPTION
- * @return success Returns TRUE if the addition was successful and FALSE if not
- */
- function addKey(bytes32 _key, uint256 _purpose, uint256 _type)
- public
- delegatedOnly
- onlyManager
- override
- returns (bool success)
- {
- if (_keys[_key].key == _key) {
- uint256[] memory _purposes = _keys[_key].purposes;
- for (uint keyPurposeIndex = 0; keyPurposeIndex < _purposes.length; keyPurposeIndex++) {
- uint256 purpose = _purposes[keyPurposeIndex];
-
- if (purpose == _purpose) {
- revert("Conflict: Key already has purpose");
- }
- }
-
- _keys[_key].purposes.push(_purpose);
- } else {
- _keys[_key].key = _key;
- _keys[_key].purposes = [_purpose];
- _keys[_key].keyType = _type;
- }
-
- _keysByPurpose[_purpose].push(_key);
-
- emit KeyAdded(_key, _purpose, _type);
-
- return true;
- }
-
- /**
- * @dev See {IERC734-approve}.
- * @notice Approves an execution.
- * If the sender is an ACTION key and the destination address is not the identity contract itself, then the
- * approval is authorized and the operation would be performed.
- * If the destination address is the identity itself, then the execution would be authorized and performed only
- * if the sender is a MANAGEMENT key.
+ * @dev Returns the current version of the contract.
+ * @return The version string
*/
- function approve(uint256 _id, bool _approve)
- public
- delegatedOnly
- override
- returns (bool success)
- {
- require(_id < _executionNonce, "Cannot approve a non-existing execution");
- require(!_executions[_id].executed, "Request already executed");
-
- if(_executions[_id].to == address(this)) {
- require(keyHasPurpose(keccak256(abi.encode(msg.sender)), 1), "Sender does not have management key");
- }
- else {
- require(keyHasPurpose(keccak256(abi.encode(msg.sender)), 2), "Sender does not have action key");
- }
-
- emit Approved(_id, _approve);
-
- if (_approve == true) {
- _executions[_id].approved = true;
-
- // solhint-disable-next-line avoid-low-level-calls
- (success,) = _executions[_id].to.call{value:(_executions[_id].value)}(_executions[_id].data);
-
- if (success) {
- _executions[_id].executed = true;
-
- emit Executed(
- _id,
- _executions[_id].to,
- _executions[_id].value,
- _executions[_id].data
- );
-
- return true;
- } else {
- emit ExecutionFailed(
- _id,
- _executions[_id].to,
- _executions[_id].value,
- _executions[_id].data
- );
-
- return false;
- }
- } else {
- _executions[_id].approved = false;
- }
- return false;
+ function version() external pure virtual returns (string memory) {
+ return "3.0.0";
}
/**
- * @dev See {IERC734-removeKey}.
- * @notice Remove the purpose from a key.
- */
- function removeKey(bytes32 _key, uint256 _purpose)
- public
- delegatedOnly
- onlyManager
- override
- returns (bool success)
- {
- require(_keys[_key].key == _key, "NonExisting: Key isn't registered");
- uint256[] memory _purposes = _keys[_key].purposes;
-
- uint purposeIndex = 0;
- while (_purposes[purposeIndex] != _purpose) {
- purposeIndex++;
-
- if (purposeIndex == _purposes.length) {
- revert("NonExisting: Key doesn't have such purpose");
- }
- }
-
- _purposes[purposeIndex] = _purposes[_purposes.length - 1];
- _keys[_key].purposes = _purposes;
- _keys[_key].purposes.pop();
-
- uint keyIndex = 0;
- uint arrayLength = _keysByPurpose[_purpose].length;
-
- while (_keysByPurpose[_purpose][keyIndex] != _key) {
- keyIndex++;
-
- if (keyIndex >= arrayLength) {
- break;
- }
- }
-
- _keysByPurpose[_purpose][keyIndex] = _keysByPurpose[_purpose][arrayLength - 1];
- _keysByPurpose[_purpose].pop();
-
- uint keyType = _keys[_key].keyType;
-
- if (_purposes.length - 1 == 0) {
- delete _keys[_key];
- }
-
- emit KeyRemoved(_key, _purpose, keyType);
-
- return true;
+ * @dev See {IERC165-supportsInterface}.
+ * * @notice Returns true if this contract implements the interface defined by interfaceId
+ * @param interfaceId The interface identifier, as specified in ERC-165
+ * @return true if the interface is supported, false otherwise
+ */
+ function supportsInterface(bytes4 interfaceId) external pure returns (bool) {
+ return (interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC734).interfaceId
+ || interfaceId == type(IERC735).interfaceId || interfaceId == type(IIdentity).interfaceId);
}
/**
- * @dev See {IERC735-addClaim}.
- * @notice Implementation of the addClaim function from the ERC-735 standard
- * Require that the msg.sender has claim signer key.
- *
- * @param _topic The type of claim
- * @param _scheme The scheme with which this claim SHOULD be verified or how it should be processed.
- * @param _issuer The issuers identity contract address, or the address used to sign the above signature.
- * @param _signature Signature which is the proof that the claim issuer issued a claim of topic for this identity.
- * it MUST be a signed message of the following structure:
- * keccak256(abi.encode(address identityHolder_address, uint256 _ topic, bytes data))
- * @param _data The hash of the claim data, sitting in another
- * location, a bit-mask, call data, or actual data based on the claim scheme.
- * @param _uri The location of the claim, this can be HTTP links, swarm hashes, IPFS hashes, and such.
- *
- * @return claimRequestId Returns claimRequestId: COULD be
- * send to the approve function, to approve or reject this claim.
- * triggers ClaimAdded event.
- */
+ * @dev See {IERC735-addClaim}.
+ * @notice Adds or updates a claim for this identity.
+ *
+ * Uses EnumerableSet for O(1) claim existence checks and management.
+ *
+ * Claim validation:
+ * - If the issuer is not the identity itself, the claim must be validated by the issuer
+ * - Self-issued claims are automatically valid
+ * - The signature must follow the structure: keccak256(abi.encode(identityHolder_address, topic, data))
+ *
+ * Access control: Only CLAIM_SIGNER keys can add claims.
+ *
+ * @param _topic The type/category of the claim
+ * @param _scheme The verification scheme for the claim (ECDSA, RSA, etc.)
+ * @param _issuer The address of the claim issuer (can be the identity itself)
+ * @param _signature The cryptographic proof that the issuer authorized this claim
+ * @param _data The claim data or hash of the claim data
+ * @param _uri The location of additional claim data (HTTP, IPFS, etc.)
+ * @return claimRequestId The unique identifier for this claim
+ */
function addClaim(
uint256 _topic,
uint256 _scheme,
@@ -346,150 +179,101 @@ contract Identity is Storage, IIdentity, Version {
bytes memory _signature,
bytes memory _data,
string memory _uri
- )
- public
- delegatedOnly
- onlyClaimKey
- override
- returns (bytes32 claimRequestId)
- {
- if (_issuer != address(this)) {
- require(IClaimIssuer(_issuer).isClaimValid(IIdentity(address(this)), _topic, _signature, _data), "invalid claim");
- }
+ ) public delegatedOnly onlyClaimKey returns (bytes32 claimRequestId) {
+ // 1. Validate claim if issuer is not self
+ require(
+ IClaimIssuer(_issuer).isClaimValid(IIdentity(address(this)), _topic, _signature, _data),
+ Errors.InvalidClaim()
+ );
+ ClaimStorage storage cs = _getClaimStorage();
bytes32 claimId = keccak256(abi.encode(_issuer, _topic));
- _claims[claimId].topic = _topic;
- _claims[claimId].scheme = _scheme;
- _claims[claimId].signature = _signature;
- _claims[claimId].data = _data;
- _claims[claimId].uri = _uri;
-
- if (_claims[claimId].issuer != _issuer) {
- _claimsByTopic[_topic].push(claimId);
- _claims[claimId].issuer = _issuer;
+ cs.claims[claimId] = Structs.Claim({
+ topic: _topic, scheme: _scheme, issuer: _issuer, signature: _signature, data: _data, uri: _uri
+ });
+ // 2. New claim or update existing
+ if (cs.claimsByTopic[_topic].add(claimId)) {
emit ClaimAdded(claimId, _topic, _scheme, _issuer, _signature, _data, _uri);
- }
- else {
+ } else {
emit ClaimChanged(claimId, _topic, _scheme, _issuer, _signature, _data, _uri);
}
+
return claimId;
}
/**
- * @dev See {IERC735-removeClaim}.
- * @notice Implementation of the removeClaim function from the ERC-735 standard
- * Require that the msg.sender has management key.
- * Can only be removed by the claim issuer, or the claim holder itself.
- *
- * @param _claimId The identity of the claim i.e. keccak256(abi.encode(_issuer, _topic))
- *
- * @return success Returns TRUE when the claim was removed.
- * triggers ClaimRemoved event
- */
+ * @dev See {IERC735-removeClaim}.
+ * @notice Removes a claim from this identity.
+ *
+ * Uses EnumerableSet for O(1) add/remove/contains operations.
+ *
+ * Access control: Only CLAIM_SIGNER keys can remove claims.
+ *
+ * @param _claimId The unique identifier of the claim (keccak256(abi.encode(issuer, topic)))
+ * @return success True if the claim was successfully removed
+ *
+ */
function removeClaim(bytes32 _claimId)
- public
- delegatedOnly
- onlyClaimKey
- override
- returns
- (bool success) {
- uint256 _topic = _claims[_claimId].topic;
- if (_topic == 0) {
- revert("NonExisting: There is no claim with this ID");
- }
+ public
+ override(IERC735)
+ delegatedOnly
+ onlyClaimSignerKey
+ returns (bool success)
+ {
+ ClaimStorage storage cs = _getClaimStorage();
- uint claimIndex = 0;
- uint arrayLength = _claimsByTopic[_topic].length;
- while (_claimsByTopic[_topic][claimIndex] != _claimId) {
- claimIndex++;
+ // 1. Validate claim exists and get topic
+ Structs.Claim storage c = cs.claims[_claimId];
+ uint256 topic = c.topic;
+ require(topic != 0, Errors.ClaimNotRegistered(_claimId));
- if (claimIndex >= arrayLength) {
- break;
- }
- }
+ // 2. Remove claim from topic set
+ cs.claimsByTopic[topic].remove(_claimId);
- _claimsByTopic[_topic][claimIndex] =
- _claimsByTopic[_topic][arrayLength - 1];
- _claimsByTopic[_topic].pop();
-
- emit ClaimRemoved(
- _claimId,
- _topic,
- _claims[_claimId].scheme,
- _claims[_claimId].issuer,
- _claims[_claimId].signature,
- _claims[_claimId].data,
- _claims[_claimId].uri
- );
+ // 3. Emit event with claim details before deletion
+ emit ClaimRemoved(_claimId, topic, c.scheme, c.issuer, c.signature, c.data, c.uri);
- delete _claims[_claimId];
+ // 4. Clean up the claim data
+ delete cs.claims[_claimId];
return true;
}
/**
- * @dev See {IERC735-getClaim}.
- * @notice Implementation of the getClaim function from the ERC-735 standard.
- *
- * @param _claimId The identity of the claim i.e. keccak256(abi.encode(_issuer, _topic))
- *
- * @return topic Returns all the parameters of the claim for the
- * specified _claimId (topic, scheme, signature, issuer, data, uri) .
- * @return scheme Returns all the parameters of the claim for the
- * specified _claimId (topic, scheme, signature, issuer, data, uri) .
- * @return issuer Returns all the parameters of the claim for the
- * specified _claimId (topic, scheme, signature, issuer, data, uri) .
- * @return signature Returns all the parameters of the claim for the
- * specified _claimId (topic, scheme, signature, issuer, data, uri) .
- * @return data Returns all the parameters of the claim for the
- * specified _claimId (topic, scheme, signature, issuer, data, uri) .
- * @return uri Returns all the parameters of the claim for the
- * specified _claimId (topic, scheme, signature, issuer, data, uri) .
- */
+ * @dev See {IERC735-getClaim}.
+ * @notice Implementation of the getClaim function from the ERC-735 standard.
+ *
+ * @param _claimId The identity of the claim i.e. keccak256(abi.encode(_issuer, _topic))
+ *
+ * @return topic Returns all the parameters of the claim for the
+ * specified _claimId (topic, scheme, signature, issuer, data, uri) .
+ * @return scheme Returns all the parameters of the claim for the
+ * specified _claimId (topic, scheme, signature, issuer, data, uri) .
+ * @return issuer Returns all the parameters of the claim for the
+ * specified _claimId (topic, scheme, signature, issuer, data, uri) .
+ * @return signature Returns all the parameters of the claim for the
+ * specified _claimId (topic, scheme, signature, issuer, data, uri) .
+ * @return data Returns all the parameters of the claim for the
+ * specified _claimId (topic, scheme, signature, issuer, data, uri) .
+ * @return uri Returns all the parameters of the claim for the
+ * specified _claimId (topic, scheme, signature, issuer, data, uri) .
+ */
function getClaim(bytes32 _claimId)
- public
- override
- view
- returns(
- uint256 topic,
- uint256 scheme,
- address issuer,
- bytes memory signature,
- bytes memory data,
- string memory uri
- )
+ public
+ view
+ override(IERC735)
+ returns (
+ uint256 topic,
+ uint256 scheme,
+ address issuer,
+ bytes memory signature,
+ bytes memory data,
+ string memory uri
+ )
{
- return (
- _claims[_claimId].topic,
- _claims[_claimId].scheme,
- _claims[_claimId].issuer,
- _claims[_claimId].signature,
- _claims[_claimId].data,
- _claims[_claimId].uri
- );
- }
-
- /**
- * @dev See {IERC734-keyHasPurpose}.
- * @notice Returns true if the key has MANAGEMENT purpose or the specified purpose.
- */
- function keyHasPurpose(bytes32 _key, uint256 _purpose)
- public
- override
- view
- returns(bool result)
- {
- Key memory key = _keys[_key];
- if (key.key == 0) return false;
-
- for (uint keyPurposeIndex = 0; keyPurposeIndex < key.purposes.length; keyPurposeIndex++) {
- uint256 purpose = key.purposes[keyPurposeIndex];
-
- if (purpose == 1 || purpose == _purpose) return true;
- }
-
- return false;
+ Structs.Claim storage claim = _getClaimStorage().claims[_claimId];
+ return (claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
}
/**
@@ -502,98 +286,63 @@ contract Identity is Storage, IIdentity, Version {
* @param data the data field of the claim
* @return claimValid true if the claim is valid, false otherwise
*/
- function isClaimValid(
- IIdentity _identity,
- uint256 claimTopic,
- bytes memory sig,
- bytes memory data)
- public override virtual view returns (bool claimValid)
+ function isClaimValid(IIdentity _identity, uint256 claimTopic, bytes memory sig, bytes memory data)
+ public
+ view
+ virtual
+ override
+ returns (bool claimValid)
{
+ // Step 1: Create the data hash that was signed
bytes32 dataHash = keccak256(abi.encode(_identity, claimTopic, data));
- // Use abi.encodePacked to concatenate the message prefix and the message to sign.
- bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash));
-
- // Recover address of data signer
- address recovered = getRecoveredAddress(sig, prefixedHash);
-
- // Take hash of recovered address
- bytes32 hashedAddr = keccak256(abi.encode(recovered));
-
- // Does the trusted identifier have they key which signed the user's claim?
- // && (isClaimRevoked(_claimId) == false)
- if (keyHasPurpose(hashedAddr, 3)) {
- return true;
- }
- return false;
- }
-
- /**
- * @dev returns the address that signed the given data
- * @param sig the signature of the data
- * @param dataHash the data that was signed
- * returns the address that signed dataHash and created the signature sig
- */
- function getRecoveredAddress(bytes memory sig, bytes32 dataHash)
- public
- pure
- returns (address addr)
- {
- bytes32 ra;
- bytes32 sa;
- uint8 va;
-
- // Check the signature length
- if (sig.length != 65) {
- return address(0);
- }
+ // Step 2: Add Ethereum signature prefix for EIP-191 compliance
+ bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash));
- // Divide the signature in r, s and v variables
- // solhint-disable-next-line no-inline-assembly
- assembly {
- ra := mload(add(sig, 32))
- sa := mload(add(sig, 64))
- va := byte(0, mload(add(sig, 96)))
- }
+ // Step 3: Recover the signer's address from the signature using OpenZeppelin's ECDSA
+ (address recovered, ECDSA.RecoverError error,) = ECDSA.tryRecover(prefixedHash, sig);
- if (va < 27) {
- va += 27;
+ // If recovery failed, return false
+ if (error != ECDSA.RecoverError.NoError) {
+ return false;
}
- address recoveredAddress = ecrecover(dataHash, va, ra, sa);
+ // Step 4: Hash the recovered address for key lookup
+ bytes32 hashedAddr = keccak256(abi.encode(recovered));
- return (recoveredAddress);
+ // Step 5: Check if the recovered address has CLAIM_SIGNER purpose (CLAIM_ADDER cannot sign claims)
+ return keyHasPurpose(hashedAddr, KeyPurposes.CLAIM_SIGNER);
}
/**
* @notice Initializer internal function for the Identity contract.
*
+ * @dev This function sets up the initial management key and initializes all
+ * storage mappings including the new index mappings for efficient key management.
* @param initialManagementKey The ethereum address to be set as the management key of the ONCHAINID.
*/
// solhint-disable-next-line func-name-mixedcase
function __Identity_init(address initialManagementKey) internal {
- require(!_initialized || _isConstructor(), "Initial key was already setup.");
- _initialized = true;
- _canInteract = true;
-
- bytes32 _key = keccak256(abi.encode(initialManagementKey));
- _keys[_key].key = _key;
- _keys[_key].purposes = [1];
- _keys[_key].keyType = 1;
- _keysByPurpose[1].push(_key);
- emit KeyAdded(_key, 1, 1);
+ require(initialManagementKey != address(0), Errors.ZeroAddress());
+ KeyStorage storage ks = _getKeyStorage();
+ require(!ks.initialized, Errors.InitialKeyAlreadySetup());
+ ks.initialized = true;
+ ks.canInteract = true;
+
+ _setupInitialManagementKey(initialManagementKey);
}
+ // ========= Internal (non-view/pure) =========
+
/**
- * @notice Computes if the context in which the function is called is a constructor or not.
- *
- * @return true if the context is a constructor.
+ * @dev Returns the claim storage struct at the specified ERC-7201 slot
+ * @return s The ClaimStorage struct pointer for the claim management slot
*/
- function _isConstructor() private view returns (bool) {
- address self = address(this);
- uint256 cs;
- // solhint-disable-next-line no-inline-assembly
- assembly { cs := extcodesize(self) }
- return cs == 0;
+ function _getClaimStorage() internal pure returns (ClaimStorage storage s) {
+ bytes32 slot = _CLAIM_STORAGE_SLOT;
+ assembly {
+ s.slot := slot
+ }
}
+
}
diff --git a/contracts/IdentityUtilities.sol b/contracts/IdentityUtilities.sol
new file mode 100644
index 00000000..47666310
--- /dev/null
+++ b/contracts/IdentityUtilities.sol
@@ -0,0 +1,245 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity 0.8.27;
+
+import { IClaimIssuer } from "./interface/IClaimIssuer.sol";
+import { IIdentity } from "./interface/IIdentity.sol";
+import { IIdentityUtilities } from "./interface/IIdentityUtilities.sol";
+import { AccessControlUpgradeable } from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
+import { UUPSUpgradeable } from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
+
+/**
+ * @title IdentityUtilities
+ * @notice Contract for registering and retrieving structured topic schemas using encoded string arrays.
+ * @dev Inherits from AccessControl and supports UUPS upgrades. Topics define field names and types
+ * using ABI-encoded `string[]` arrays.
+ */
+contract IdentityUtilities is IIdentityUtilities, AccessControlUpgradeable, UUPSUpgradeable {
+
+ /// @notice Role identifier for accounts allowed to manage topics
+ bytes32 public constant TOPIC_MANAGER_ROLE = keccak256("TOPIC_MANAGER_ROLE");
+
+ /// @dev Mapping from topic ID to TopicInfo struct
+ mapping(uint256 => TopicInfo) private _topics;
+
+ /// @notice Disables initializers on the implementation contract
+ constructor() {
+ _disableInitializers();
+ }
+
+ /**
+ * @notice Initializes the contract and sets the admin and topic manager roles.
+ * @param admin Address to receive DEFAULT_ADMIN_ROLE and TOPIC_MANAGER_ROLE
+ */
+ function initialize(address admin) external initializer {
+ __AccessControl_init();
+ _grantRole(DEFAULT_ADMIN_ROLE, admin);
+ _grantRole(TOPIC_MANAGER_ROLE, admin);
+ }
+
+ /**
+ * @inheritdoc IIdentityUtilities
+ */
+ function addTopic(
+ uint256 topicId,
+ string calldata name,
+ bytes calldata encodedFieldNames,
+ bytes calldata encodedFieldTypes
+ ) external override onlyRole(TOPIC_MANAGER_ROLE) {
+ require(bytes(name).length > 0, "Empty topic name");
+ require(_topics[topicId].encodedFieldNames.length == 0, "Topic already exists");
+ _validateFieldArrays(encodedFieldNames, encodedFieldTypes);
+
+ _topics[topicId] =
+ TopicInfo({ name: name, encodedFieldNames: encodedFieldNames, encodedFieldTypes: encodedFieldTypes });
+
+ emit TopicAdded(topicId, name, encodedFieldNames, encodedFieldTypes);
+ }
+
+ /**
+ * @inheritdoc IIdentityUtilities
+ */
+ function updateTopic(
+ uint256 topicId,
+ string calldata name,
+ bytes calldata encodedFieldNames,
+ bytes calldata encodedFieldTypes
+ ) external override onlyRole(TOPIC_MANAGER_ROLE) {
+ require(_topics[topicId].encodedFieldNames.length != 0, "Topic does not exist");
+ require(bytes(name).length > 0, "Empty topic name");
+ _validateFieldArrays(encodedFieldNames, encodedFieldTypes);
+
+ _topics[topicId] =
+ TopicInfo({ name: name, encodedFieldNames: encodedFieldNames, encodedFieldTypes: encodedFieldTypes });
+
+ emit TopicUpdated(topicId, name, encodedFieldNames, encodedFieldTypes);
+ }
+
+ /**
+ * @inheritdoc IIdentityUtilities
+ */
+ function removeTopic(uint256 topicId) external override onlyRole(TOPIC_MANAGER_ROLE) {
+ require(_topics[topicId].encodedFieldNames.length != 0, "Topic does not exist");
+ delete _topics[topicId];
+ emit TopicRemoved(topicId);
+ }
+
+ /**
+ * @inheritdoc IIdentityUtilities
+ */
+ function getTopic(uint256 topicId) external view override returns (TopicInfo memory) {
+ return _topics[topicId];
+ }
+
+ /**
+ * @inheritdoc IIdentityUtilities
+ */
+ function getSchema(uint256 topicId)
+ external
+ view
+ override
+ returns (string[] memory fieldNames, string[] memory fieldTypes)
+ {
+ if (_topics[topicId].encodedFieldNames.length == 0) {
+ return (new string[](0), new string[](0));
+ }
+ fieldNames = abi.decode(_topics[topicId].encodedFieldNames, (string[]));
+ fieldTypes = abi.decode(_topics[topicId].encodedFieldTypes, (string[]));
+ }
+
+ /**
+ * @notice Returns decoded field names for a given topic ID
+ * @param topicId The ID of the topic
+ * @return string[] Array of field names
+ */
+ function getFieldNames(uint256 topicId) external view returns (string[] memory) {
+ if (_topics[topicId].encodedFieldNames.length == 0) {
+ return new string[](0);
+ }
+ return abi.decode(_topics[topicId].encodedFieldNames, (string[]));
+ }
+
+ /**
+ * @notice Returns decoded field types for a given topic ID
+ * @param topicId The ID of the topic
+ * @return string[] Array of field types
+ */
+ function getFieldTypes(uint256 topicId) external view returns (string[] memory) {
+ if (_topics[topicId].encodedFieldTypes.length == 0) {
+ return new string[](0);
+ }
+ return abi.decode(_topics[topicId].encodedFieldTypes, (string[]));
+ }
+
+ /**
+ * @notice Returns an array of TopicInfo structs for the given topic IDs
+ * @param topicIds Array of topic IDs to get TopicInfo structs for
+ * @return TopicInfo[] Array of TopicInfo structs corresponding to the input topic IDs
+ */
+ function getTopicInfos(uint256[] calldata topicIds) external view returns (TopicInfo[] memory) {
+ TopicInfo[] memory topics = new TopicInfo[](topicIds.length);
+ for (uint256 i = 0; i < topicIds.length; i++) {
+ topics[i] = _topics[topicIds[i]];
+ }
+ return topics;
+ }
+
+ /**
+ * @notice Gets comprehensive claim information for an identity across multiple topics
+ * @param identity The identity contract address
+ * @param topicIds Array of topic IDs to check
+ * @return result Array of claim information structs
+ */
+ function getClaimsWithTopicInfo(address identity, uint256[] calldata topicIds)
+ external
+ view
+ returns (ClaimInfo[] memory result)
+ {
+ uint256 totalClaims = _countTotalClaims(identity, topicIds);
+ result = new ClaimInfo[](totalClaims);
+ uint256 resultIndex = 0;
+
+ for (uint256 i = 0; i < topicIds.length; i++) {
+ uint256 topicId = topicIds[i];
+ TopicInfo memory topicInfo = _topics[topicId];
+ bytes32[] memory claimIds = IIdentity(identity).getClaimIdsByTopic(topicId);
+ for (uint256 j = 0; j < claimIds.length; j++) {
+ result[resultIndex] = _buildClaimInfo(identity, topicId, topicInfo, claimIds[j]);
+ resultIndex++;
+ }
+ }
+ }
+
+ /**
+ * @dev Required override for UUPS upgradability authorization
+ * @param newImplementation Address of the new implementation
+ */
+ function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) { }
+
+ function _countTotalClaims(address identity, uint256[] calldata topicIds) internal view returns (uint256 total) {
+ for (uint256 i = 0; i < topicIds.length; i++) {
+ bytes32[] memory claimIds = IIdentity(identity).getClaimIdsByTopic(topicIds[i]);
+ total += claimIds.length;
+ }
+ }
+
+ function _isClaimValid(address identity, uint256 topicId, address issuer, bytes memory signature, bytes memory data)
+ internal
+ view
+ returns (bool)
+ {
+ if (issuer == address(0)) return false;
+ try IClaimIssuer(issuer).isClaimValid(IIdentity(identity), topicId, signature, data) returns (bool valid) {
+ return valid;
+ } catch {
+ return false;
+ }
+ }
+
+ function _buildClaimInfo(address identity, uint256 topicId, TopicInfo memory topicInfo, bytes32 claimId)
+ internal
+ view
+ returns (ClaimInfo memory info)
+ {
+ (,
+ // topic - not used
+ uint256 scheme,
+ address issuer,
+ bytes memory signature,
+ bytes memory data,
+ string memory uri
+ ) = IIdentity(identity).getClaim(claimId);
+
+ bool isValid = _isClaimValid(identity, topicId, issuer, signature, data);
+
+ info = ClaimInfo({
+ topic: topicInfo,
+ isValid: isValid,
+ claimId: claimId,
+ scheme: scheme,
+ issuer: issuer,
+ signature: signature,
+ data: data,
+ uri: uri
+ });
+ }
+
+ /**
+ * @dev Validates that encoded field names/types match in length and content.
+ * @param encodedNames ABI-encoded string[] of field names
+ * @param encodedTypes ABI-encoded string[] of field types
+ */
+ function _validateFieldArrays(bytes memory encodedNames, bytes memory encodedTypes) internal pure {
+ string[] memory names = abi.decode(encodedNames, (string[]));
+ string[] memory types_ = abi.decode(encodedTypes, (string[]));
+ require(names.length == types_.length, "Field name/type count mismatch");
+
+ for (uint256 i = 0; i < names.length; i++) {
+ require(bytes(names[i]).length > 0, "Empty field name");
+ require(bytes(types_[i]).length > 0, "Empty field type");
+ }
+ }
+
+ /// @dev Reserved storage space to allow future layout changes
+ uint256[50] private __gap; // solhint-disable-line ordering
+
+}
diff --git a/contracts/KeyManager.sol b/contracts/KeyManager.sol
new file mode 100644
index 00000000..2faa8b67
--- /dev/null
+++ b/contracts/KeyManager.sol
@@ -0,0 +1,413 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { IERC734 } from "./interface/IERC734.sol";
+import { IERC735 } from "./interface/IERC735.sol";
+import { Errors } from "./libraries/Errors.sol";
+import { KeyPurposes } from "./libraries/KeyPurposes.sol";
+import { KeyTypes } from "./libraries/KeyTypes.sol";
+import { Structs } from "./storage/Structs.sol";
+import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
+
+/**
+ * @title KeyManager
+ * @dev Contract responsible for managing keys and execution functionality.
+ *
+ * This contract handles:
+ * - Key addition, removal, and validation
+ * - Execution request management
+ * - Key purpose verification
+ * - O(1) key lookups using index mappings
+ *
+ * The contract uses ERC-7201 storage slots for upgradeability.
+ *
+ * @custom:security This contract uses ERC-7201 storage slots to prevent storage collision attacks
+ * in upgradeable contracts.
+ */
+contract KeyManager is IERC734 {
+
+ using EnumerableSet for EnumerableSet.UintSet;
+ using EnumerableSet for EnumerableSet.Bytes32Set;
+
+ /**
+ * @dev Storage struct for key management and execution data
+ * @custom:storage-location erc7201:onchainid.keymanager.storage
+ */
+ struct KeyStorage {
+ /// @dev Nonce used by the execute/approve function to track execution requests
+ uint256 executionNonce;
+ /// @dev Mapping of key hash to Key struct as defined by IERC734
+ mapping(bytes32 => Structs.Key) keys;
+ /// @dev Mapping of purpose to set of key hashes (EnumerableSet for O(1) add/remove/contains)
+ mapping(uint256 => EnumerableSet.Bytes32Set) keysByPurpose;
+ /// @dev Mapping of execution ID to Execution struct for tracking execution requests
+ mapping(uint256 => Structs.Execution) executions;
+ /// @dev Flag indicating if the contract has been initialized
+ bool initialized;
+ /// @dev Flag indicating if the contract can be interacted with (prevents direct calls to implementation)
+ bool canInteract;
+ }
+
+ /**
+ * @dev ERC-7201 Storage Slot for upgradeable contract pattern
+ * This slot ensures no storage collision between different versions of the contract
+ *
+ * Formula: keccak256(abi.encode(uint256(keccak256(bytes(id))) - 1)) & ~bytes32(uint256(0xff))
+ * where id is the namespace identifier
+ */
+ bytes32 internal constant _KEY_STORAGE_SLOT = keccak256(
+ abi.encode(uint256(keccak256(bytes("onchainid.keymanager.storage"))) - 1)
+ ) & ~bytes32(uint256(0xff));
+
+ /**
+ * @notice Prevent any direct calls to the implementation contract (marked by _canInteract = false).
+ */
+ modifier delegatedOnly() {
+ _checkDelegated();
+ _;
+ }
+
+ /**
+ * @notice requires management key to call this function, or internal call
+ */
+ modifier onlyManager() {
+ require(
+ msg.sender == address(this) || keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.MANAGEMENT),
+ Errors.SenderDoesNotHaveManagementKey()
+ );
+ _;
+ }
+
+ /**
+ * @dev See {IERC734-execute}.
+ * @notice Passes an execution instruction to the keymanager.
+ *
+ * Execution flow:
+ * 1. If the sender is an ACTION key and the destination is external, execution is auto-approved
+ * 2. If the sender is a MANAGEMENT key, execution is auto-approved for any destination
+ * 3. If the sender is a CLAIM_SIGNER key and the call is to addClaim, execution is auto-approved
+ * 4. Otherwise, the execution request must be approved via the `approve` method
+ *
+ * @param _to The destination address for the execution
+ * @param _value The amount of ETH to send with the execution
+ * @param _data The calldata for the execution
+ * @return executionId The ID to use in the approve function to approve or reject this execution
+ */
+ function execute(address _to, uint256 _value, bytes memory _data)
+ external
+ payable
+ virtual
+ returns (uint256 executionId)
+ {
+ KeyStorage storage ks = _getKeyStorage();
+ uint256 _executionId = ks.executionNonce;
+ ks.executions[_executionId].to = _to;
+ ks.executions[_executionId].value = _value;
+ ks.executions[_executionId].data = _data;
+ ks.executionNonce++;
+
+ emit ExecutionRequested(_executionId, _to, _value, _data);
+
+ // Check if execution can be auto-approved
+ if (_canAutoApproveExecution(_to, _data)) {
+ _approve(_executionId, true);
+ }
+
+ return _executionId;
+ }
+
+ /**
+ * @notice Gets the current execution nonce
+ * @return The current execution nonce
+ */
+ function getCurrentNonce() external view virtual returns (uint256) {
+ return _getKeyStorage().executionNonce;
+ }
+
+ /**
+ * @dev See {IERC734-getKey}.
+ * @notice Implementation of the getKey function from the ERC-734 standard
+ * @param _key The public key. for non-hex and long keys, its the Keccak256 hash of the key
+ * @return purposes Returns the full key data, if present in the identity.
+ * @return keyType Returns the full key data, if present in the identity.
+ * @return key Returns the full key data, if present in the identity.
+ */
+ function getKey(bytes32 _key)
+ external
+ view
+ virtual
+ returns (uint256[] memory purposes, uint256 keyType, bytes32 key)
+ {
+ KeyStorage storage ks = _getKeyStorage();
+ return (ks.keys[_key].purposes.values(), ks.keys[_key].keyType, ks.keys[_key].key);
+ }
+
+ /**
+ * @dev See {IERC734-getKeyPurposes}.
+ * @notice gets the purposes of a key
+ * @param _key The public key. for non-hex and long keys, its the Keccak256 hash of the key
+ * @return _purposes Returns the purposes of the specified key
+ */
+ function getKeyPurposes(bytes32 _key) external view virtual returns (uint256[] memory _purposes) {
+ return _getKeyStorage().keys[_key].purposes.values();
+ }
+
+ /**
+ * @dev See {IERC734-getKeysByPurpose}.
+ * @notice gets all the keys with a specific purpose from an identity
+ * @param _purpose a uint256[] Array of the key types, like 1 = MANAGEMENT, 2 = ACTION, 3 = CLAIM, 4 = ENCRYPTION
+ * @return keys Returns an array of public key bytes32 hold by this identity and having the specified purpose
+ */
+ function getKeysByPurpose(uint256 _purpose) external view virtual returns (bytes32[] memory keys) {
+ return _getKeyStorage().keysByPurpose[_purpose].values();
+ }
+
+ /**
+ * @notice Gets the execution data for a specific execution ID
+ * @param _executionId The execution ID to get data for
+ * @return execution including (to, value, data, approved, executed)
+ */
+ function getExecutionData(uint256 _executionId) external view virtual returns (Structs.Execution memory execution) {
+ return _getKeyStorage().executions[_executionId];
+ }
+
+ /**
+ * @dev See {IERC734-addKey}.
+ * @notice implementation of the addKey function of the ERC-734 standard
+ * Adds a _key to the identity. The _purpose specifies the purpose of key. Initially we propose four purposes:
+ * 1: MANAGEMENT keys, which can manage the identity
+ * 2: ACTION keys, which perform actions in this identities name (signing, logins, transactions, etc.)
+ * 3: CLAIM signer keys, used to sign claims on other identities which need to be revokable.
+ * 4: ENCRYPTION keys, used to encrypt data e.g. hold in claims.
+ * MUST only be done by keys of purpose 1, or the identity itself.
+ * If its the identity itself, the approval process will determine its approval.
+ * @param _key keccak256 representation of an ethereum address
+ * @param _type type of key used, which would be a uint256 for different key types. e.g. 1 = ECDSA, 2 = RSA, etc.
+ * @param _purpose a uint256 specifying the key type, like 1 = MANAGEMENT, 2 = ACTION, 3 = CLAIM, 4 = ENCRYPTION
+ * @return success Returns TRUE if the addition was successful and FALSE if not
+ */
+ function addKey(bytes32 _key, uint256 _purpose, uint256 _type)
+ public
+ virtual
+ delegatedOnly
+ onlyManager
+ returns (bool success)
+ {
+ KeyStorage storage ks = _getKeyStorage();
+ Structs.Key storage k = ks.keys[_key];
+
+ // 1. Initialize new key if it doesn't exist yet
+ if (k.key == bytes32(0)) {
+ k.key = _key;
+ k.keyType = _type;
+ }
+
+ // 2. Add purpose to key's purpose set (reverts if already present) and key to purpose's key set
+ require(k.purposes.add(_purpose), Errors.KeyAlreadyHasPurpose(_key, _purpose));
+ ks.keysByPurpose[_purpose].add(_key);
+
+ emit KeyAdded(_key, _purpose, _type);
+ return true;
+ }
+
+ /**
+ * @dev See {IERC734-removeKey}.
+ * @notice Removes a purpose from a key.
+ *
+ * Uses EnumerableSet for O(1) add/remove/contains operations.
+ * If the key has no remaining purposes after removal, the key struct is deleted.
+ *
+ * Access control: Only MANAGEMENT keys or the identity itself can remove keys.
+ *
+ * @param _key The key to remove the purpose from
+ * @param _purpose The purpose to remove from the key
+ * @return success True if the purpose was successfully removed
+ *
+ */
+ function removeKey(bytes32 _key, uint256 _purpose) public virtual delegatedOnly onlyManager returns (bool success) {
+ KeyStorage storage ks = _getKeyStorage();
+ Structs.Key storage k = ks.keys[_key];
+
+ // 1. Validate key exists
+ require(k.key == _key, Errors.KeyNotRegistered(_key));
+
+ // 2. Remove purpose from key's set (reverts if not present) and key from purpose's set
+ require(k.purposes.remove(_purpose), Errors.KeyDoesNotHavePurpose(_key, _purpose));
+ ks.keysByPurpose[_purpose].remove(_key);
+
+ emit KeyRemoved(_key, _purpose, k.keyType);
+
+ // If key has no more purposes, delete the entire key struct to save gas
+ if (k.purposes.length() == 0) {
+ delete ks.keys[_key];
+ }
+
+ return true;
+ }
+
+ /**
+ * @dev See {IERC734-approve}.
+ * @notice Approves an execution.
+ * If the sender is an ACTION key and the destination address is not the identity contract itself, then the
+ * approval is authorized and the operation would be performed.
+ * If the destination address is the identity itself, then the execution would be authorized and performed only
+ * if the sender is a MANAGEMENT key.
+ */
+ function approve(uint256 _id, bool _shouldApprove) public virtual delegatedOnly returns (bool success) {
+ KeyStorage storage ks = _getKeyStorage();
+ require(_id < ks.executionNonce, Errors.InvalidRequestId());
+ require(!ks.executions[_id].executed, Errors.RequestAlreadyExecuted());
+
+ // Validate that the sender has the appropriate key purpose
+ if (ks.executions[_id].to == address(this)) {
+ require(
+ keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.MANAGEMENT),
+ Errors.SenderDoesNotHaveManagementKey()
+ );
+ } else {
+ require(
+ keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.ACTION),
+ Errors.SenderDoesNotHaveActionKey()
+ );
+ }
+
+ return _approve(_id, _shouldApprove);
+ }
+
+ /**
+ * @dev See {IERC734-keyHasPurpose}.
+ * @notice Checks if a key has a specific purpose or MANAGEMENT purpose.
+ *
+ * This function uses O(1) index mappings for efficient lookups instead of
+ * linear search through the purposes array. MANAGEMENT keys have universal
+ * permissions according to the ERC-734 standard, so any key with MANAGEMENT
+ * purpose will return true for any purpose.
+ *
+ * @param _key The key to check (keccak256 hash of the address)
+ * @param _purpose The purpose to check for
+ * @return result True if the key has the specified purpose or MANAGEMENT purpose
+ *
+ */
+ function keyHasPurpose(bytes32 _key, uint256 _purpose) public view virtual returns (bool result) {
+ KeyStorage storage ks = _getKeyStorage();
+
+ // Early return if key doesn't exist
+ if (ks.keys[_key].key == 0) return false;
+
+ // O(1) lookup: Check if key has the specific purpose OR MANAGEMENT purpose
+ // MANAGEMENT keys have universal permissions in the ERC-734 standard
+ return ks.keys[_key].purposes.contains(_purpose) || ks.keys[_key].purposes.contains(KeyPurposes.MANAGEMENT);
+ }
+
+ /**
+ * @dev Internal method to handle the actual approval logic
+ * @param _id The execution ID to approve
+ * @param _shouldApprove Whether to approve or reject the execution
+ * @return success Whether the execution was successful
+ */
+ function _approve(uint256 _id, bool _shouldApprove) internal virtual returns (bool success) {
+ KeyStorage storage ks = _getKeyStorage();
+ emit Approved(_id, _shouldApprove);
+
+ if (_shouldApprove) {
+ ks.executions[_id].approved = true;
+
+ // solhint-disable-next-line avoid-low-level-calls
+ (success,) = ks.executions[_id].to.call{ value: (ks.executions[_id].value) }(ks.executions[_id].data);
+
+ if (success) {
+ emit Executed(_id, ks.executions[_id].to, ks.executions[_id].value, ks.executions[_id].data);
+ } else {
+ emit ExecutionFailed(_id, ks.executions[_id].to, ks.executions[_id].value, ks.executions[_id].data);
+ }
+ } else {
+ ks.executions[_id].approved = false;
+ }
+
+ ks.executions[_id].executed = true;
+
+ return success;
+ }
+
+ /**
+ * @dev Internal helper to setup initial management key
+ * @param initialManagementKey The ethereum address to be set as the management key
+ */
+ function _setupInitialManagementKey(address initialManagementKey) internal {
+ KeyStorage storage ks = _getKeyStorage();
+
+ bytes32 _key = keccak256(abi.encode(initialManagementKey));
+ ks.keys[_key].key = _key;
+ ks.keys[_key].keyType = KeyTypes.ECDSA;
+ ks.keys[_key].purposes.add(KeyPurposes.MANAGEMENT);
+ ks.keysByPurpose[KeyPurposes.MANAGEMENT].add(_key);
+
+ emit KeyAdded(_key, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+ }
+
+ /**
+ * @dev Internal method to check if an execution can be auto-approved based on key purposes.
+ *
+ * This function determines whether an execution request can be automatically approved
+ * without requiring manual approval through the approve function.
+ *
+ * Auto-approval conditions:
+ * 1. MANAGEMENT keys can auto-approve any execution
+ * 2. CLAIM_SIGNER keys can auto-approve calls to the identity itself
+ * 3. ACTION keys can auto-approve external calls (not to the identity itself)
+ * Note: CLAIM_ADDER auto-approval is handled by Identity via override
+ *
+ * @param _to The target address of the execution
+ * @return canAutoApprove Whether the execution can be auto-approved
+ */
+ function _canAutoApproveExecution(address _to, bytes memory _data)
+ internal
+ view
+ virtual
+ returns (bool canAutoApprove)
+ {
+ // MANAGEMENT keys can auto-approve any execution
+ if (keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.MANAGEMENT)) {
+ return true;
+ }
+
+ // CLAIM_SIGNER keys can auto-approve any self-call (addClaim + removeClaim, etc...)
+ if (_to == address(this) && keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.CLAIM_SIGNER)) {
+ return true;
+ }
+
+ // CLAIM_ADDER keys can only auto-approve addClaim on self
+ if (
+ _to == address(this) && keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.CLAIM_ADDER)
+ && _data.length >= 4
+ ) {
+ return bytes4(_data) == IERC735.addClaim.selector;
+ }
+
+ // ACTION keys can auto-approve external calls
+ if (_to != address(this) && keyHasPurpose(keccak256(abi.encode(msg.sender)), KeyPurposes.ACTION)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @dev Internal helper to enforce delegatedOnly check.
+ */
+ function _checkDelegated() internal view {
+ require(_getKeyStorage().canInteract, Errors.InteractingWithLibraryContractForbidden());
+ }
+
+ /**
+ * @dev Returns the key storage struct at the specified ERC-7201 slot
+ * @return s The KeyStorage struct pointer for the key management slot
+ */
+ function _getKeyStorage() internal pure returns (KeyStorage storage s) {
+ bytes32 slot = _KEY_STORAGE_SLOT;
+ assembly {
+ s.slot := slot
+ }
+ }
+
+}
diff --git a/contracts/Test.sol b/contracts/Test.sol
deleted file mode 100644
index 09045d3e..00000000
--- a/contracts/Test.sol
+++ /dev/null
@@ -1,4 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
-
-contract Test {} // solhint-disable-line
diff --git a/contracts/_testContracts/VerifierUser.sol b/contracts/_testContracts/VerifierUser.sol
deleted file mode 100644
index a621f1ec..00000000
--- a/contracts/_testContracts/VerifierUser.sol
+++ /dev/null
@@ -1,12 +0,0 @@
-/* solhint-disable */
-
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
-
-import "../verifiers/Verifier.sol";
-
-contract VerifierUser is Verifier {
- constructor() Verifier() {}
-
- function doSomething() onlyVerifiedSender public {}
-}
diff --git a/contracts/factory/ClaimIssuerFactory.sol b/contracts/factory/ClaimIssuerFactory.sol
new file mode 100644
index 00000000..876da6de
--- /dev/null
+++ b/contracts/factory/ClaimIssuerFactory.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
+import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+import { CREATE3 } from "solady/src/utils/CREATE3.sol";
+
+import { Identity } from "../Identity.sol";
+import { Errors } from "../libraries/Errors.sol";
+import { IdentityTypes } from "../libraries/IdentityTypes.sol";
+
+contract ClaimIssuerFactory is Ownable {
+
+ address private _implementation;
+ mapping(address => address) private _deployedClaimIssuers;
+ mapping(address => bool) private _blacklistedAddresses;
+
+ /// @notice Event emitted when a new ClaimIssuer is deployed
+ event ClaimIssuerDeployed(address indexed managementKey, address indexed claimIssuer);
+
+ /// @notice Event emitted when an address is blacklisted
+ event Blacklisted(address indexed addr, bool blacklisted);
+
+ /// @notice Event emitted when the implementation is updated
+ event ImplementationUpdated(address indexed oldImplementation, address indexed newImplementation);
+
+ constructor(address implementationAddress) Ownable(msg.sender) {
+ _implementation = implementationAddress;
+ }
+
+ /**
+ * @dev Deploys a new ClaimIssuer contract using CREATE2
+ * @return The address of the deployed ClaimIssuer contract
+ */
+ function deployClaimIssuer() external returns (address) {
+ return _deployClaimIssuer(msg.sender);
+ }
+
+ /**
+ * @dev Deploys a ClaimIssuer on behalf of a management key (owner only)
+ * @param managementKey The initial management key for the ClaimIssuer
+ * @return The address of the deployed ClaimIssuer contract
+ */
+ function deployClaimIssuerOnBehalf(address managementKey) external onlyOwner returns (address) {
+ return _deployClaimIssuer(managementKey);
+ }
+
+ /**
+ * @dev Blacklists an address from deploying ClaimIssuers
+ * @param addr The address to blacklist
+ */
+ function blacklistAddress(address addr, bool blacklisted) external onlyOwner {
+ require(addr != address(0), Errors.ZeroAddress());
+ _blacklistedAddresses[addr] = blacklisted;
+ emit Blacklisted(addr, blacklisted);
+ }
+
+ /**
+ * @dev Updates the implementation address
+ * @param newImplementation The new implementation address
+ */
+ function updateImplementation(address newImplementation) external onlyOwner {
+ require(newImplementation != address(0), Errors.ZeroAddress());
+
+ address oldImplementation = _implementation;
+ _implementation = newImplementation;
+ emit ImplementationUpdated(oldImplementation, newImplementation);
+ }
+
+ /**
+ * @dev Getter for the current implementation contract used
+ * @return The address of the implementation contract
+ */
+ function implementation() external view returns (address) {
+ return _implementation;
+ }
+
+ /**
+ * @dev returns the blacklist status of an address
+ * @return true if blacklisted, false if not
+ */
+ function isBlacklisted(address account) external view returns (bool) {
+ return _blacklistedAddresses[account];
+ }
+
+ /**
+ * @dev Getter for the ClaimIssuer Proxy address linked to an account address
+ * @return The address of the corresponding ClaimIssuer Proxy
+ */
+ function claimIssuer(address account) external view returns (address) {
+ return _deployedClaimIssuers[account];
+ }
+
+ /**
+ * @dev Deploys a new ClaimIssuer contract using CREATE2
+ * @param managementKey The initial management key for the ClaimIssuer
+ * @return The address of the deployed ClaimIssuer contract
+ */
+ function _deployClaimIssuer(address managementKey) internal returns (address) {
+ require(managementKey != address(0), Errors.ZeroAddress());
+ require(!_blacklistedAddresses[msg.sender], Errors.Blacklisted(msg.sender));
+ require(_deployedClaimIssuers[managementKey] == address(0), Errors.ClaimIssuerAlreadyDeployed(managementKey));
+
+ address claimIssuerAddress = CREATE3.deployDeterministic(
+ abi.encodePacked(
+ type(ERC1967Proxy).creationCode,
+ abi.encode(
+ _implementation, abi.encodeCall(Identity.initialize, (managementKey, IdentityTypes.CLAIM_ISSUER))
+ )
+ ),
+ bytes32(uint256(uint160(managementKey)))
+ );
+
+ _deployedClaimIssuers[managementKey] = claimIssuerAddress;
+ emit ClaimIssuerDeployed(managementKey, claimIssuerAddress);
+
+ return claimIssuerAddress;
+ }
+
+}
diff --git a/contracts/factory/IIdFactory.sol b/contracts/factory/IIdFactory.sol
index 72a8c2ea..5bd6aef0 100644
--- a/contracts/factory/IIdFactory.sol
+++ b/contracts/factory/IIdFactory.sol
@@ -1,10 +1,9 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
interface IIdFactory {
/// events
-
// event emitted whenever a single contract is deployed by the factory
event Deployed(address indexed _addr);
@@ -31,13 +30,17 @@ interface IIdFactory {
* @dev function used to create a new Identity proxy from the factory
* @param _wallet the wallet address of the primary owner of this ONCHAINID contract
* @param _salt the salt used by create2 to issue the contract
+ * @param _identityType the type of the identity (see IdentityTypes library)
+ * @param _claimAdders the list of addresses to add as CLAIM_ADDER keys on the identity
* requires a new salt for each deployment
* _wallet cannot be linked to another ONCHAINID
* only Owner can call => Owner is supposed to be a smart contract, managing the accessibility
* of the function, including calls to oracles for multichain
* deployment security (avoid identity theft), defining payment requirements, etc.
*/
- function createIdentity(address _wallet, string memory _salt) external returns (address);
+ function createIdentity(address _wallet, string memory _salt, uint256 _identityType, address[] memory _claimAdders)
+ external
+ returns (address);
/**
* @dev function used to create a new Identity proxy from the factory, setting the wallet and listed keys as
@@ -45,6 +48,8 @@ interface IIdFactory {
* @param _wallet the wallet address of the primary owner of this ONCHAINID contract
* @param _salt the salt used by create2 to issue the contract
* @param _managementKeys A list of keys hash (keccak256(abiEncoded())) to add as MANAGEMENT keys.
+ * @param _identityType the type of the identity (see IdentityTypes library)
+ * @param _claimAdders the list of addresses to add as CLAIM_ADDER keys on the identity
* requires a new salt for each deployment
* _wallet cannot be linked to another ONCHAINID
* only Owner can call => Owner is supposed to be a smart contract, managing the accessibility
@@ -54,7 +59,9 @@ interface IIdFactory {
function createIdentityWithManagementKeys(
address _wallet,
string memory _salt,
- bytes32[] memory _managementKeys
+ bytes32[] memory _managementKeys,
+ uint256 _identityType,
+ address[] memory _claimAdders
) external returns (address);
/**
@@ -62,12 +69,18 @@ interface IIdFactory {
* @param _token the address of the token contract
* @param _tokenOwner the owner address of the token
* @param _salt the salt used by create2 to issue the contract
+ * @param _claimAdders the list of addresses to add as CLAIM_ADDER keys on the identity
* requires a new salt for each deployment
* _token cannot be linked to another ONCHAINID
* only Token factory or owner can call (owner should only use its privilege
* for tokens not issued by a Token factory onchain
*/
- function createTokenIdentity(address _token, address _tokenOwner, string memory _salt) external returns (address);
+ function createTokenIdentity(
+ address _token,
+ address _tokenOwner,
+ string memory _salt,
+ address[] memory _claimAdders
+ ) external returns (address);
/**
* @dev function used to link a new wallet to an existing identity
@@ -132,7 +145,7 @@ interface IIdFactory {
* @param _factory the address of the factory
* returns true if the address corresponds to a registered factory
*/
- function isTokenFactory(address _factory) external view returns(bool);
+ function isTokenFactory(address _factory) external view returns (bool);
/**
* @dev getter to know if a salt is taken for the create2 deployment
@@ -144,4 +157,5 @@ interface IIdFactory {
* @dev getter for the implementation authority used by this factory.
*/
function implementationAuthority() external view returns (address);
+
}
diff --git a/contracts/factory/IdFactory.sol b/contracts/factory/IdFactory.sol
index 7adbaa2e..8d786a95 100644
--- a/contracts/factory/IdFactory.sol
+++ b/contracts/factory/IdFactory.sol
@@ -1,17 +1,22 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
-import "../proxy/IdentityProxy.sol";
-import "./IIdFactory.sol";
-import "../interface/IERC734.sol";
-import "@openzeppelin/contracts/access/Ownable.sol";
+import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
-contract IdFactory is IIdFactory, Ownable {
+import { IERC734 } from "../interface/IERC734.sol";
+import { Errors } from "../libraries/Errors.sol";
+import { IdentityTypes } from "../libraries/IdentityTypes.sol";
+import { KeyPurposes } from "../libraries/KeyPurposes.sol";
+import { KeyTypes } from "../libraries/KeyTypes.sol";
+import { IdentityProxy } from "../proxy/IdentityProxy.sol";
+import { IIdFactory } from "./IIdFactory.sol";
- mapping(address => bool) private _tokenFactories;
+contract IdFactory is IIdFactory, Ownable {
// address of the _implementationAuthority contract making the link to the implementation contract
- address private immutable _implementationAuthority;
+ address public immutable implementationAuthority;
+
+ mapping(address => bool) private _tokenFactories;
// as it is not possible to deploy 2 times the same contract address, this mapping allows us to check which
// salt is taken and which is not
@@ -29,19 +34,18 @@ contract IdFactory is IIdFactory, Ownable {
// token linked to an ONCHAINID
mapping(address => address) private _tokenAddress;
-
// setting
- constructor (address implementationAuthority) {
- require(implementationAuthority != address(0), "invalid argument - zero address");
- _implementationAuthority = implementationAuthority;
+ constructor(address implementationAuthorityAddress) Ownable(msg.sender) {
+ require(implementationAuthorityAddress != address(0), Errors.ZeroAddress());
+ implementationAuthority = implementationAuthorityAddress;
}
/**
* @dev See {IdFactory-addTokenFactory}.
*/
function addTokenFactory(address _factory) external override onlyOwner {
- require(_factory != address(0), "invalid argument - zero address");
- require(!isTokenFactory(_factory), "already a factory");
+ require(_factory != address(0), Errors.ZeroAddress());
+ require(!isTokenFactory(_factory), Errors.AlreadyAFactory(_factory));
_tokenFactories[_factory] = true;
emit TokenFactoryAdded(_factory);
}
@@ -50,8 +54,8 @@ contract IdFactory is IIdFactory, Ownable {
* @dev See {IdFactory-removeTokenFactory}.
*/
function removeTokenFactory(address _factory) external override onlyOwner {
- require(_factory != address(0), "invalid argument - zero address");
- require(isTokenFactory(_factory), "not a factory");
+ require(_factory != address(0), Errors.ZeroAddress());
+ require(isTokenFactory(_factory), Errors.NotAFactory(_factory));
_tokenFactories[_factory] = false;
emit TokenFactoryRemoved(_factory);
}
@@ -59,16 +63,23 @@ contract IdFactory is IIdFactory, Ownable {
/**
* @dev See {IdFactory-createIdentity}.
*/
- function createIdentity(
- address _wallet,
- string memory _salt)
- external onlyOwner override returns (address) {
- require(_wallet != address(0), "invalid argument - zero address");
- require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), "invalid argument - empty string");
- string memory oidSalt = string.concat("OID",_salt);
- require (!_saltTaken[oidSalt], "salt already taken");
- require (_userIdentity[_wallet] == address(0), "wallet already linked to an identity");
- address identity = _deployIdentity(oidSalt, _implementationAuthority, _wallet);
+ function createIdentity(address _wallet, string memory _salt, uint256 _identityType, address[] memory _claimAdders)
+ external
+ override
+ onlyOwner
+ returns (address)
+ {
+ require(_wallet != address(0), Errors.ZeroAddress());
+ require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), Errors.EmptyString());
+ string memory oidSalt = string.concat("OID", _salt);
+ require(!_saltTaken[oidSalt], Errors.SaltTaken(oidSalt));
+ require(_userIdentity[_wallet] == address(0), Errors.WalletAlreadyLinkedToIdentity(_wallet));
+
+ address identity = _deployIdentity(oidSalt, address(this), _identityType);
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = keccak256(abi.encode(_wallet));
+ _setupIdentityKeys(identity, keys, _claimAdders);
+
_saltTaken[oidSalt] = true;
_userIdentity[_wallet] = identity;
_wallets[identity].push(_wallet);
@@ -82,32 +93,26 @@ contract IdFactory is IIdFactory, Ownable {
function createIdentityWithManagementKeys(
address _wallet,
string memory _salt,
- bytes32[] memory _managementKeys
- ) external onlyOwner override returns (address) {
- require(_wallet != address(0), "invalid argument - zero address");
- require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), "invalid argument - empty string");
- string memory oidSalt = string.concat("OID",_salt);
- require (!_saltTaken[oidSalt], "salt already taken");
- require (_userIdentity[_wallet] == address(0), "wallet already linked to an identity");
- require(_managementKeys.length > 0, "invalid argument - empty list of keys");
-
- address identity = _deployIdentity(oidSalt, _implementationAuthority, address(this));
-
- for (uint i = 0; i < _managementKeys.length; i++) {
+ bytes32[] memory _managementKeys,
+ uint256 _identityType,
+ address[] memory _claimAdders
+ ) external override onlyOwner returns (address) {
+ require(_wallet != address(0), Errors.ZeroAddress());
+ require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), Errors.EmptyString());
+ string memory oidSalt = string.concat("OID", _salt);
+ require(!_saltTaken[oidSalt], Errors.SaltTaken(oidSalt));
+ require(_userIdentity[_wallet] == address(0), Errors.WalletAlreadyLinkedToIdentity(_wallet));
+ require(_managementKeys.length > 0, Errors.EmptyListOfKeys());
+
+ address identity = _deployIdentity(oidSalt, address(this), _identityType);
+
+ for (uint256 i = 0; i < _managementKeys.length; i++) {
require(
- _managementKeys[i] != keccak256(abi.encode(_wallet))
- , "invalid argument - wallet is also listed in management keys");
- IERC734(identity).addKey(
- _managementKeys[i],
- 1,
- 1
+ _managementKeys[i] != keccak256(abi.encode(_wallet)), Errors.WalletAlsoListedInManagementKeys(_wallet)
);
}
- IERC734(identity).removeKey(
- keccak256(abi.encode(address(this))),
- 1
- );
+ _setupIdentityKeys(identity, _managementKeys, _claimAdders);
_saltTaken[oidSalt] = true;
_userIdentity[_wallet] = identity;
@@ -123,16 +128,22 @@ contract IdFactory is IIdFactory, Ownable {
function createTokenIdentity(
address _token,
address _tokenOwner,
- string memory _salt)
- external override returns (address) {
- require(isTokenFactory(msg.sender) || msg.sender == owner(), "only Factory or owner can call");
- require(_token != address(0), "invalid argument - zero address");
- require(_tokenOwner != address(0), "invalid argument - zero address");
- require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), "invalid argument - empty string");
- string memory tokenIdSalt = string.concat("Token",_salt);
- require(!_saltTaken[tokenIdSalt], "salt already taken");
- require(_tokenIdentity[_token] == address(0), "token already linked to an identity");
- address identity = _deployIdentity(tokenIdSalt, _implementationAuthority, _tokenOwner);
+ string memory _salt,
+ address[] memory _claimAdders
+ ) external override returns (address) {
+ require(isTokenFactory(msg.sender) || msg.sender == owner(), OwnableUnauthorizedAccount(msg.sender));
+ require(_token != address(0), Errors.ZeroAddress());
+ require(_tokenOwner != address(0), Errors.ZeroAddress());
+ require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), Errors.EmptyString());
+ string memory tokenIdSalt = string.concat("Token", _salt);
+ require(!_saltTaken[tokenIdSalt], Errors.SaltTaken(tokenIdSalt));
+ require(_tokenIdentity[_token] == address(0), Errors.TokenAlreadyLinked(_token));
+
+ address identity = _deployIdentity(tokenIdSalt, address(this), IdentityTypes.ASSET);
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = keccak256(abi.encode(_tokenOwner));
+ _setupIdentityKeys(identity, keys, _claimAdders);
+
_saltTaken[tokenIdSalt] = true;
_tokenIdentity[_token] = identity;
_tokenAddress[identity] = _token;
@@ -144,12 +155,12 @@ contract IdFactory is IIdFactory, Ownable {
* @dev See {IdFactory-linkWallet}.
*/
function linkWallet(address _newWallet) external override {
- require(_newWallet != address(0), "invalid argument - zero address");
- require(_userIdentity[msg.sender] != address(0), "wallet not linked to an identity contract");
- require(_userIdentity[_newWallet] == address(0), "new wallet already linked");
- require(_tokenIdentity[_newWallet] == address(0), "invalid argument - token address");
+ require(_newWallet != address(0), Errors.ZeroAddress());
+ require(_userIdentity[msg.sender] != address(0), Errors.WalletNotLinkedToIdentity(msg.sender));
+ require(_userIdentity[_newWallet] == address(0), Errors.WalletAlreadyLinkedToIdentity(_newWallet));
+ require(_tokenIdentity[_newWallet] == address(0), Errors.TokenAlreadyLinked(_newWallet));
address identity = _userIdentity[msg.sender];
- require(_wallets[identity].length < 101, "max amount of wallets per ID exceeded");
+ require(_wallets[identity].length < 101, Errors.MaxWalletsPerIdentityExceeded());
_userIdentity[_newWallet] = identity;
_wallets[identity].push(_newWallet);
emit WalletLinked(_newWallet, identity);
@@ -159,9 +170,9 @@ contract IdFactory is IIdFactory, Ownable {
* @dev See {IdFactory-unlinkWallet}.
*/
function unlinkWallet(address _oldWallet) external override {
- require(_oldWallet != address(0), "invalid argument - zero address");
- require(_oldWallet != msg.sender, "cannot be called on sender address");
- require(_userIdentity[msg.sender] == _userIdentity[_oldWallet], "only a linked wallet can unlink");
+ require(_oldWallet != address(0), Errors.ZeroAddress());
+ require(_oldWallet != msg.sender, Errors.CannotBeCalledOnSenderAddress());
+ require(_userIdentity[msg.sender] == _userIdentity[_oldWallet], Errors.OnlyLinkedWalletCanUnlink());
address _identity = _userIdentity[_oldWallet];
delete _userIdentity[_oldWallet];
uint256 length = _wallets[_identity].length;
@@ -178,48 +189,55 @@ contract IdFactory is IIdFactory, Ownable {
/**
* @dev See {IdFactory-getIdentity}.
*/
- function getIdentity(address _wallet) external override view returns (address) {
- if(_tokenIdentity[_wallet] != address(0)) {
+ function getIdentity(address _wallet) external view override returns (address) {
+ if (_tokenIdentity[_wallet] != address(0)) {
return _tokenIdentity[_wallet];
}
- else {
- return _userIdentity[_wallet];
- }
+
+ return _userIdentity[_wallet];
}
/**
* @dev See {IdFactory-isSaltTaken}.
*/
- function isSaltTaken(string calldata _salt) external override view returns (bool) {
+ function isSaltTaken(string calldata _salt) external view override returns (bool) {
return _saltTaken[_salt];
}
/**
* @dev See {IdFactory-getWallets}.
*/
- function getWallets(address _identity) external override view returns (address[] memory) {
+ function getWallets(address _identity) external view override returns (address[] memory) {
return _wallets[_identity];
}
/**
* @dev See {IdFactory-getToken}.
*/
- function getToken(address _identity) external override view returns (address) {
+ function getToken(address _identity) external view override returns (address) {
return _tokenAddress[_identity];
}
/**
* @dev See {IdFactory-isTokenFactory}.
*/
- function isTokenFactory(address _factory) public override view returns(bool) {
+ function isTokenFactory(address _factory) public view override returns (bool) {
return _tokenFactories[_factory];
}
- /**
- * @dev See {IdFactory-implementationAuthority}.
- */
- function implementationAuthority() public override view returns (address) {
- return _implementationAuthority;
+ // bootstraps an identity: adds management keys, claim adder keys, then removes factory key
+ function _setupIdentityKeys(address _identity, bytes32[] memory _managementKeys, address[] memory _claimAdders)
+ private
+ {
+ for (uint256 i = 0; i < _managementKeys.length; i++) {
+ IERC734(_identity).addKey(_managementKeys[i], KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+ }
+
+ for (uint256 i = 0; i < _claimAdders.length; i++) {
+ IERC734(_identity).addKey(keccak256(abi.encode(_claimAdders[i])), KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+ }
+
+ IERC734(_identity).removeKey(keccak256(abi.encode(address(this))), KeyPurposes.MANAGEMENT);
}
// deploy function with create2 opcode call
@@ -230,7 +248,7 @@ contract IdFactory is IIdFactory, Ownable {
// solhint-disable-next-line no-inline-assembly
assembly {
let encoded_data := add(0x20, bytecode) // load initialization code.
- let encoded_size := mload(bytecode) // load init code's length.
+ let encoded_size := mload(bytecode) // load init code's length.
addr := create2(0, encoded_data, encoded_size, saltBytes)
if iszero(extcodesize(addr)) {
revert(0, 0)
@@ -241,15 +259,11 @@ contract IdFactory is IIdFactory, Ownable {
}
// function used to deploy an identity using CREATE2
- function _deployIdentity
- (
- string memory _salt,
- address implementationAuthority,
- address _wallet
- ) private returns (address){
+ function _deployIdentity(string memory _salt, address _wallet, uint256 _identityType) private returns (address) {
bytes memory _code = type(IdentityProxy).creationCode;
- bytes memory _constructData = abi.encode(implementationAuthority, _wallet);
+ bytes memory _constructData = abi.encode(implementationAuthority, _wallet, _identityType);
bytes memory bytecode = abi.encodePacked(_code, _constructData);
return _deploy(_salt, bytecode);
}
+
}
diff --git a/contracts/gateway/Gateway.sol b/contracts/gateway/Gateway.sol
index e0f52a93..9070b7bd 100644
--- a/contracts/gateway/Gateway.sol
+++ b/contracts/gateway/Gateway.sol
@@ -1,35 +1,19 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
-
-import "@openzeppelin/contracts/access/Ownable.sol";
-import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
-import "../factory/IdFactory.sol";
-
-using ECDSA for bytes32;
-
-/// A required parameter was set to the Zero address.
-error ZeroAddress();
-/// The maximum number of signers was reached at deployment.
-error TooManySigners();
-/// The signed attempted to add was already approved.
-error SignerAlreadyApproved(address signer);
-/// The signed attempted to remove was not approved.
-error SignerAlreadyNotApproved(address signer);
-/// A requested ONCHAINID deployment was requested without a valid signature while the Gateway requires one.
-error UnsignedDeployment();
-/// A requested ONCHAINID deployment was requested and signer by a non approved signer.
-error UnapprovedSigner(address signer);
-/// A requested ONCHAINID deployment was requested with a signature revoked.
-error RevokedSignature(bytes signature);
-/// A requested ONCHAINID deployment was requested with a signature that expired.
-error ExpiredSignature(bytes signature);
-/// Attempted to revoke a signature that was already revoked.
-error SignatureAlreadyRevoked(bytes signature);
-/// Attempted to approve a signature that was not revoked.
-error SignatureNotRevoked(bytes signature);
+pragma solidity ^0.8.27;
+
+import { IdFactory } from "../factory/IdFactory.sol";
+import { Errors } from "../libraries/Errors.sol";
+import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
+import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
+import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
+import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
contract Gateway is Ownable {
- IdFactory public idFactory;
+
+ using ECDSA for bytes32;
+ using MessageHashUtils for bytes32;
+
+ IdFactory public immutable idFactory;
mapping(address => bool) public approvedSigners;
mapping(bytes => bool) public revokedSignatures;
@@ -42,15 +26,11 @@ contract Gateway is Ownable {
* @dev Constructor for the ONCHAINID Factory Gateway.
* @param idFactoryAddress the address of the factory to operate (the Gateway must be owner of the Factory).
*/
- constructor(address idFactoryAddress, address[] memory signersToApprove) Ownable() {
- if (idFactoryAddress == address(0)) {
- revert ZeroAddress();
- }
- if (signersToApprove.length > 10) {
- revert TooManySigners();
- }
+ constructor(address idFactoryAddress, address[] memory signersToApprove) Ownable(msg.sender) {
+ require(idFactoryAddress != address(0), Errors.ZeroAddress());
+ require(signersToApprove.length <= 10, Errors.TooManySigners());
- for (uint i = 0; i < signersToApprove.length; i++) {
+ for (uint256 i = 0; i < signersToApprove.length; i++) {
approvedSigners[signersToApprove[i]] = true;
}
@@ -64,13 +44,8 @@ contract Gateway is Ownable {
* @param signer the signer address to approve.
*/
function approveSigner(address signer) external onlyOwner {
- if (signer == address(0)) {
- revert ZeroAddress();
- }
-
- if (approvedSigners[signer]) {
- revert SignerAlreadyApproved(signer);
- }
+ require(signer != address(0), Errors.ZeroAddress());
+ require(!approvedSigners[signer], Errors.SignerAlreadyApproved(signer));
approvedSigners[signer] = true;
@@ -82,13 +57,8 @@ contract Gateway is Ownable {
* @param signer the signer address to revoke.
*/
function revokeSigner(address signer) external onlyOwner {
- if (signer == address(0)) {
- revert ZeroAddress();
- }
-
- if (!approvedSigners[signer]) {
- revert SignerAlreadyNotApproved(signer);
- }
+ require(signer != address(0), Errors.ZeroAddress());
+ require(approvedSigners[signer], Errors.SignerAlreadyNotApproved(signer));
delete approvedSigners[signer];
@@ -100,44 +70,32 @@ contract Gateway is Ownable {
* an approved public key. This method allow to deploy an ONCHAINID using a custom salt.
* @param identityOwner the address to set as a management key.
* @param salt to use for the deployment.
+ * @param identityType the type of the identity (see IdentityTypes library).
+ * @param claimAdders the list of addresses to add as CLAIM_ADDER keys on the identity.
* @param signatureExpiry the block timestamp where the signature will expire.
* @param signature the approval containing the salt and the identityOwner address.
*/
function deployIdentityWithSalt(
address identityOwner,
string memory salt,
+ uint256 identityType,
+ address[] calldata claimAdders,
uint256 signatureExpiry,
bytes calldata signature
) external returns (address) {
- if (identityOwner == address(0)) {
- revert ZeroAddress();
- }
+ require(identityOwner != address(0), Errors.ZeroAddress());
+ require(signatureExpiry == 0 || block.timestamp <= signatureExpiry, Errors.ExpiredSignature(signature));
- if (signatureExpiry != 0 && signatureExpiry < block.timestamp) {
- revert ExpiredSignature(signature);
- }
-
- address signer = ECDSA.recover(
- keccak256(
+ address signer = keccak256(
abi.encode(
- "Authorize ONCHAINID deployment",
- identityOwner,
- salt,
- signatureExpiry
+ "Authorize ONCHAINID deployment", identityOwner, salt, identityType, claimAdders, signatureExpiry
)
- ).toEthSignedMessageHash(),
- signature
- );
-
- if (!approvedSigners[signer]) {
- revert UnapprovedSigner(signer);
- }
+ ).toEthSignedMessageHash().recover(signature);
- if (revokedSignatures[signature]) {
- revert RevokedSignature(signature);
- }
+ require(approvedSigners[signer], Errors.UnapprovedSigner(signer));
+ require(!revokedSignatures[signature], Errors.RevokedSignature(signature));
- return idFactory.createIdentity(identityOwner, salt);
+ return idFactory.createIdentity(identityOwner, salt, identityType, claimAdders);
}
/**
@@ -148,6 +106,8 @@ contract Gateway is Ownable {
* @param identityOwner the address to set as a management key.
* @param salt to use for the deployment.
* @param managementKeys the list of management keys to add to the ONCHAINID.
+ * @param identityType the type of the identity (see IdentityTypes library).
+ * @param claimAdders the list of addresses to add as CLAIM_ADDER keys on the identity.
* @param signatureExpiry the block timestamp where the signature will expire.
* @param signature the approval containing the salt and the identityOwner address.
*/
@@ -155,51 +115,46 @@ contract Gateway is Ownable {
address identityOwner,
string memory salt,
bytes32[] calldata managementKeys,
+ uint256 identityType,
+ address[] calldata claimAdders,
uint256 signatureExpiry,
bytes calldata signature
) external returns (address) {
- if (identityOwner == address(0)) {
- revert ZeroAddress();
- }
-
- if (signatureExpiry != 0 && signatureExpiry < block.timestamp) {
- revert ExpiredSignature(signature);
- }
+ require(identityOwner != address(0), Errors.ZeroAddress());
+ require(signatureExpiry == 0 || block.timestamp <= signatureExpiry, Errors.ExpiredSignature(signature));
- address signer = ECDSA.recover(
- keccak256(
+ address signer = keccak256(
abi.encode(
"Authorize ONCHAINID deployment",
identityOwner,
salt,
managementKeys,
+ identityType,
+ claimAdders,
signatureExpiry
)
- ).toEthSignedMessageHash(),
- signature
- );
+ ).toEthSignedMessageHash().recover(signature);
- if (!approvedSigners[signer]) {
- revert UnapprovedSigner(signer);
- }
-
- if (revokedSignatures[signature]) {
- revert RevokedSignature(signature);
- }
+ require(approvedSigners[signer], Errors.UnapprovedSigner(signer));
+ require(!revokedSignatures[signature], Errors.RevokedSignature(signature));
- return idFactory.createIdentityWithManagementKeys(identityOwner, salt, managementKeys);
+ return
+ idFactory.createIdentityWithManagementKeys(identityOwner, salt, managementKeys, identityType, claimAdders);
}
/**
* @dev Deploy an ONCHAINID using a factory using the identityOwner address as salt.
* @param identityOwner the address to set as a management key.
+ * @param identityType the type of the identity (see IdentityTypes library).
+ * @param claimAdders the list of addresses to add as CLAIM_ADDER keys on the identity.
*/
- function deployIdentityForWallet(address identityOwner) external returns (address) {
- if (identityOwner == address(0)) {
- revert ZeroAddress();
- }
+ function deployIdentityForWallet(address identityOwner, uint256 identityType, address[] calldata claimAdders)
+ external
+ returns (address)
+ {
+ require(identityOwner != address(0), Errors.ZeroAddress());
- return idFactory.createIdentity(identityOwner, Strings.toHexString(identityOwner));
+ return idFactory.createIdentity(identityOwner, Strings.toHexString(identityOwner), identityType, claimAdders);
}
/**
@@ -207,9 +162,7 @@ contract Gateway is Ownable {
* @param signature the signature to revoke.
*/
function revokeSignature(bytes calldata signature) external onlyOwner {
- if (revokedSignatures[signature]) {
- revert SignatureAlreadyRevoked(signature);
- }
+ require(!revokedSignatures[signature], Errors.SignatureAlreadyRevoked(signature));
revokedSignatures[signature] = true;
@@ -221,9 +174,7 @@ contract Gateway is Ownable {
* @param signature the signature to approve.
*/
function approveSignature(bytes calldata signature) external onlyOwner {
- if (!revokedSignatures[signature]) {
- revert SignatureNotRevoked(signature);
- }
+ require(revokedSignatures[signature], Errors.SignatureNotRevoked(signature));
delete revokedSignatures[signature];
@@ -244,6 +195,7 @@ contract Gateway is Ownable {
*/
function callFactory(bytes memory data) external onlyOwner {
(bool success,) = address(idFactory).call(data);
- require(success, "Gateway: call to factory failed");
+ require(success, Errors.CallToFactoryFailed());
}
+
}
diff --git a/contracts/interface/IClaimIssuer.sol b/contracts/interface/IClaimIssuer.sol
index 31617d1f..703e2793 100644
--- a/contracts/interface/IClaimIssuer.sol
+++ b/contracts/interface/IClaimIssuer.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
import "./IIdentity.sol";
@@ -12,6 +12,20 @@ interface IClaimIssuer is IIdentity {
*/
event ClaimRevoked(bytes indexed signature);
+ /**
+ * @dev Emitted when a claim is successfully added to an identity contract by this claim issuer.
+ *
+ * This event is triggered after the claim has been validated and successfully added to the target
+ * identity contract through the execute mechanism. It provides a record of the claim issuance
+ * from the issuer's perspective.
+ *
+ * @param identity The address of the identity contract that received the claim
+ * @param topic The topic/type of the claim that was added
+ * @param signature The cryptographic signature of the claim data
+ * @param data The claim data that was signed and added
+ */
+ event ClaimAddedTo(address indexed identity, uint256 topic, bytes signature, bytes data);
+
/**
* @dev Revoke a claim previously issued, the claim is no longer considered as valid after revocation.
* @notice will fetch the claim from the identity contract (unsafe).
@@ -19,7 +33,7 @@ interface IClaimIssuer is IIdentity {
* @param _identity the address of the identity contract
* @return isRevoked true when the claim is revoked
*/
- function revokeClaim(bytes32 _claimId, address _identity) external returns(bool);
+ function revokeClaim(bytes32 _claimId, address _identity) external returns (bool);
/**
* @dev Revoke a claim previously issued, the claim is no longer considered as valid after revocation.
@@ -27,6 +41,43 @@ interface IClaimIssuer is IIdentity {
*/
function revokeClaimBySignature(bytes calldata signature) external;
+ /**
+ * @dev Adds a claim to a specified identity contract.
+ *
+ * This function validates the provided claim data against this issuer's signing keys and
+ * revocation status, then adds the claim to the target identity contract. The issuer is
+ * automatically set to this contract's address.
+ *
+ * The claim is added to the identity contract through the execute mechanism, which may
+ * require approval depending on the identity's key management configuration.
+ *
+ * Requirements:
+ * - Caller must have management key permissions
+ * - Contract must not be in library mode (delegatedOnly)
+ * - Claim signature must be valid and not revoked
+ * - Target identity contract must accept the claim addition
+ *
+ * @param _topic The topic/type of the claim
+ * @param _scheme The signature scheme used (typically KeyTypes.ECDSA for ECDSA)
+ * @param _signature The cryptographic signature of the claim data
+ * @param _data The actual claim data being attested
+ * @param _uri Optional URI pointing to additional claim information
+ * @param _identity The identity contract to receive the claim
+ *
+ * Emits a {ClaimAddedTo} event upon successful claim addition.
+ *
+ * @notice This function will revert if the claim is invalid or if the identity
+ * contract rejects the `execute()` call.
+ */
+ function addClaimTo(
+ uint256 _topic,
+ uint256 _scheme,
+ bytes calldata _signature,
+ bytes calldata _data,
+ string calldata _uri,
+ IIdentity _identity
+ ) external;
+
/**
* @dev Returns revocation status of a claim.
* @param _sig the signature of the claim
@@ -42,10 +93,9 @@ interface IClaimIssuer is IIdentity {
* @param data the data field of the claim
* @return claimValid true if the claim is valid, false otherwise
*/
- function isClaimValid(
- IIdentity _identity,
- uint256 claimTopic,
- bytes calldata sig,
- bytes calldata data)
- external view returns (bool);
+ function isClaimValid(IIdentity _identity, uint256 claimTopic, bytes calldata sig, bytes calldata data)
+ external
+ view
+ returns (bool);
+
}
diff --git a/contracts/interface/IERC734.sol b/contracts/interface/IERC734.sol
index e3c84d2b..1593829f 100644
--- a/contracts/interface/IERC734.sol
+++ b/contracts/interface/IERC734.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
/**
* @dev interface of the ERC734 (Key Holder) standard as defined in the EIP.
@@ -53,18 +53,18 @@ interface IERC734 {
*
* Triggers Event: `KeyAdded`
*
- * Specification: MUST only be done by keys of purpose 1, or the identity
+ * Specification: MUST only be done by keys of purpose KeyPurposes.MANAGEMENT, or the identity
* itself. If it's the identity itself, the approval process will determine its approval.
*/
function addKey(bytes32 _key, uint256 _purpose, uint256 _keyType) external returns (bool success);
/**
- * @dev Approves an execution.
- *
- * Triggers Event: `Approved`
- * Triggers on execution successful Event: `Executed`
- * Triggers on execution failure Event: `ExecutionFailed`
- */
+ * @dev Approves an execution.
+ *
+ * Triggers Event: `Approved`
+ * Triggers on execution successful Event: `Executed`
+ * Triggers on execution failure Event: `ExecutionFailed`
+ */
function approve(uint256 _id, bool _approve) external returns (bool success);
/**
@@ -72,7 +72,7 @@ interface IERC734 {
*
* Triggers Event: `KeyRemoved`
*
- * Specification: MUST only be done by keys of purpose 1, or the identity itself.
+ * Specification: MUST only be done by keys of purpose KeyPurposes.MANAGEMENT, or the identity itself.
* If it's the identity itself, the approval process will determine its approval.
*/
function removeKey(bytes32 _key, uint256 _purpose) external returns (bool success);
@@ -80,8 +80,8 @@ interface IERC734 {
/**
* @dev Passes an execution instruction to an ERC734 identity.
* How the execution is handled is up to the identity implementation:
- * An execution COULD be requested and require `approve` to be called with one or more keys of purpose 1 or 2 to
- * approve this execution.
+ * An execution COULD be requested and require `approve` to be called with one or more keys of purpose
+ * KeyPurposes.MANAGEMENT or KeyPurposes.ACTION to approve this execution.
* Execute COULD be used as the only accessor for `addKey` and `removeKey`.
*
* Triggers Event: ExecutionRequested
@@ -97,7 +97,7 @@ interface IERC734 {
/**
* @dev Returns the list of purposes associated with a key.
*/
- function getKeyPurposes(bytes32 _key) external view returns(uint256[] memory _purposes);
+ function getKeyPurposes(bytes32 _key) external view returns (uint256[] memory _purposes);
/**
* @dev Returns an array of public key bytes32 held by this identity.
@@ -108,4 +108,5 @@ interface IERC734 {
* @dev Returns TRUE if a key is present and has the given purpose. If the key is not present it returns FALSE.
*/
function keyHasPurpose(bytes32 _key, uint256 _purpose) external view returns (bool exists);
+
}
diff --git a/contracts/interface/IERC735.sol b/contracts/interface/IERC735.sol
index ddf4186c..43aaf49c 100644
--- a/contracts/interface/IERC735.sol
+++ b/contracts/interface/IERC735.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
/**
* @dev interface of the ERC735 (Claim Holder) standard as defined in the EIP.
@@ -18,7 +18,8 @@ interface IERC735 {
address indexed issuer,
bytes signature,
bytes data,
- string uri);
+ string uri
+ );
/**
* @dev Emitted when a claim was removed.
@@ -32,7 +33,8 @@ interface IERC735 {
address indexed issuer,
bytes signature,
bytes data,
- string uri);
+ string uri
+ );
/**
* @dev Emitted when a claim was changed.
@@ -46,7 +48,8 @@ interface IERC735 {
address indexed issuer,
bytes signature,
bytes data,
- string uri);
+ string uri
+ );
/**
* @dev Add or update a claim.
@@ -65,8 +68,8 @@ interface IERC735 {
address issuer,
bytes calldata _signature,
bytes calldata _data,
- string calldata _uri)
- external returns (bytes32 claimRequestId);
+ string calldata _uri
+ ) external returns (bytes32 claimRequestId);
/**
* @dev Removes a claim.
@@ -83,16 +86,20 @@ interface IERC735 {
* Claim IDs are generated using `keccak256(abi.encode(address issuer_address, uint256 topic))`.
*/
function getClaim(bytes32 _claimId)
- external view returns(
- uint256 topic,
- uint256 scheme,
- address issuer,
- bytes memory signature,
- bytes memory data,
- string memory uri);
+ external
+ view
+ returns (
+ uint256 topic,
+ uint256 scheme,
+ address issuer,
+ bytes memory signature,
+ bytes memory data,
+ string memory uri
+ );
/**
* @dev Returns an array of claim IDs by topic.
*/
- function getClaimIdsByTopic(uint256 _topic) external view returns(bytes32[] memory claimIds);
+ function getClaimIdsByTopic(uint256 _topic) external view returns (bytes32[] memory claimIds);
+
}
diff --git a/contracts/interface/IIdentity.sol b/contracts/interface/IIdentity.sol
index 780a0fe0..b1da03cd 100644
--- a/contracts/interface/IIdentity.sol
+++ b/contracts/interface/IIdentity.sol
@@ -1,11 +1,12 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
import "./IERC734.sol";
import "./IERC735.sol";
// solhint-disable-next-line no-empty-blocks
interface IIdentity is IERC734, IERC735 {
+
/**
* @dev Checks if a claim is valid.
* @param _identity the identity contract related to the claim
@@ -14,10 +15,15 @@ interface IIdentity is IERC734, IERC735 {
* @param data the data field of the claim
* @return claimValid true if the claim is valid, false otherwise
*/
- function isClaimValid(
- IIdentity _identity,
- uint256 claimTopic,
- bytes calldata sig,
- bytes calldata data)
- external view returns (bool);
+ function isClaimValid(IIdentity _identity, uint256 claimTopic, bytes calldata sig, bytes calldata data)
+ external
+ view
+ returns (bool);
+
+ /**
+ * @dev Returns the identity type set at initialization.
+ * @return The identity type (see IdentityTypes library)
+ */
+ function getIdentityType() external view returns (uint256);
+
}
diff --git a/contracts/interface/IIdentityUtilities.sol b/contracts/interface/IIdentityUtilities.sol
new file mode 100644
index 00000000..4afeacd9
--- /dev/null
+++ b/contracts/interface/IIdentityUtilities.sol
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity 0.8.27;
+
+/// @title IIdentityUtilities
+/// @notice Interface for a schema registry that maps topic IDs to structured metadata schemas
+/// @dev Each topic is uniquely identified and contains ABI-encoded arrays of field names and types
+interface IIdentityUtilities {
+
+ /**
+ * @notice Struct that defines a registered topic schema
+ * @param name Human-readable name of the topic
+ * @param encodedFieldNames ABI-encoded string array representing field names
+ * @param encodedFieldTypes ABI-encoded string array representing field types (e.g. "uint256", "string[]")
+ */
+ struct TopicInfo {
+ string name;
+ bytes encodedFieldNames;
+ bytes encodedFieldTypes;
+ }
+
+ struct ClaimInfo {
+ TopicInfo topic;
+ bool isValid;
+ bytes32 claimId;
+ uint256 scheme;
+ address issuer;
+ bytes signature;
+ bytes data;
+ string uri;
+ }
+ /**
+ * @notice Emitted when a new topic is added to the registry
+ * @param topicId The unique identifier for the topic
+ * @param name Human-readable name of the topic
+ * @param encodedFieldNames ABI-encoded string[] representing the names of the fields
+ * @param encodedFieldTypes ABI-encoded string[] representing the types of the fields
+ */
+ event TopicAdded(uint256 indexed topicId, string name, bytes encodedFieldNames, bytes encodedFieldTypes);
+
+ /**
+ * @notice Emitted when an existing topic is updated
+ * @param topicId The ID of the topic that was updated
+ * @param name New human-readable name of the topic
+ * @param encodedFieldNames Updated ABI-encoded string[] of field names
+ * @param encodedFieldTypes Updated ABI-encoded string[] of field types
+ */
+ event TopicUpdated(uint256 indexed topicId, string name, bytes encodedFieldNames, bytes encodedFieldTypes);
+
+ /**
+ * @notice Emitted when a topic is removed from the registry
+ * @param topicId The ID of the removed topic
+ */
+ event TopicRemoved(uint256 indexed topicId);
+
+ /**
+ * @notice Registers a new topic with its name and schema definition
+ * @param topicId The unique identifier of the topic to add
+ * @param name Human-readable name of the topic
+ * @param encodedFieldNames ABI-encoded string[] of field names
+ * @param encodedFieldTypes ABI-encoded string[] of field types
+ */
+ function addTopic(
+ uint256 topicId,
+ string calldata name,
+ bytes calldata encodedFieldNames,
+ bytes calldata encodedFieldTypes
+ ) external;
+
+ /**
+ * @notice Updates an existing topic's name and schema
+ * @param topicId The ID of the topic to update
+ * @param name New name of the topic
+ * @param encodedFieldNames New ABI-encoded string[] of field names
+ * @param encodedFieldTypes New ABI-encoded string[] of field types
+ */
+ function updateTopic(
+ uint256 topicId,
+ string calldata name,
+ bytes calldata encodedFieldNames,
+ bytes calldata encodedFieldTypes
+ ) external;
+
+ /**
+ * @notice Removes a topic from the registry
+ * @param topicId The ID of the topic to remove
+ */
+ function removeTopic(uint256 topicId) external;
+
+ /**
+ * @notice Retrieves the raw TopicInfo struct associated with a given topic ID
+ * @param topicId The ID of the topic to retrieve
+ * @return topic The full TopicInfo struct containing the name, encoded field names, and types
+ */
+ function getTopic(uint256 topicId) external view returns (TopicInfo memory topic);
+
+ /**
+ * @notice Returns the decoded schema of a topic
+ * @param topicId The ID of the topic
+ * @return fieldNames Decoded string array of field names
+ * @return fieldTypes Decoded string array of field types
+ */
+ function getSchema(uint256 topicId) external view returns (string[] memory fieldNames, string[] memory fieldTypes);
+
+ /**
+ * @notice Returns an array of TopicInfo structs for the given topic IDs
+ * @param topicIds Array of topic IDs to get TopicInfo structs for
+ * @return TopicInfo[] Array of TopicInfo structs corresponding to the input topic IDs
+ */
+ function getTopicInfos(uint256[] calldata topicIds) external view returns (TopicInfo[] memory);
+
+}
diff --git a/contracts/interface/IImplementationAuthority.sol b/contracts/interface/IImplementationAuthority.sol
deleted file mode 100644
index 30704aeb..00000000
--- a/contracts/interface/IImplementationAuthority.sol
+++ /dev/null
@@ -1,22 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-
-pragma solidity 0.8.17;
-
-interface IImplementationAuthority {
-
- // event emitted when the implementation contract is updated
- event UpdatedImplementation(address newAddress);
-
- /**
- * @dev updates the address used as implementation by the proxies linked
- * to this ImplementationAuthority contract
- * @param _newImplementation the address of the new implementation contract
- * only Owner can call
- */
- function updateImplementation(address _newImplementation) external;
-
- /**
- * @dev returns the address of the implementation
- */
- function getImplementation() external view returns(address);
-}
diff --git a/contracts/libraries/Errors.sol b/contracts/libraries/Errors.sol
new file mode 100644
index 00000000..ddd01af7
--- /dev/null
+++ b/contracts/libraries/Errors.sol
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+/// @title Errors
+/// @notice Library containing all custom errors the protocol may revert with
+library Errors {
+
+ /* ----- Generic ----- */
+
+ /// @notice Reverts if the address is zero
+ error ZeroAddress();
+
+ /* ----- IdFactory ----- */
+
+ /// @notice Reverts if the factory is already registered
+ error AlreadyAFactory(address factory);
+
+ /// @notice Reverts if the function is called on the sender address
+ error CannotBeCalledOnSenderAddress();
+
+ /// @notice Reverts if the list of keys is empty
+ error EmptyListOfKeys();
+
+ /// @notice Reverts if the string is empty
+ error EmptyString();
+
+ /// @notice Reverts if the address is not a factory
+ error NotAFactory(address factory);
+
+ /// @notice Reverts if the maximum number of wallets per identity is exceeded
+ error MaxWalletsPerIdentityExceeded();
+
+ /// @notice Reverts if the only linked wallet tries to unlink
+ error OnlyLinkedWalletCanUnlink();
+
+ /// @notice Reverts if the account is not authorized to call the function
+ error OwnableUnauthorizedAccount(address account); // TODO: OZ
+
+ /// @notice Reverts if the salt is taken
+ error SaltTaken(string salt);
+
+ /// @notice Reverts if the token is already linked
+ error TokenAlreadyLinked(address token);
+
+ /// @notice Reverts if the wallet is already linked to an identity
+ error WalletAlreadyLinkedToIdentity(address wallet);
+
+ /// @notice Reverts if the wallet is also listed in management keys
+ error WalletAlsoListedInManagementKeys(address wallet);
+
+ /// @notice Reverts if the wallet is not linked to an identity
+ error WalletNotLinkedToIdentity(address wallet);
+
+ /* ----- Gateway ----- */
+
+ /// @notice The maximum number of signers was reached at deployment.
+ error TooManySigners();
+
+ /// @notice The signed attempted to add was already approved.
+ error SignerAlreadyApproved(address signer);
+
+ /// @notice The signed attempted to remove was not approved.
+ error SignerAlreadyNotApproved(address signer);
+
+ /// @notice A requested ONCHAINID deployment was requested and signer by a non approved signer.
+ error UnapprovedSigner(address signer);
+
+ /// @notice A requested ONCHAINID deployment was requested with a signature revoked.
+ error RevokedSignature(bytes signature);
+
+ /// @notice A requested ONCHAINID deployment was requested with a signature that expired.
+ error ExpiredSignature(bytes signature);
+
+ /// @notice Attempted to revoke a signature that was already revoked.
+ error SignatureAlreadyRevoked(bytes signature);
+
+ /// @notice Attempted to approve a signature that was not revoked.
+ error SignatureNotRevoked(bytes signature);
+
+ /// @notice A call to the factory failed.
+ error CallToFactoryFailed();
+
+ /* ----- Verifier ----- */
+
+ /// @notice The claim topic already exists.
+ error ClaimTopicAlreadyExists(uint256 claimTopic);
+
+ /// @notice The maximum number of claim topics is exceeded.
+ error MaxClaimTopicsExceeded();
+
+ /// @notice The maximum number of trusted issuers is exceeded.
+ error MaxTrustedIssuersExceeded();
+
+ /// @notice The trusted issuer already exists.
+ error TrustedIssuerAlreadyExists(address trustedIssuer);
+
+ /// @notice The trusted claim topics cannot be empty.
+ error TrustedClaimTopicsCannotBeEmpty();
+
+ /// @notice The trusted issuer does not exist.
+ error NotATrustedIssuer(address trustedIssuer);
+
+ /* ----- ClaimIssuer ----- */
+
+ /// @notice The claim already exists.
+ error ClaimAlreadyRevoked();
+
+ /* ----- Identity ----- */
+
+ /// @notice Interacting with the library contract is forbidden.
+ error InteractingWithLibraryContractForbidden();
+
+ /// @notice The sender does not have the management key.
+ error SenderDoesNotHaveManagementKey();
+
+ /// @notice The sender does not have the claim signer key.
+ error SenderDoesNotHaveClaimSignerKey();
+
+ /// @notice The sender does not have the action key.
+ error SenderDoesNotHaveActionKey();
+
+ /// @notice The initial key was already setup.
+ error InitialKeyAlreadySetup();
+
+ /// @notice The key is not registered.
+ error KeyNotRegistered(bytes32 key);
+
+ /// @notice The key already has the purpose.
+ error KeyAlreadyHasPurpose(bytes32 key, uint256 purpose);
+
+ /// @notice The key does not have the purpose.
+ error KeyDoesNotHavePurpose(bytes32 key, uint256 purpose);
+
+ /// @notice The claim is not registered.
+ error ClaimNotRegistered(bytes32 claimId);
+
+ /// @notice The request is not valid.
+ error InvalidRequestId();
+
+ /// @notice The request is already executed.
+ error RequestAlreadyExecuted();
+
+ /// @notice The claim is invalid.
+ error InvalidClaim();
+
+ /* ----- IdentityUtilities ----- */
+
+ /// @notice 0 is not a valid topic.
+ error EmptyTopic();
+
+ /// @notice 0 is not a valid Format.
+ error EmptyFormat();
+
+ /// @notice Name cannot be left empty.
+ error EmptyName();
+
+ /// @notice Use update function for existing topics.
+ error TopicAlreadyExists(uint256 topic);
+
+ /// @notice Topic is not registered yet.
+ error TopicNotFound(uint256 topic);
+
+ /* ----- ClaimIssuerFactory ----- */
+
+ /// @notice The claim issuer already exists.
+ error ClaimIssuerAlreadyDeployed(address managementKey);
+
+ /// @notice The address is blacklisted.
+ error Blacklisted(address addr);
+
+ /// @notice The call failed.
+ error CallFailed();
+
+}
diff --git a/contracts/libraries/FormatResolver.sol b/contracts/libraries/FormatResolver.sol
new file mode 100644
index 00000000..43bbbd0a
--- /dev/null
+++ b/contracts/libraries/FormatResolver.sol
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+library FormatResolver {
+
+ /// @notice The formats we currently support
+ enum FormatType {
+ Unknown, // 0
+ StringType, // 1
+ TripleUint, // 2 => struct {uint256;uint256;uint256}
+ Uint16Type, // 3
+ StringArray, // 4
+ AddressType // 5
+ }
+
+ /// @notice Turn format integer into a `FormatType`
+ function resolve(uint256 formatId) internal pure returns (FormatType) {
+ if (formatId == 1) return FormatType.StringType;
+ if (formatId == 2) return FormatType.TripleUint;
+ if (formatId == 3) return FormatType.Uint16Type;
+ if (formatId == 4) return FormatType.StringArray;
+ if (formatId == 5) return FormatType.AddressType;
+ return FormatType.Unknown;
+ }
+
+ /// @notice Decode a `string` from raw bytes
+ function decodeString(bytes memory data) internal pure returns (string memory) {
+ return abi.decode(data, (string));
+ }
+
+ /// @notice Decode `{uint256;uint256;uint256}` struct from raw bytes
+ function decodeTripleUint(bytes memory data) internal pure returns (uint256 a, uint256 b, uint256 c) {
+ return abi.decode(data, (uint256, uint256, uint256));
+ }
+
+ /// @notice Decode a `uint16` (packed as uint256 in ABI) from raw bytes
+ function decodeUint16(bytes memory data) internal pure returns (uint16) {
+ uint256 raw = abi.decode(data, (uint256));
+ require(raw <= type(uint16).max, "FormatResolver: overflow");
+ return uint16(raw);
+ }
+
+ /// @notice Decode a `string[]` from raw bytes
+ function decodeStringArray(bytes memory data) internal pure returns (string[] memory) {
+ return abi.decode(data, (string[]));
+ }
+
+ /// @notice Decode an `address` from raw bytes
+ function decodeAddress(bytes memory data) internal pure returns (address) {
+ return abi.decode(data, (address));
+ }
+
+}
diff --git a/contracts/libraries/IdentityTypes.sol b/contracts/libraries/IdentityTypes.sol
new file mode 100644
index 00000000..202a357c
--- /dev/null
+++ b/contracts/libraries/IdentityTypes.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+/// @title IdentityTypes
+/// @notice Constants for Identity Types
+library IdentityTypes {
+
+ /// @dev 1: ASSET identity, used for token identities
+ uint256 internal constant ASSET = 1;
+
+ /// @dev 2: INDIVIDUAL identity
+ uint256 internal constant INDIVIDUAL = 2;
+
+ /// @dev 3: CORPORATE identity
+ uint256 internal constant CORPORATE = 3;
+
+ /// @dev 4: IOT identity
+ uint256 internal constant IOT = 4;
+
+ /// @dev 5: CLAIM_ISSUER identity
+ uint256 internal constant CLAIM_ISSUER = 5;
+
+ /// @dev 6: SMART_CONTRACT identity (DeFi protocols, vaults, bridges, escrows, etc.)
+ uint256 internal constant SMART_CONTRACT = 6;
+
+ /// @dev 7: PUBLIC_AUTHORITY identity (regulators, courts, government issuers, etc.)
+ uint256 internal constant PUBLIC_AUTHORITY = 7;
+
+ /// @dev 8: AI_AGENT identity
+ uint256 internal constant AI_AGENT = 8;
+
+}
diff --git a/contracts/libraries/KeyPurposes.sol b/contracts/libraries/KeyPurposes.sol
new file mode 100644
index 00000000..cfbfb212
--- /dev/null
+++ b/contracts/libraries/KeyPurposes.sol
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+/// @title KeyPurposes
+/// @notice Constants for Key Purposes
+library KeyPurposes {
+
+ /// @dev 1: MANAGEMENT keys, which can manage the identity
+ uint256 internal constant MANAGEMENT = 1;
+
+ /// @dev 2: ACTION keys, which perform actions in this identities name (signing, logins, transactions, etc.)
+ uint256 internal constant ACTION = 2;
+
+ /// @dev 3: CLAIM signer keys, used to sign claims on other identities which need to be revokable.
+ uint256 internal constant CLAIM_SIGNER = 3;
+
+ /// @dev 4: ENCRYPTION keys, used to encrypt data e.g. hold in claims.
+ uint256 internal constant ENCRYPTION = 4;
+
+ /// @dev 5: CLAIM_ADDER key, can add claims but cannot remove them.
+ uint256 internal constant CLAIM_ADDER = 5;
+
+}
diff --git a/contracts/libraries/KeyTypes.sol b/contracts/libraries/KeyTypes.sol
new file mode 100644
index 00000000..064e24ce
--- /dev/null
+++ b/contracts/libraries/KeyTypes.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+/// @title KeyTypes
+/// @notice Constants for Key Types
+library KeyTypes {
+
+ /// @dev 1: ECDSA
+ uint256 internal constant ECDSA = 1;
+
+ /// @dev 2: RSA
+ uint256 internal constant RSA = 2;
+
+}
diff --git a/contracts/proxy/ClaimIssuerProxy.sol b/contracts/proxy/ClaimIssuerProxy.sol
new file mode 100644
index 00000000..55468c15
--- /dev/null
+++ b/contracts/proxy/ClaimIssuerProxy.sol
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+
+/**
+ * @title ClaimIssuerProxy
+ * @dev Proxy contract for ClaimIssuer using ERC1967 standard
+ * This proxy delegates all calls to the implementation contract
+ */
+contract ClaimIssuerProxy is ERC1967Proxy {
+
+ /**
+ * @dev Constructor for ClaimIssuerProxy
+ * @param implementation The address of the implementation contract
+ * @param data The encoded function call to initialize the proxy
+ */
+ constructor(address implementation, bytes memory data) ERC1967Proxy(implementation, data) { }
+
+}
diff --git a/contracts/proxy/IdentityProxy.sol b/contracts/proxy/IdentityProxy.sol
index 4afc6dd5..e5172c68 100644
--- a/contracts/proxy/IdentityProxy.sol
+++ b/contracts/proxy/IdentityProxy.sol
@@ -1,66 +1,16 @@
// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
-pragma solidity 0.8.17;
+import { BeaconProxy } from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
-import "../interface/IImplementationAuthority.sol";
+import { Identity } from "../Identity.sol";
-contract IdentityProxy {
+contract IdentityProxy is BeaconProxy {
- /**
- * @dev constructor of the proxy Identity contract
- * @param _implementationAuthority the implementation Authority contract address
- * @param initialManagementKey the management key at deployment
- * the proxy is going to use the logic deployed on the implementation contract
- * deployed at an address listed in the ImplementationAuthority contract
- */
- constructor(address _implementationAuthority, address initialManagementKey) {
- require(_implementationAuthority != address(0), "invalid argument - zero address");
- require(initialManagementKey != address(0), "invalid argument - zero address");
+ constructor(address _implementationAuthority, address _initialManagementKey, uint256 _identityType)
+ BeaconProxy(
+ _implementationAuthority, abi.encodeCall(Identity.initialize, (_initialManagementKey, _identityType))
+ )
+ { }
- // solhint-disable-next-line no-inline-assembly
- assembly {
- sstore(0x821f3e4d3d679f19eacc940c87acf846ea6eae24a63058ea750304437a62aafc, _implementationAuthority)
- }
-
- address logic = IImplementationAuthority(_implementationAuthority).getImplementation();
-
- // solhint-disable-next-line avoid-low-level-calls
- (bool success,) = logic.delegatecall(abi.encodeWithSignature("initialize(address)", initialManagementKey));
- require(success, "Initialization failed.");
- }
-
- /**
- * @dev fallback proxy function used for any transaction call that is made using
- * the Identity contract ABI and called on the proxy contract
- * The proxy will update its local storage depending on the behaviour requested
- * by the implementation contract given by the Implementation Authority
- */
- // solhint-disable-next-line no-complex-fallback
- fallback() external payable {
- address logic = IImplementationAuthority(implementationAuthority()).getImplementation();
-
- // solhint-disable-next-line no-inline-assembly
- assembly {
- calldatacopy(0x0, 0x0, calldatasize())
- let success := delegatecall(sub(gas(), 10000), logic, 0x0, calldatasize(), 0, 0)
- let retSz := returndatasize()
- returndatacopy(0, 0, retSz)
- switch success
- case 0 {
- revert(0, retSz)
- }
- default {
- return(0, retSz)
- }
- }
- }
-
- function implementationAuthority() public view returns(address) {
- address implemAuth;
- // solhint-disable-next-line no-inline-assembly
- assembly {
- implemAuth := sload(0x821f3e4d3d679f19eacc940c87acf846ea6eae24a63058ea750304437a62aafc)
- }
- return implemAuth;
- }
}
diff --git a/contracts/proxy/IdentityUtilitiesProxy.sol b/contracts/proxy/IdentityUtilitiesProxy.sol
new file mode 100644
index 00000000..8e9ee7ae
--- /dev/null
+++ b/contracts/proxy/IdentityUtilitiesProxy.sol
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+
+contract IdentityUtilitiesProxy is ERC1967Proxy {
+
+ // solhint-disable-next-line no-empty-blocks
+ constructor(address implementation, bytes memory _data) ERC1967Proxy(implementation, _data) { }
+
+}
diff --git a/contracts/proxy/ImplementationAuthority.sol b/contracts/proxy/ImplementationAuthority.sol
index 6713a96b..782c8dd5 100644
--- a/contracts/proxy/ImplementationAuthority.sol
+++ b/contracts/proxy/ImplementationAuthority.sol
@@ -1,34 +1,10 @@
// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
-pragma solidity 0.8.17;
+import { UpgradeableBeacon } from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
-import "../interface/IImplementationAuthority.sol";
-import "@openzeppelin/contracts/access/Ownable.sol";
+contract ImplementationAuthority is UpgradeableBeacon {
-contract ImplementationAuthority is IImplementationAuthority, Ownable {
+ constructor(address implementation) UpgradeableBeacon(implementation, msg.sender) { }
- // the address of implementation of ONCHAINID
- address internal _implementation;
-
- constructor(address implementation) {
- require(implementation != address(0), "invalid argument - zero address");
- _implementation = implementation;
- emit UpdatedImplementation(implementation);
- }
-
- /**
- * @dev See {IImplementationAuthority-updateImplementation}.
- */
- function updateImplementation(address _newImplementation) external override onlyOwner {
- require(_newImplementation != address(0), "invalid argument - zero address");
- _implementation = _newImplementation;
- emit UpdatedImplementation(_newImplementation);
- }
-
- /**
- * @dev See {IImplementationAuthority-getImplementation}.
- */
- function getImplementation() external override view returns(address) {
- return _implementation;
- }
}
diff --git a/contracts/storage/Storage.sol b/contracts/storage/Storage.sol
deleted file mode 100644
index 435ef32c..00000000
--- a/contracts/storage/Storage.sol
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
-import "./Structs.sol";
-
-contract Storage is Structs {
- // nonce used by the execute/approve function
- uint256 internal _executionNonce;
-
- // keys as defined by IERC734
- mapping(bytes32 => Key) internal _keys;
-
- // keys for a given purpose
- // purpose 1 = MANAGEMENT
- // purpose 2 = ACTION
- // purpose 3 = CLAIM
- mapping(uint256 => bytes32[]) internal _keysByPurpose;
-
- // execution data
- mapping(uint256 => Execution) internal _executions;
-
- // claims held by the ONCHAINID
- mapping(bytes32 => Claim) internal _claims;
-
- // array of claims for a given topic
- mapping(uint256 => bytes32[]) internal _claimsByTopic;
-
- // status on initialization
- bool internal _initialized = false;
-
- // status on potential interactions with the contract
- bool internal _canInteract = false;
-
- /**
- * @dev This empty reserved space is put in place to allow future versions to add new
- * variables without shifting down storage in the inheritance chain.
- */
- uint256[49] private __gap;
-}
diff --git a/contracts/storage/Structs.sol b/contracts/storage/Structs.sol
index bf7c49aa..974ca6f2 100644
--- a/contracts/storage/Structs.sol
+++ b/contracts/storage/Structs.sol
@@ -1,35 +1,39 @@
// SPDX-License-Identifier: GPL-3.0
-pragma solidity 0.8.17;
+pragma solidity ^0.8.27;
+
+import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
contract Structs {
- /**
- * @dev Definition of the structure of a Key.
- *
- * Specification: Keys are cryptographic public keys, or contract addresses associated with this identity.
- * The structure should be as follows:
- * key: A public key owned by this identity
- * purposes: uint256[] Array of the key purposes, like 1 = MANAGEMENT, 2 = EXECUTION
- * keyType: The type of key used, which would be a uint256 for different key types. e.g. 1 = ECDSA, 2 = RSA, etc.
- * key: bytes32 The public key. // Its the Keccak256 hash of the key
- */
+ /**
+ * @dev Definition of the structure of a Key.
+ *
+ * Specification: Keys are cryptographic public keys, or contract addresses associated with this identity.
+ * The structure should be as follows:
+ * key: A public key owned by this identity
+ * purposes: uint256[] Array of the key purposes, like KeyPurposes.MANAGEMENT = MANAGEMENT,
+ * KeyPurposes.ACTION = ACTION
+ * keyType: The type of key used, which would be a uint256 for different key types. e.g. KeyTypes.ECDSA = ECDSA,
+ * KeyTypes.RSA = RSA, etc.
+ * key: bytes32 The public key. // Its the Keccak256 hash of the key
+ */
struct Key {
- uint256[] purposes;
+ EnumerableSet.UintSet purposes;
uint256 keyType;
bytes32 key;
}
/**
- * @dev Definition of the structure of an Execution
- *
- * Specification: Executions are requests for transactions to be issued by the ONCHAINID
- * to: address of contract to interact with, can be address(this)
- * value: ETH to transfer with the transaction
- * data: payload of the transaction to execute
- * approved: approval status of the Execution
- * executed: execution status of the Execution (set as false when the Execution is created
- * and updated to true when the Execution is processed)
- */
+ * @dev Definition of the structure of an Execution
+ *
+ * Specification: Executions are requests for transactions to be issued by the ONCHAINID
+ * to: address of contract to interact with, can be address(this)
+ * value: ETH to transfer with the transaction
+ * data: payload of the transaction to execute
+ * approved: approval status of the Execution
+ * executed: execution status of the Execution (set as false when the Execution is created
+ * and updated to true when the Execution is processed)
+ */
struct Execution {
address to;
uint256 value;
@@ -38,28 +42,30 @@ contract Structs {
bool executed;
}
- /**
- * @dev Definition of the structure of a Claim.
- *
- * Specification: Claims are information an issuer has about the identity holder.
- * The structure should be as follows:
- * claim: A claim published for the Identity.
- * topic: A uint256 number which represents the topic of the claim. (e.g. 1 biometric, 2 residence (ToBeDefined:
- * number schemes, sub topics based on number ranges??))
- * scheme : The scheme with which this claim SHOULD be verified or how it should be processed. Its a uint256 for
- * different schemes. E.g. could 3 mean contract verification, where the data will be call data, and the issuer a
- * contract address to call (ToBeDefined). Those can also mean different key types e.g. 1 = ECDSA, 2 = RSA, etc.
- * (ToBeDefined)
- * issuer: The issuers identity contract address, or the address used to sign the above signature. If an
- * identity contract, it should hold the key with which the above message was signed, if the key is not present
- * anymore, the claim SHOULD be treated as invalid. The issuer can also be a contract address itself, at which the
- * claim can be verified using the call data.
- * signature: Signature which is the proof that the claim issuer issued a claim of topic for this identity. it
- * MUST be a signed message of the following structure: `keccak256(abi.encode(identityHolder_address, topic, data))`
- * data: The hash of the claim data, sitting in another location, a bit-mask, call data, or actual data based on
- * the claim scheme.
- * uri: The location of the claim, this can be HTTP links, swarm hashes, IPFS hashes, and such.
- */
+ /**
+ * @dev Definition of the structure of a Claim.
+ *
+ * Specification: Claims are information an issuer has about the identity holder.
+ * The structure should be as follows:
+ * claim: A claim published for the Identity.
+ * topic: A uint256 number which represents the topic of the claim. (e.g. biometric,
+ * residence (ToBeDefined: number schemes, sub topics based on number ranges??))
+ * scheme : The scheme with which this claim SHOULD be verified or how it should be processed. Its a uint256 for
+ * different schemes. E.g. could mean contract verification, where the data will be call data, and the issuer a
+ * contract address to call (ToBeDefined). Those can also mean different key types e.g. KeyTypes.ECDSA = ECDSA,
+ * KeyTypes.RSA = RSA, etc.
+ * (ToBeDefined)
+ * issuer: The issuers identity contract address, or the address used to sign the above signature. If an
+ * identity contract, it should hold the key with which the above message was signed, if the key is not present
+ * anymore, the claim SHOULD be treated as invalid. The issuer can also be a contract address itself, at which the
+ * claim can be verified using the call data.
+ * signature: Signature which is the proof that the claim issuer issued a claim of topic for this identity. it
+ * MUST be a signed message of the following structure:
+ * `keccak256(abi.encode(identityHolder_address, topic, data))`
+ * data: The hash of the claim data, sitting in another location, a bit-mask, call data, or actual data based on
+ * the claim scheme.
+ * uri: The location of the claim, this can be HTTP links, swarm hashes, IPFS hashes, and such.
+ */
struct Claim {
uint256 topic;
uint256 scheme;
@@ -68,4 +74,5 @@ contract Structs {
bytes data;
string uri;
}
+
}
diff --git a/contracts/verifiers/Verifier.sol b/contracts/verifiers/Verifier.sol
deleted file mode 100644
index 88af962a..00000000
--- a/contracts/verifiers/Verifier.sol
+++ /dev/null
@@ -1,283 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-
-pragma solidity 0.8.17;
-
-import "@openzeppelin/contracts/access/Ownable.sol";
-import "../interface/IClaimIssuer.sol";
-
-contract Verifier is Ownable {
- /// @dev All topics of claims required to pass verification.
- uint256[] public requiredClaimTopics;
-
- /// @dev Array containing all TrustedIssuers identity contract address allowed to issue claims required.
- IClaimIssuer[] public trustedIssuers;
-
- /// @dev Mapping between a trusted issuer address and the topics of claims they are trusted for.
- mapping(address => uint256[]) public trustedIssuerClaimTopics;
-
- /// @dev Mapping between a claim topic and the trusted issuers trusted for it.
- mapping(uint256 => IClaimIssuer[]) public claimTopicsToTrustedIssuers;
-
- /**
- * this event is emitted when a claim topic has been added to the requirement list
- * the event is emitted by the 'addClaimTopic' function
- * `claimTopic` is the required claim topic added
- */
- event ClaimTopicAdded(uint256 indexed claimTopic);
-
- /**
- * this event is emitted when a claim topic has been removed from the requirement list
- * the event is emitted by the 'removeClaimTopic' function
- * `claimTopic` is the required claim removed
- */
- event ClaimTopicRemoved(uint256 indexed claimTopic);
-
- /**
- * this event is emitted when an issuer is added to the trusted list.
- * the event is emitted by the addTrustedIssuer function
- * `trustedIssuer` is the address of the trusted issuer's ClaimIssuer contract
- * `claimTopics` is the set of claims that the trusted issuer is allowed to emit
- */
- event TrustedIssuerAdded(IClaimIssuer indexed trustedIssuer, uint256[] claimTopics);
-
- /**
- * this event is emitted when an issuer is removed from the trusted list.
- * the event is emitted by the removeTrustedIssuer function
- * `trustedIssuer` is the address of the trusted issuer's ClaimIssuer contract
- */
- event TrustedIssuerRemoved(IClaimIssuer indexed trustedIssuer);
-
- /**
- * this event is emitted when the set of claim topics is changed for a given trusted issuer.
- * the event is emitted by the updateIssuerClaimTopics function
- * `trustedIssuer` is the address of the trusted issuer's ClaimIssuer contract
- * `claimTopics` is the set of claims that the trusted issuer is allowed to emit
- */
- event ClaimTopicsUpdated(IClaimIssuer indexed trustedIssuer, uint256[] claimTopics);
-
- modifier onlyVerifiedSender() {
- require(verify(_msgSender()), "sender is not verified");
- _;
- }
-
- /**
- * @dev See {IClaimTopicsRegistry-removeClaimTopic}.
- */
- function addClaimTopic(uint256 claimTopic) public onlyOwner {
- uint256 length = requiredClaimTopics.length;
- require(length < 15, "cannot require more than 15 topics");
- for (uint256 i = 0; i < length; i++) {
- require(requiredClaimTopics[i] != claimTopic, "claimTopic already exists");
- }
- requiredClaimTopics.push(claimTopic);
- emit ClaimTopicAdded(claimTopic);
- }
-
- /**
- * @dev See {IClaimTopicsRegistry-getClaimTopics}.
- */
- function removeClaimTopic(uint256 claimTopic) public onlyOwner {
- uint256 length = requiredClaimTopics.length;
- for (uint256 i = 0; i < length; i++) {
- if (requiredClaimTopics[i] == claimTopic) {
- requiredClaimTopics[i] = requiredClaimTopics[length - 1];
- requiredClaimTopics.pop();
- emit ClaimTopicRemoved(claimTopic);
- break;
- }
- }
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-addTrustedIssuer}.
- */
- function addTrustedIssuer(IClaimIssuer trustedIssuer, uint256[] calldata claimTopics) public onlyOwner {
- require(address(trustedIssuer) != address(0), "invalid argument - zero address");
- require(trustedIssuerClaimTopics[address(trustedIssuer)].length == 0, "trusted Issuer already exists");
- require(claimTopics.length > 0, "trusted claim topics cannot be empty");
- require(claimTopics.length <= 15, "cannot have more than 15 claim topics");
- require(trustedIssuers.length < 50, "cannot have more than 50 trusted issuers");
- trustedIssuers.push(trustedIssuer);
- trustedIssuerClaimTopics[address(trustedIssuer)] = claimTopics;
- for (uint256 i = 0; i < claimTopics.length; i++) {
- claimTopicsToTrustedIssuers[claimTopics[i]].push(trustedIssuer);
- }
- emit TrustedIssuerAdded(trustedIssuer, claimTopics);
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-removeTrustedIssuer}.
- */
- function removeTrustedIssuer(IClaimIssuer trustedIssuer) public onlyOwner {
- require(address(trustedIssuer) != address(0), "invalid argument - zero address");
- require(trustedIssuerClaimTopics[address(trustedIssuer)].length != 0, "NOT a trusted issuer");
- uint256 length = trustedIssuers.length;
- for (uint256 i = 0; i < length; i++) {
- if (trustedIssuers[i] == trustedIssuer) {
- trustedIssuers[i] = trustedIssuers[length - 1];
- trustedIssuers.pop();
- break;
- }
- }
- for (
- uint256 claimTopicIndex = 0;
- claimTopicIndex < trustedIssuerClaimTopics[address(trustedIssuer)].length;
- claimTopicIndex++) {
- uint256 claimTopic = trustedIssuerClaimTopics[address(trustedIssuer)][claimTopicIndex];
- uint256 topicsLength = claimTopicsToTrustedIssuers[claimTopic].length;
- for (uint256 i = 0; i < topicsLength; i++) {
- if (claimTopicsToTrustedIssuers[claimTopic][i] == trustedIssuer) {
- claimTopicsToTrustedIssuers[claimTopic][i] =
- claimTopicsToTrustedIssuers[claimTopic][topicsLength - 1];
- claimTopicsToTrustedIssuers[claimTopic].pop();
- break;
- }
- }
- }
- delete trustedIssuerClaimTopics[address(trustedIssuer)];
- emit TrustedIssuerRemoved(trustedIssuer);
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-updateIssuerClaimTopics}.
- */
- function updateIssuerClaimTopics(IClaimIssuer trustedIssuer, uint256[] calldata newClaimTopics) public onlyOwner {
- require(address(trustedIssuer) != address(0), "invalid argument - zero address");
- require(trustedIssuerClaimTopics[address(trustedIssuer)].length != 0, "NOT a trusted issuer");
- require(newClaimTopics.length <= 15, "cannot have more than 15 claim topics");
- require(newClaimTopics.length > 0, "claim topics cannot be empty");
-
- for (uint256 i = 0; i < trustedIssuerClaimTopics[address(trustedIssuer)].length; i++) {
- uint256 claimTopic = trustedIssuerClaimTopics[address(trustedIssuer)][i];
- uint256 topicsLength = claimTopicsToTrustedIssuers[claimTopic].length;
- for (uint256 j = 0; j < topicsLength; j++) {
- if (claimTopicsToTrustedIssuers[claimTopic][j] == trustedIssuer) {
- claimTopicsToTrustedIssuers[claimTopic][j] =
- claimTopicsToTrustedIssuers[claimTopic][topicsLength - 1];
- claimTopicsToTrustedIssuers[claimTopic].pop();
- break;
- }
- }
- }
- trustedIssuerClaimTopics[address(trustedIssuer)] = newClaimTopics;
- for (uint256 i = 0; i < newClaimTopics.length; i++) {
- claimTopicsToTrustedIssuers[newClaimTopics[i]].push(trustedIssuer);
- }
- emit ClaimTopicsUpdated(trustedIssuer, newClaimTopics);
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-getTrustedIssuers}.
- */
- function getTrustedIssuers() public view returns (IClaimIssuer[] memory) {
- return trustedIssuers;
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-getTrustedIssuersForClaimTopic}.
- */
- function getTrustedIssuersForClaimTopic(uint256 claimTopic) public view returns (IClaimIssuer[] memory) {
- return claimTopicsToTrustedIssuers[claimTopic];
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-isTrustedIssuer}.
- */
- function isTrustedIssuer(address issuer) public view returns (bool) {
- if(trustedIssuerClaimTopics[issuer].length > 0) {
- return true;
- }
- return false;
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-getTrustedIssuerClaimTopics}.
- */
- function getTrustedIssuerClaimTopics(IClaimIssuer trustedIssuer) public view returns (uint256[] memory) {
- require(trustedIssuerClaimTopics[address(trustedIssuer)].length != 0, "trusted Issuer doesn\'t exist");
- return trustedIssuerClaimTopics[address(trustedIssuer)];
- }
-
- /**
- * @dev See {ITrustedIssuersRegistry-hasClaimTopic}.
- */
- function hasClaimTopic(address issuer, uint256 claimTopic) public view returns (bool) {
- uint256[] memory claimTopics = trustedIssuerClaimTopics[issuer];
- uint256 length = claimTopics.length;
- for (uint256 i = 0; i < length; i++) {
- if (claimTopics[i] == claimTopic) {
- return true;
- }
- }
- return false;
- }
-
- function isClaimTopicRequired(uint256 claimTopic) public view returns (bool) {
- uint256 length = requiredClaimTopics.length;
-
- for (uint256 i = 0; i < length; i++) {
- if (requiredClaimTopics[i] == claimTopic) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * @dev Verify an identity (ONCHAINID) by checking if the identity has at least one valid claim from a trusted
- * issuer for each required claim topic. Returns true if the identity is compliant, false otherwise.
- */
- function verify(address identity) public view returns(bool isVerified) {
- if (requiredClaimTopics.length == 0) {
- return true;
- }
-
- uint256 foundClaimTopic;
- uint256 scheme;
- address issuer;
- bytes memory sig;
- bytes memory data;
- uint256 claimTopic;
- for (claimTopic = 0; claimTopic < requiredClaimTopics.length; claimTopic++) {
- IClaimIssuer[] memory trustedIssuersForClaimTopic =
- this.getTrustedIssuersForClaimTopic(requiredClaimTopics[claimTopic]);
-
- if (trustedIssuersForClaimTopic.length == 0) {
- return false;
- }
-
- bytes32[] memory claimIds = new bytes32[](trustedIssuersForClaimTopic.length);
- for (uint256 i = 0; i < trustedIssuersForClaimTopic.length; i++) {
- claimIds[i] = keccak256(abi.encode(trustedIssuersForClaimTopic[i], requiredClaimTopics[claimTopic]));
- }
-
- for (uint256 j = 0; j < claimIds.length; j++) {
- (foundClaimTopic, scheme, issuer, sig, data, ) = IIdentity(identity).getClaim(claimIds[j]);
-
- if (foundClaimTopic == requiredClaimTopics[claimTopic]) {
- try IClaimIssuer(issuer).isClaimValid(IIdentity(identity), requiredClaimTopics[claimTopic], sig,
- data) returns(bool _validity) {
-
- if (
- _validity
- ) {
- j = claimIds.length;
- }
- if (!_validity && j == (claimIds.length - 1)) {
- return false;
- }
- } catch {
- if (j == (claimIds.length - 1)) {
- return false;
- }
- }
- } else if (j == (claimIds.length - 1)) {
- return false;
- }
- }
- }
-
- return true;
- }
-}
diff --git a/contracts/version/Version.sol b/contracts/version/Version.sol
deleted file mode 100644
index 77c1c6e9..00000000
--- a/contracts/version/Version.sol
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0
-
-pragma solidity 0.8.17;
-
-/**
- * @dev Version contract gives the versioning information of the implementation contract
- */
-contract Version {
- /**
- * @dev Returns the string of the current version.
- */
- function version() external pure returns (string memory) {
- // version 2.2.0
- return "2.2.1";
- }
-}
diff --git a/foundry.toml b/foundry.toml
new file mode 100644
index 00000000..9b51c60b
--- /dev/null
+++ b/foundry.toml
@@ -0,0 +1,32 @@
+[profile.default]
+src = "contracts"
+out = "out"
+test = "test"
+script = "scripts"
+libs = ["dependencies"]
+
+solc_version = "0.8.27"
+optimizer = true
+optimizer_runs = 200
+evm_version = "shanghai"
+
+[profile.default.fmt]
+sort_imports = true
+contract_new_lines = true
+bracket_spacing = true
+
+[profile.default.lint]
+lint_on_build = true
+
+[rpc_endpoints]
+baseSepolia = "https://base-sepolia.g.alchemy.com/v2/${ALCHEMY_KEY}"
+base = "https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_KEY}"
+
+[soldeer]
+remappings_regenerate = false
+
+[dependencies]
+forge-std = { version = "v1.14.0", git = "https://github.com/foundry-rs/forge-std.git", tag = "v1.14.0" }
+"@openzeppelin-contracts" = "5.2.0"
+"@openzeppelin-contracts-upgradeable" = "4.9.6"
+solady = "0.1.15"
diff --git a/hardhat.config.ts b/hardhat.config.ts
deleted file mode 100644
index 72ebf219..00000000
--- a/hardhat.config.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import "@nomicfoundation/hardhat-toolbox";
-import { HardhatUserConfig } from "hardhat/config";
-import 'solidity-coverage';
-import "@nomiclabs/hardhat-solhint";
-
-import "./tasks/add-claim.task";
-import "./tasks/add-key.task";
-import "./tasks/deploy-identity.task";
-import "./tasks/deploy-proxy.task";
-import "./tasks/remove-claim.task";
-import "./tasks/remove-key.task";
-import "./tasks/revoke.task";
-
-const config: HardhatUserConfig = {
- solidity: "0.8.17",
- networks: {
- mumbai: {
- url: 'https://rpc-mumbai.maticvigil.com/v1/9cd3d6ce21f0a25bb8f33504a1820d616f700d24',
- accounts: ["1d79b7c95d2456a55f55a0e17f856412637fa6b3c332fa557ce2c8a89139ec74"],
- }
- }
-};
-
-export default config;
diff --git a/index.d.ts b/index.d.ts
deleted file mode 100644
index 60484806..00000000
--- a/index.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export namespace contracts {
- export const ClaimIssuer: any;
- export const Gateway: any;
- export const Identity: any;
- export const ImplementationAuthority: any;
- export const IdentityProxy: any;
- export const Factory: any;
- export const Verifier: any;
-}
-
-export namespace interfaces {
- export const IClaimIssuer: any;
- export const IERC734: any;
- export const IERC735: any;
- export const IIdentity: any;
- export const IImplementationAuthority: any;
- export const IFactory: any;
-}
diff --git a/index.js b/index.js
deleted file mode 100644
index 70fe2a26..00000000
--- a/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const IClaimIssuer = require('./artifacts/contracts/interface/IClaimIssuer.sol/IClaimIssuer.json');
-const IERC734 = require('./artifacts/contracts/interface/IERC734.sol/IERC734.json');
-const IERC735 = require('./artifacts/contracts/interface/IERC735.sol/IERC735.json');
-const IFactory = require('./artifacts/contracts/factory/IIdFactory.sol/IIdFactory.json');
-const IIdentity = require('./artifacts/contracts/interface/IIdentity.sol/IIdentity.json');
-const IImplementationAuthority = require('./artifacts/contracts/interface/IImplementationAuthority.sol/IImplementationAuthority.json');
-
-const ClaimIssuer = require('./artifacts/contracts/ClaimIssuer.sol/ClaimIssuer.json');
-const Factory = require('./artifacts/contracts/factory/IdFactory.sol/IdFactory.json');
-const Gateway = require('./artifacts/contracts/gateway/Gateway.sol/Gateway.json');
-const Identity = require('./artifacts/contracts/Identity.sol/Identity.json');
-const ImplementationAuthority = require('./artifacts/contracts/proxy/ImplementationAuthority.sol/ImplementationAuthority.json');
-const IdentityProxy = require('./artifacts/contracts/proxy/IdentityProxy.sol/IdentityProxy.json');
-const Verifier = require('./artifacts/contracts/verifiers/Verifier.sol/Verifier.json');
-const Version = require('./artifacts/contracts/version/Version.sol/Version.json');
-
-module.exports = {
- contracts: {
- ClaimIssuer,
- Factory,
- Gateway,
- Identity,
- ImplementationAuthority,
- IdentityProxy,
- Version,
- Verifier,
- },
- interfaces: {
- IClaimIssuer,
- IERC734,
- IERC735,
- IIdentity,
- IImplementationAuthority,
- IFactory,
- },
-};
diff --git a/package-lock.json b/package-lock.json
index 5c047a5c..b2801c88 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,18830 +1,1296 @@
{
"name": "@onchain-id/solidity",
- "version": "2.2.1",
- "lockfileVersion": 2,
+ "version": "2.2.2-beta3",
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@onchain-id/solidity",
- "version": "2.2.1",
+ "version": "2.2.2-beta3",
"license": "ISC",
"devDependencies": {
- "@nomicfoundation/hardhat-toolbox": "^2.0.1",
- "@nomiclabs/hardhat-solhint": "^3.0.0",
- "@openzeppelin/contracts": "^4.8.3",
- "hardhat": "^2.12.6",
- "solhint-plugin-prettier": "^0.0.5",
- "solidity-coverage": "^0.8.2"
+ "@ballcat/commitlint-config-gitmoji": "^1.1.0",
+ "@commitlint/cli": "^19.8.1",
+ "husky": "^9.1.7"
}
},
"node_modules/@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/highlight": "^7.18.6"
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "node_modules/@ballcat/commitlint-config-gitmoji": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@ballcat/commitlint-config-gitmoji/-/commitlint-config-gitmoji-1.1.0.tgz",
+ "integrity": "sha512-bb9EuwKGItogf68b84KxnHYZIceVNgMaA23lUDrWVFyu2Q4q4HtDpmFw8Gh6NdJTnGx1lgoVKowHl1o6Wb66yw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
+ "gitmojis": "^3.12.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=v14"
}
},
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "node_modules/@commitlint/cli": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz",
+ "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^1.9.0"
+ "@commitlint/format": "^19.8.1",
+ "@commitlint/lint": "^19.8.1",
+ "@commitlint/load": "^19.8.1",
+ "@commitlint/read": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "tinyexec": "^1.0.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "commitlint": "cli.js"
},
"engines": {
- "node": ">=4"
+ "node": ">=v18"
}
},
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "node_modules/@commitlint/cli/node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "node_modules/@commitlint/cli/node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "1.1.3"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "node_modules/@commitlint/cli/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
+ "license": "ISC",
"engines": {
- "node": ">=0.8.0"
+ "node": ">=12"
}
},
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/@commitlint/config-validator": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz",
+ "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@commitlint/types": "^19.8.1",
+ "ajv": "^8.11.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=v18"
}
},
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/@commitlint/config-validator/node_modules/ajv": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
+ "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
- "engines": {
- "node": ">=4"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/@cspotcode/source-map-support": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
- "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
- "peer": true,
+ "license": "MIT"
+ },
+ "node_modules/@commitlint/ensure": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz",
+ "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/trace-mapping": "0.3.9"
+ "@commitlint/types": "^19.8.1",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/abi": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
- "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
+ "node_modules/@commitlint/execute-rule": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz",
+ "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/abstract-provider": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
- "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
+ "node_modules/@commitlint/format": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz",
+ "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"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"
+ "@commitlint/types": "^19.8.1",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/abstract-signer": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
- "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
+ "node_modules/@commitlint/format/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/@ethersproject/address": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
- "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
+ "node_modules/@commitlint/is-ignored": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz",
+ "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"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"
+ "@commitlint/types": "^19.8.1",
+ "semver": "^7.6.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/base64": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
- "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
+ "node_modules/@commitlint/is-ignored/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@ethersproject/basex": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz",
- "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==",
+ "node_modules/@commitlint/lint": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz",
+ "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/properties": "^5.7.0"
+ "@commitlint/is-ignored": "^19.8.1",
+ "@commitlint/parse": "^19.8.1",
+ "@commitlint/rules": "^19.8.1",
+ "@commitlint/types": "^19.8.1"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/bignumber": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
- "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
+ "node_modules/@commitlint/load": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz",
+ "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "bn.js": "^5.2.1"
+ "@commitlint/config-validator": "^19.8.1",
+ "@commitlint/execute-rule": "^19.8.1",
+ "@commitlint/resolve-extends": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "chalk": "^5.3.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^6.1.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/bignumber/node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/@ethersproject/bytes": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
- "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
+ "node_modules/@commitlint/load/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/logger": "^5.7.0"
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/@ethersproject/constants": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
- "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
+ "node_modules/@commitlint/load/node_modules/cosmiconfig": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz",
+ "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bignumber": "^5.7.0"
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/@ethersproject/contracts": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz",
- "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==",
+ "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz",
+ "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"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"
+ "jiti": "^2.6.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=9",
+ "typescript": ">=5"
}
},
- "node_modules/@ethersproject/hash": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
- "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
+ "node_modules/@commitlint/message": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz",
+ "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/hdnode": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz",
- "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==",
+ "node_modules/@commitlint/parse": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz",
+ "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"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"
+ "@commitlint/types": "^19.8.1",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/json-wallets": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz",
- "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==",
+ "node_modules/@commitlint/read": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz",
+ "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"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"
+ "@commitlint/top-level": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/keccak256": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
- "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
+ "node_modules/@commitlint/resolve-extends": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz",
+ "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "js-sha3": "0.8.0"
+ "@commitlint/config-validator": "^19.8.1",
+ "@commitlint/types": "^19.8.1",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/logger": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
- "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==",
+ "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ]
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@ethersproject/networks": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
- "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
+ "node_modules/@commitlint/rules": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz",
+ "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "@ethersproject/logger": "^5.7.0"
+ "@commitlint/ensure": "^19.8.1",
+ "@commitlint/message": "^19.8.1",
+ "@commitlint/to-lines": "^19.8.1",
+ "@commitlint/types": "^19.8.1"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/pbkdf2": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz",
- "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==",
+ "node_modules/@commitlint/to-lines": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz",
+ "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/sha2": "^5.7.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/properties": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
- "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
+ "node_modules/@commitlint/top-level": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz",
+ "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "@ethersproject/logger": "^5.7.0"
+ "find-up": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/providers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz",
- "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==",
+ "node_modules/@commitlint/top-level/node_modules/find-up": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+ "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"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"
+ "locate-path": "^7.2.0",
+ "path-exists": "^5.0.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@ethersproject/providers/node_modules/ws": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "node_modules/@commitlint/top-level/node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">=8.3.0"
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^6.0.0"
},
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@ethersproject/random": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz",
- "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==",
+ "node_modules/@commitlint/top-level/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@ethersproject/rlp": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
- "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
+ "node_modules/@commitlint/top-level/node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@ethersproject/sha2": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz",
- "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==",
+ "node_modules/@commitlint/top-level/node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "hash.js": "1.1.7"
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
- "node_modules/@ethersproject/signing-key": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
- "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
+ "node_modules/@commitlint/top-level/node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@ethersproject/signing-key/node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/@ethersproject/solidity": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz",
- "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==",
+ "node_modules/@commitlint/types": {
+ "version": "19.8.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz",
+ "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"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"
+ "@types/conventional-commits-parser": "^5.0.0",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
}
},
- "node_modules/@ethersproject/strings": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
- "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
+ "node_modules/@commitlint/types/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/@ethersproject/transactions": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
- "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
+ "node_modules/@types/conventional-commits-parser": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.2.tgz",
+ "integrity": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"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"
+ "@types/node": "*"
}
},
- "node_modules/@ethersproject/units": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
- "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
+ "node_modules/@types/node": {
+ "version": "24.1.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz",
+ "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
+ "undici-types": "~7.8.0"
}
},
- "node_modules/@ethersproject/wallet": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz",
- "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==",
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@ethersproject/web": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
- "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "license": "MIT",
"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"
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@ethersproject/wordlists": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz",
- "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==",
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "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"
- }
+ "license": "Python-2.0"
+ },
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/@jridgewell/resolve-uri": {
+ "node_modules/callsites": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": ">=7.0.0"
}
},
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
- "peer": true
+ "license": "MIT"
},
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
- "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
}
},
- "node_modules/@metamask/eth-sig-util": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz",
- "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==",
+ "node_modules/conventional-changelog-angular": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
"dev": true,
+ "license": "ISC",
"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"
+ "compare-func": "^2.0.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=16"
}
},
- "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "node_modules/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
}
},
- "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "node_modules/conventional-commits-parser/node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
"dev": true,
- "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"
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
}
},
- "node_modules/@metamask/eth-sig-util/node_modules/tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
- "dev": true
- },
- "node_modules/@morgan-stanley/ts-mocking-bird": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz",
- "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==",
+ "node_modules/dargs": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
"dev": true,
- "peer": true,
- "dependencies": {
- "lodash": "^4.17.16",
- "uuid": "^7.0.3"
- },
- "peerDependencies": {
- "jasmine": "2.x || 3.x || 4.x",
- "jest": "26.x || 27.x || 28.x",
- "typescript": ">=4.2"
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
- "peerDependenciesMeta": {
- "jasmine": {
- "optional": true
- },
- "jest": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@morgan-stanley/ts-mocking-bird/node_modules/uuid": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
- "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
"dev": true,
- "peer": true,
- "bin": {
- "uuid": "dist/bin/uuid"
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@noble/hashes": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz",
- "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==",
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ]
+ "license": "MIT"
},
- "node_modules/@noble/secp256k1": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz",
- "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==",
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ]
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
+ "is-arrayish": "^0.2.1"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 8"
+ "node": ">=6"
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
"engines": {
- "node": ">= 8"
+ "node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/@nomicfoundation/ethereumjs-block": {
+ "node_modules/git-raw-commits": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz",
- "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
+ "deprecated": "This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-tx": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "ethereum-cryptography": "0.1.3"
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "cli.mjs"
},
"engines": {
- "node": ">=14"
+ "node": ">=16"
}
},
- "node_modules/@nomicfoundation/ethereumjs-blockchain": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz",
- "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==",
+ "node_modules/git-raw-commits/node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
"dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-ethash": "^2.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "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"
- },
+ "license": "ISC",
"engines": {
- "node": ">=14"
+ "node": ">= 10.x"
}
},
- "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/level": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz",
- "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==",
+ "node_modules/gitmojis": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/gitmojis/-/gitmojis-3.15.0.tgz",
+ "integrity": "sha512-28sothO0+6UuXx0fnJXi4kqy2/dKeFN3xL2Ss5k5K5ECBJMi5T2kZLY92xys3/+YD+AgKHgeiw7YQpYKnkCLMg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "browser-level": "^1.0.1",
- "classic-level": "^1.2.0"
+ "ini": "4.1.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/level"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "node_modules/global-directory/node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
"dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/@nomicfoundation/ethereumjs-common": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz",
- "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==",
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "crc-32": "^1.2.0"
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
}
},
- "node_modules/@nomicfoundation/ethereumjs-ethash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz",
- "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==",
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "abstract-level": "^1.0.3",
- "bigint-crypto-utils": "^3.0.23",
- "ethereum-cryptography": "0.1.3"
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
},
"engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-evm": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz",
- "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "@types/async-eventemitter": "^0.2.1",
- "async-eventemitter": "^0.2.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "mcl-wasm": "^0.7.1",
- "rustbn.js": "~0.2.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-rlp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz",
- "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==",
- "dev": true,
- "bin": {
- "rlp": "bin/rlp"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-statemanager": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz",
- "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "functional-red-black-tree": "^1.0.1"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-trie": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz",
- "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "ethereum-cryptography": "0.1.3",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-tx": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz",
- "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-util": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz",
- "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-vm": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz",
- "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-blockchain": "^6.0.0",
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-evm": "^1.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-statemanager": "^1.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-tx": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "@types/async-eventemitter": "^0.2.1",
- "async-eventemitter": "^0.2.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "functional-red-black-tree": "^1.0.1",
- "mcl-wasm": "^0.7.1",
- "rustbn.js": "~0.2.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.5.tgz",
- "integrity": "sha512-+W5C/+5FHI2xBajUN9THSNc1UP6FUsA7LeLmfnaC9VMi/50/DEjjxd8OmizEXgV1Bjck7my4NVQLL1Ti39FkpA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@ethersproject/abi": "^5.1.2",
- "@types/chai-as-promised": "^7.1.3",
- "chai-as-promised": "^7.1.1",
- "chalk": "^2.4.2",
- "deep-eql": "^4.0.1",
- "ordinal": "^1.0.3"
- },
- "peerDependencies": {
- "@nomiclabs/hardhat-ethers": "^2.0.0",
- "chai": "^4.2.0",
- "ethers": "^5.0.0",
- "hardhat": "^2.9.4"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomicfoundation/hardhat-network-helpers": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz",
- "integrity": "sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ethereumjs-util": "^7.1.4"
- },
- "peerDependencies": {
- "hardhat": "^2.9.5"
- }
- },
- "node_modules/@nomicfoundation/hardhat-toolbox": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.1.tgz",
- "integrity": "sha512-/pr8m9xlqiNlq6fXv4hEPNwdNwUhysoB2qbDCKqERfPpq34EydUQTC3Vis4aIea8RLwSrU8sDXFdv4TQxYstKw==",
- "dev": true,
- "peerDependencies": {
- "@ethersproject/abi": "^5.4.7",
- "@ethersproject/providers": "^5.4.7",
- "@nomicfoundation/hardhat-chai-matchers": "^1.0.0",
- "@nomicfoundation/hardhat-network-helpers": "^1.0.0",
- "@nomiclabs/hardhat-ethers": "^2.0.0",
- "@nomiclabs/hardhat-etherscan": "^3.0.0",
- "@typechain/ethers-v5": "^10.1.0",
- "@typechain/hardhat": "^6.1.2",
- "@types/chai": "^4.2.0",
- "@types/mocha": ">=9.1.0",
- "@types/node": ">=12.0.0",
- "chai": "^4.2.0",
- "ethers": "^5.4.7",
- "hardhat": "^2.11.0",
- "hardhat-gas-reporter": "^1.0.8",
- "solidity-coverage": "^0.8.1",
- "ts-node": ">=8.0.0",
- "typechain": "^8.1.0",
- "typescript": ">=4.5.0"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz",
- "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==",
- "dev": true,
- "engines": {
- "node": ">= 12"
- },
- "optionalDependencies": {
- "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0",
- "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0",
- "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0",
- "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0",
- "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0",
- "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz",
- "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz",
- "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz",
- "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz",
- "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz",
- "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz",
- "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz",
- "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz",
- "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz",
- "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz",
- "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomiclabs/hardhat-ethers": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz",
- "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==",
- "dev": true,
- "peer": true,
- "peerDependencies": {
- "ethers": "^5.0.0",
- "hardhat": "^2.0.0"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.5.tgz",
- "integrity": "sha512-PxPX28AGBAlxgXLU27NB3oiMsklxbNhM75SDC4v1QPCyPeAxGm4xV0WpYbR10W7sxY2WF3Ek7u7GhjbQWa2Fcg==",
- "dev": true,
- "peer": true,
- "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"
- },
- "peerDependencies": {
- "hardhat": "^2.0.4"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/cbor": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz",
- "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "nofilter": "^3.1.0"
- },
- "engines": {
- "node": ">=12.19"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "peer": true
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "peer": true
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/nofilter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz",
- "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=12.19"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nomiclabs/hardhat-etherscan/node_modules/table": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
- "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
- "dev": true,
- "peer": true,
- "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"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@nomiclabs/hardhat-solhint": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-solhint/-/hardhat-solhint-3.0.0.tgz",
- "integrity": "sha512-uouERJ2UVsN5ek2veA8nq/Pwq06INRcWdZxjE1vcEZ4i+Et8Qiy0SrPO7KRU0rh3rssBgfOtCbbAEOfh7YBAvA==",
- "dev": true,
- "dependencies": {
- "solhint": "^3.0.0"
- },
- "peerDependencies": {
- "hardhat": "^2.0.0"
- }
- },
- "node_modules/@openzeppelin/contracts": {
- "version": "4.8.3",
- "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.3.tgz",
- "integrity": "sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg==",
- "dev": true
- },
- "node_modules/@scure/base": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz",
- "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ]
- },
- "node_modules/@scure/bip32": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz",
- "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "@noble/hashes": "~1.1.1",
- "@noble/secp256k1": "~1.6.0",
- "@scure/base": "~1.1.0"
- }
- },
- "node_modules/@scure/bip39": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz",
- "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "@noble/hashes": "~1.1.1",
- "@scure/base": "~1.1.0"
- }
- },
- "node_modules/@sentry/core": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz",
- "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/hub": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz",
- "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==",
- "dev": true,
- "dependencies": {
- "@sentry/types": "5.30.0",
- "@sentry/utils": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/minimal": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz",
- "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==",
- "dev": true,
- "dependencies": {
- "@sentry/hub": "5.30.0",
- "@sentry/types": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/node": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz",
- "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/node/node_modules/cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/@sentry/tracing": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz",
- "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/types": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz",
- "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/utils": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz",
- "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==",
- "dev": true,
- "dependencies": {
- "@sentry/types": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@solidity-parser/parser": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz",
- "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==",
- "dev": true,
- "dependencies": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "node_modules/@tsconfig/node10": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
- "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@tsconfig/node12": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
- "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
- "dev": true,
- "peer": true
- },
- "node_modules/@tsconfig/node14": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
- "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
- "dev": true,
- "peer": true
- },
- "node_modules/@tsconfig/node16": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
- "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/@typechain/ethers-v5": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz",
- "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash": "^4.17.15",
- "ts-essentials": "^7.0.1"
- },
- "peerDependencies": {
- "@ethersproject/abi": "^5.0.0",
- "@ethersproject/bytes": "^5.0.0",
- "@ethersproject/providers": "^5.0.0",
- "ethers": "^5.1.3",
- "typechain": "^8.1.1",
- "typescript": ">=4.3.0"
- }
- },
- "node_modules/@typechain/hardhat": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz",
- "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fs-extra": "^9.1.0"
- },
- "peerDependencies": {
- "@ethersproject/abi": "^5.4.7",
- "@ethersproject/providers": "^5.4.7",
- "@typechain/ethers-v5": "^10.2.0",
- "ethers": "^5.4.7",
- "hardhat": "^2.9.9",
- "typechain": "^8.1.1"
- }
- },
- "node_modules/@typechain/hardhat/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@typechain/hardhat/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@typechain/hardhat/node_modules/universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@types/async-eventemitter": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz",
- "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==",
- "dev": true
- },
- "node_modules/@types/bn.js": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz",
- "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/chai": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz",
- "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/chai-as-promised": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz",
- "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/chai": "*"
- }
- },
- "node_modules/@types/concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/form-data": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
- "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
- "dev": true,
- "dependencies": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==",
- "dev": true
- },
- "node_modules/@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
- "dev": true
- },
- "node_modules/@types/mocha": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz",
- "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/node": {
- "version": "18.11.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
- "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==",
- "dev": true
- },
- "node_modules/@types/pbkdf2": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
- "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/prettier": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
- "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/secp256k1": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
- "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/abbrev": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
- "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==",
- "dev": true
- },
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "dev": true,
- "dependencies": {
- "event-target-shim": "^5.0.0"
- },
- "engines": {
- "node": ">=6.5"
- }
- },
- "node_modules/abstract-level": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz",
- "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/abstract-level/node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "node_modules/abstract-level/node_modules/level-supports": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz",
- "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
- "dev": true,
- "peer": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/address": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
- "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/adm-zip": {
- "version": "0.4.16",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
- "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
- "dev": true,
- "engines": {
- "node": ">=0.3.0"
- }
- },
- "node_modules/aes-js": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
- "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==",
- "dev": true,
- "peer": true
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/aggregate-error/node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "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"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.4.2"
- }
- },
- "node_modules/ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/antlr4": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz",
- "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==",
- "dev": true
- },
- "node_modules/antlr4ts": {
- "version": "0.5.0-alpha.4",
- "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz",
- "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==",
- "dev": true
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true,
- "peer": true
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array.prototype.reduce": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz",
- "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "peer": true
- },
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ast-parents": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz",
- "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==",
- "dev": true
- },
- "node_modules/astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
- "dev": true
- },
- "node_modules/async-eventemitter": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz",
- "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==",
- "dev": true,
- "dependencies": {
- "async": "^2.4.0"
- }
- },
- "node_modules/async-eventemitter/node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "dev": true,
- "dependencies": {
- "lodash": "^4.17.14"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
- "dev": true,
- "peer": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base-x": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
- "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/bech32": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
- "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/bigint-crypto-utils": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz",
- "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==",
- "dev": true,
- "dependencies": {
- "bigint-mod-arith": "^3.1.0"
- },
- "engines": {
- "node": ">=10.4.0"
- }
- },
- "node_modules/bigint-mod-arith": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz",
- "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==",
- "dev": true,
- "engines": {
- "node": ">=10.4.0"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/blakejs": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
- "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==",
- "dev": true
- },
- "node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
- "dev": true
- },
- "node_modules/browser-level": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz",
- "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==",
- "dev": true,
- "dependencies": {
- "abstract-level": "^1.0.2",
- "catering": "^2.1.1",
- "module-error": "^1.0.2",
- "run-parallel-limit": "^1.1.0"
- }
- },
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "node_modules/browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "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"
- }
- },
- "node_modules/bs58": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
- "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
- "dev": true,
- "dependencies": {
- "base-x": "^3.0.2"
- }
- },
- "node_modules/bs58check": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
- "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
- "dev": true,
- "dependencies": {
- "bs58": "^4.0.0",
- "create-hash": "^1.1.0",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
- "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
- "dev": true
- },
- "node_modules/buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
- "dev": true
- },
- "node_modules/bufferutil": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
- "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dev": true,
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
- "dev": true,
- "dependencies": {
- "callsites": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
- "dev": true,
- "dependencies": {
- "caller-callsite": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true,
- "peer": true
- },
- "node_modules/catering": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz",
- "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chai": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
- "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^4.1.2",
- "get-func-name": "^2.0.0",
- "loupe": "^2.3.1",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.5"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "check-error": "^1.0.2"
- },
- "peerDependencies": {
- "chai": ">= 2.1.2 < 5"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
- },
- "node_modules/charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "node_modules/cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/classic-level": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz",
- "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "abstract-level": "^1.0.2",
- "catering": "^2.1.0",
- "module-error": "^1.0.1",
- "napi-macros": "~2.0.0",
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/classic-level/node_modules/napi-macros": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
- "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
- "dev": true
- },
- "node_modules/cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
- "dev": true,
- "dependencies": {
- "restore-cursor": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cli-table3": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
- "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "object-assign": "^4.1.0",
- "string-width": "^2.1.1"
- },
- "engines": {
- "node": ">=6"
- },
- "optionalDependencies": {
- "colors": "^1.1.2"
- }
- },
- "node_modules/cli-width": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
- "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
- "dev": true
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/command-exists": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
- "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
- "dev": true
- },
- "node_modules/command-line-args": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
- "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^3.1.0",
- "find-replace": "^3.0.0",
- "lodash.camelcase": "^4.3.0",
- "typical": "^4.0.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/command-line-usage": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
- "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^4.0.2",
- "chalk": "^2.4.2",
- "table-layout": "^1.0.2",
- "typical": "^5.2.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/command-line-usage/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/command-line-usage/node_modules/array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/command-line-usage/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/command-line-usage/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/command-line-usage/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/command-line-usage/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/command-line-usage/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/command-line-usage/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/command-line-usage/node_modules/typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/commander": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
- "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "engines": [
- "node >= 0.8"
- ],
- "peer": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "node_modules/concat-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/concat-stream/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/concat-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "peer": true
- },
- "node_modules/concat-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cosmiconfig/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/cosmiconfig/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
- "dev": true,
- "bin": {
- "crc32": "bin/crc32.njs"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "node_modules/create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "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"
- }
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "engines": {
- "node": ">=4.8"
- }
- },
- "node_modules/cross-spawn/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/death": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz",
- "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==",
- "dev": true
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
- "dev": true,
- "dependencies": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/detect-port": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
- "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
- "dev": true,
- "dependencies": {
- "address": "^1.0.1",
- "debug": "4"
- },
- "bin": {
- "detect": "bin/detect-port.js",
- "detect-port": "bin/detect-port.js"
- }
- },
- "node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/difflib": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz",
- "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==",
- "dev": true,
- "dependencies": {
- "heap": ">= 0.2.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "dev": true,
- "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"
- }
- },
- "node_modules/emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "node_modules/enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "dependencies": {
- "ansi-colors": "^4.1.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.20.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
- "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.1.3",
- "get-symbol-description": "^1.0.0",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "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-weakref": "^1.0.2",
- "object-inspect": "^1.12.2",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.4.3",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "unbox-primitive": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==",
- "dev": true,
- "dependencies": {
- "esprima": "^2.7.1",
- "estraverse": "^1.9.1",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=0.12.0"
- },
- "optionalDependencies": {
- "source-map": "~0.2.0"
- }
- },
- "node_modules/escodegen/node_modules/esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/escodegen/node_modules/estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
- "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
- "dev": true,
- "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"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^6.14.0 || ^8.10.0 || >=9.10.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^1.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/eslint/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/eslint/node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/eslint/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/eslint/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
- "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
- "dev": true,
- "dependencies": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/espree/node_modules/acorn": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
- "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esquery/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eth-gas-reporter": {
- "version": "0.2.25",
- "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz",
- "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@ethersproject/abi": "^5.0.0-beta.146",
- "@solidity-parser/parser": "^0.14.0",
- "cli-table3": "^0.5.0",
- "colors": "1.4.0",
- "ethereum-cryptography": "^1.0.3",
- "ethers": "^4.0.40",
- "fs-readdir-recursive": "^1.1.0",
- "lodash": "^4.17.14",
- "markdown-table": "^1.1.3",
- "mocha": "^7.1.1",
- "req-cwd": "^2.0.0",
- "request": "^2.88.0",
- "request-promise-native": "^1.0.5",
- "sha1": "^1.1.1",
- "sync-request": "^6.0.0"
- },
- "peerDependencies": {
- "@codechecks/client": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "@codechecks/client": {
- "optional": true
- }
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ansi-colors": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
- "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/chokidar": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
- "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
- "dev": true,
- "peer": true,
- "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"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.1.1"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz",
- "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@noble/hashes": "1.1.2",
- "@noble/secp256k1": "1.6.3",
- "@scure/bip32": "1.1.0",
- "@scure/bip39": "1.1.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ethers": {
- "version": "4.0.49",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz",
- "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "aes-js": "3.0.0",
- "bn.js": "^4.11.9",
- "elliptic": "6.5.4",
- "hash.js": "1.1.3",
- "js-sha3": "0.5.7",
- "scrypt-js": "2.0.4",
- "setimmediate": "1.0.4",
- "uuid": "2.0.1",
- "xmlhttprequest": "1.8.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "locate-path": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
- "dev": true,
- "peer": true,
- "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"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/hash.js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
- "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/js-sha3": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
- "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "minimist": "^1.2.5"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/mocha": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
- "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
- "dev": true,
- "peer": true,
- "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"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-limit": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/readdirp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
- "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/scrypt-js": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
- "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/setimmediate": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz",
- "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/supports-color": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
- "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/uuid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
- "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "peer": true,
- "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"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ethereum-bloom-filters": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
- "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
- "dev": true,
- "dependencies": {
- "js-sha3": "^0.8.0"
- }
- },
- "node_modules/ethereum-cryptography": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
- "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
- "dev": true,
- "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"
- }
- },
- "node_modules/ethereumjs-abi": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz",
- "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.11.8",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ethereumjs-abi/node_modules/@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
- "dev": true,
- "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"
- }
- },
- "node_modules/ethereumjs-util": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
- "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/ethereumjs-util/node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "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"
- }
- },
- "node_modules/ethjs-unit": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
- "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==",
- "dev": true,
- "dependencies": {
- "bn.js": "4.11.6",
- "number-to-bn": "1.7.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ethjs-unit/node_modules/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
- "dev": true
- },
- "node_modules/ethjs-util": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
- "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
- "dev": true,
- "dependencies": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "dependencies": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true,
- "peer": true
- },
- "node_modules/external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "dependencies": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "peer": true
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-diff": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
- "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/figures/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^2.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
- "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^3.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/flat": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
- "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
- "dev": true,
- "dependencies": {
- "is-buffer": "~2.0.3"
- },
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "dev": true,
- "dependencies": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
- "dev": true
- },
- "node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/fp-ts": {
- "version": "1.19.3",
- "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz",
- "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==",
- "dev": true
- },
- "node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true,
- "peer": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "deprecated": "\"Please update to latest v2.3 or v2.2\"",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
- "dev": true
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
- "node_modules/ghost-testrpc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
- "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.2",
- "node-emoji": "^1.10.0"
- },
- "bin": {
- "testrpc-sc": "index.js"
- }
- },
- "node_modules/ghost-testrpc/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ghost-testrpc/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ghost-testrpc/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/ghost-testrpc/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/ghost-testrpc/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/ghost-testrpc/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ghost-testrpc/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "dev": true
- },
- "node_modules/growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
- "dev": true,
- "engines": {
- "node": ">=4.x"
- }
- },
- "node_modules/handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.0",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
- },
- "engines": {
- "node": ">=0.4.7"
- },
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
- }
- },
- "node_modules/handlebars/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "deprecated": "this library is no longer supported",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/hardhat": {
- "version": "2.12.6",
- "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.6.tgz",
- "integrity": "sha512-0Ent1O5DsPgvaVb5sxEgsQ3bJRt/Ex92tsoO+xjoNH2Qc4bFmhI5/CHVlFikulalxOPjNmw5XQ2vJFuVQFESAA==",
- "dev": true,
- "dependencies": {
- "@ethersproject/abi": "^5.1.2",
- "@metamask/eth-sig-util": "^4.0.0",
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-blockchain": "^6.0.0",
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-evm": "^1.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-statemanager": "^1.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-tx": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "@nomicfoundation/ethereumjs-vm": "^6.0.0",
- "@nomicfoundation/solidity-analyzer": "^0.1.0",
- "@sentry/node": "^5.18.1",
- "@types/bn.js": "^5.1.0",
- "@types/lru-cache": "^5.1.0",
- "abort-controller": "^3.0.0",
- "adm-zip": "^0.4.16",
- "aggregate-error": "^3.0.0",
- "ansi-escapes": "^4.3.0",
- "chalk": "^2.4.2",
- "chokidar": "^3.4.0",
- "ci-info": "^2.0.0",
- "debug": "^4.1.1",
- "enquirer": "^2.3.0",
- "env-paths": "^2.2.0",
- "ethereum-cryptography": "^1.0.3",
- "ethereumjs-abi": "^0.6.8",
- "find-up": "^2.1.0",
- "fp-ts": "1.19.3",
- "fs-extra": "^7.0.1",
- "glob": "7.2.0",
- "immutable": "^4.0.0-rc.12",
- "io-ts": "1.10.4",
- "keccak": "^3.0.2",
- "lodash": "^4.17.11",
- "mnemonist": "^0.38.0",
- "mocha": "^10.0.0",
- "p-map": "^4.0.0",
- "qs": "^6.7.0",
- "raw-body": "^2.4.1",
- "resolve": "1.17.0",
- "semver": "^6.3.0",
- "solc": "0.7.3",
- "source-map-support": "^0.5.13",
- "stacktrace-parser": "^0.1.10",
- "tsort": "0.0.1",
- "undici": "^5.14.0",
- "uuid": "^8.3.2",
- "ws": "^7.4.6"
- },
- "bin": {
- "hardhat": "internal/cli/cli.js"
- },
- "engines": {
- "node": "^14.0.0 || ^16.0.0 || ^18.0.0"
- },
- "peerDependencies": {
- "ts-node": "*",
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "ts-node": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/hardhat-gas-reporter": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz",
- "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-uniq": "1.0.3",
- "eth-gas-reporter": "^0.2.25",
- "sha1": "^1.1.1"
- },
- "peerDependencies": {
- "hardhat": "^2.0.2"
- }
- },
- "node_modules/hardhat/node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/hardhat/node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/hardhat/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/chalk/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/hardhat/node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "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"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/hardhat/node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/hardhat/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/hardhat/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/hardhat/node_modules/commander": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
- "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
- "dev": true
- },
- "node_modules/hardhat/node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/hardhat/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/hardhat/node_modules/ethereum-cryptography": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz",
- "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==",
- "dev": true,
- "dependencies": {
- "@noble/hashes": "1.1.2",
- "@noble/secp256k1": "1.6.3",
- "@scure/bip32": "1.1.0",
- "@scure/bip39": "1.1.0"
- }
- },
- "node_modules/hardhat/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
- "dev": true,
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/hardhat/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/hardhat/node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/hardhat/node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/hardhat/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/hardhat/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hardhat/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
- "dev": true,
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/hardhat/node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/hardhat/node_modules/log-symbols/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/hardhat/node_modules/log-symbols/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/hardhat/node_modules/log-symbols/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hardhat/node_modules/mocha": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
- "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
- "dev": true,
- "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"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
- },
- "engines": {
- "node": ">= 14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/hardhat/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/hardhat/node_modules/nanoid": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
- "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
- "dev": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/hardhat/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/hardhat/node_modules/resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "dependencies": {
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hardhat/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/hardhat/node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/hardhat/node_modules/solc": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz",
- "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==",
- "dev": true,
- "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"
- },
- "bin": {
- "solcjs": "solcjs"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "node_modules/hardhat/node_modules/solc/node_modules/jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/hardhat/node_modules/solc/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/hardhat/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hardhat/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/supports-color/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hardhat/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/hardhat/node_modules/workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
- "dev": true
- },
- "node_modules/hardhat/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hardhat/node_modules/yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hardhat/node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true,
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/heap": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz",
- "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==",
- "dev": true
- },
- "node_modules/hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dev": true,
- "dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/http-basic": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
- "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "caseless": "^0.12.0",
- "concat-stream": "^1.6.2",
- "http-response-object": "^3.0.1",
- "parse-cache-control": "^1.0.1"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-response-object": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
- "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/node": "^10.0.3"
- }
- },
- "node_modules/http-response-object/node_modules/@types/node": {
- "version": "10.17.60",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
- "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
- "dev": true,
- "peer": true
- },
- "node_modules/http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immutable": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
- "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==",
- "dev": true
- },
- "node_modules/import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
- "dev": true,
- "dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "node_modules/inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/inquirer/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/inquirer/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/inquirer/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/inquirer/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/inquirer/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/inquirer/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/inquirer/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/inquirer/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/inquirer/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/internal-slot": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
- "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/io-ts": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz",
- "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==",
- "dev": true,
- "dependencies": {
- "fp-ts": "^1.0.0"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-buffer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-hex-prefixed": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
- "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
- "dev": true,
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true,
- "peer": true
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true,
- "peer": true
- },
- "node_modules/js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
- "dev": true
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "peer": true
- },
- "node_modules/json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true,
- "peer": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true,
- "peer": true
- },
- "node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/jsonschema": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
- "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/keccak": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz",
- "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.9"
- }
- },
- "node_modules/level-transcoder": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz",
- "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==",
- "dev": true,
- "dependencies": {
- "buffer": "^6.0.3",
- "module-error": "^1.0.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/level-transcoder/node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
- "node_modules/lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true,
- "peer": true
- },
- "node_modules/loupe": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
- "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "get-func-name": "^2.0.0"
- }
- },
- "node_modules/lru_map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
- "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
- "dev": true
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true,
- "peer": true
- },
- "node_modules/markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/mcl-wasm": {
- "version": "0.7.9",
- "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz",
- "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==",
- "dev": true,
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/memory-level": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz",
- "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==",
- "dev": true,
- "dependencies": {
- "abstract-level": "^1.0.0",
- "functional-red-black-tree": "^1.0.1",
- "module-error": "^1.0.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/memorystream": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
- "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
- "dev": true,
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "dev": true
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
- "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/mnemonist": {
- "version": "0.38.5",
- "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz",
- "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==",
- "dev": true,
- "dependencies": {
- "obliterator": "^2.0.0"
- }
- },
- "node_modules/module-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz",
- "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==",
- "dev": true
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "node_modules/nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "node_modules/node-addon-api": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
- "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
- "dev": true
- },
- "node_modules/node-emoji": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
- "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
- "dev": true,
- "dependencies": {
- "lodash": "^4.17.21"
- }
- },
- "node_modules/node-environment-flags": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
- "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
- "dev": true,
- "dependencies": {
- "object.getownpropertydescriptors": "^2.0.3",
- "semver": "^5.7.0"
- }
- },
- "node_modules/node-environment-flags/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/node-gyp-build": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
- "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
- "dev": true,
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/number-to-bn": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
- "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==",
- "dev": true,
- "dependencies": {
- "bn.js": "4.11.6",
- "strip-hex-prefix": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/number-to-bn/node_modules/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
- "dev": true
- },
- "node_modules/oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.getownpropertydescriptors": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz",
- "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==",
- "dev": true,
- "dependencies": {
- "array.prototype.reduce": "^1.0.5",
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obliterator": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
- "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==",
- "dev": true
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/ordinal": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz",
- "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parent-module/node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-cache-control": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
- "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
- "dev": true,
- "peer": true
- },
- "node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
- "dev": true
- },
- "node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true,
- "peer": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prettier": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
- "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
- "dev": true,
- "peer": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "dependencies": {
- "fast-diff": "^1.1.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/prettier-plugin-solidity": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.2.tgz",
- "integrity": "sha512-KC5oNbFJfyBaFiO0kl56J6AXnDmr9tUlBV1iqo864x4KQrKYKaBZvW9jhT2oC0NHoNp7/GoMJNxqL8pp8k7C/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@solidity-parser/parser": "^0.15.0",
- "semver": "^7.3.8",
- "solidity-comments-extractor": "^0.0.7"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "prettier": ">=2.3.0 || >=3.0.0-alpha.0"
- }
- },
- "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz",
- "integrity": "sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "node_modules/prettier-plugin-solidity/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true,
- "peer": true
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/promise": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
- "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "asap": "~2.0.6"
- }
- },
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true,
- "peer": true
- },
- "node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dev": true,
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dev": true,
- "dependencies": {
- "resolve": "^1.1.6"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/recursive-readdir": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
- "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
- "dev": true,
- "dependencies": {
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/reduce-flatten": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
- "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
- "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
- "dev": true,
- "engines": {
- "node": ">=6.5.0"
- }
- },
- "node_modules/req-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
- "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "req-from": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/req-from": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
- "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "resolve-from": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
- "dev": true,
- "peer": true,
- "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"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/request-promise-core": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
- "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash": "^4.17.19"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "peerDependencies": {
- "request": "^2.34"
- }
- },
- "node_modules/request-promise-native": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
- "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
- "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
- "dev": true,
- "peer": true,
- "dependencies": {
- "request-promise-core": "1.1.4",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- },
- "engines": {
- "node": ">=0.12.0"
- },
- "peerDependencies": {
- "request": "^2.34"
- }
- },
- "node_modules/request/node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/request/node_modules/qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/request/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "dev": true,
- "peer": true,
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
- "dev": true,
- "dependencies": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "dev": true,
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "node_modules/rlp": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
- "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
- "dev": true,
- "dependencies": {
- "bn.js": "^5.2.0"
- },
- "bin": {
- "rlp": "bin/rlp"
- }
- },
- "node_modules/rlp/node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/run-parallel-limit": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz",
- "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/rustbn.js": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz",
- "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==",
- "dev": true
- },
- "node_modules/rxjs": {
- "version": "6.6.7",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
- "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
- "dev": true,
- "dependencies": {
- "tslib": "^1.9.0"
- },
- "engines": {
- "npm": ">=2.0.0"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "node_modules/sc-istanbul": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz",
- "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==",
- "dev": true,
- "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"
- },
- "bin": {
- "istanbul": "lib/cli.js"
- }
- },
- "node_modules/sc-istanbul/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/sc-istanbul/node_modules/esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sc-istanbul/node_modules/glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
- "dev": true,
- "dependencies": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/sc-istanbul/node_modules/has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sc-istanbul/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/sc-istanbul/node_modules/resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==",
- "dev": true
- },
- "node_modules/sc-istanbul/node_modules/supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "dependencies": {
- "has-flag": "^1.0.0"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/scrypt-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
- "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
- "dev": true
- },
- "node_modules/secp256k1": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz",
- "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "elliptic": "^6.5.4",
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
- },
- "node_modules/setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
- "dev": true
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "node_modules/sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- },
- "bin": {
- "sha.js": "bin.js"
- }
- },
- "node_modules/sha1": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
- "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "charenc": ">= 0.0.1",
- "crypt": ">= 0.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/shelljs": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
- "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
- "dev": true,
- "dependencies": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- },
- "bin": {
- "shjs": "bin/shjs"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/solhint": {
- "version": "3.3.8",
- "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.8.tgz",
- "integrity": "sha512-TkYyJ6uUJCaiqRKuhHhFuoAoyco9Ia+RDKhl3usjG/rkaNk8/LdLRla2Xln7MVdBTaPKNAU8ezTRSit50Yy4qw==",
- "dev": true,
- "dependencies": {
- "@solidity-parser/parser": "^0.14.5",
- "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"
- },
- "bin": {
- "solhint": "solhint.js"
- },
- "optionalDependencies": {
- "prettier": "^1.14.3"
- }
- },
- "node_modules/solhint-plugin-prettier": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz",
- "integrity": "sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==",
- "dev": true,
- "dependencies": {
- "prettier-linter-helpers": "^1.0.0"
- },
- "peerDependencies": {
- "prettier": "^1.15.0 || ^2.0.0",
- "prettier-plugin-solidity": "^1.0.0-alpha.14"
- }
- },
- "node_modules/solhint/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solhint/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/solhint/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solhint/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/solhint/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/solhint/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/solhint/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solhint/node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/solhint/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/solhint/node_modules/prettier": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
- "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
- "dev": true,
- "optional": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solhint/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solidity-comments-extractor": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz",
- "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==",
- "dev": true,
- "peer": true
- },
- "node_modules/solidity-coverage": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz",
- "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==",
- "dev": true,
- "dependencies": {
- "@ethersproject/abi": "^5.0.9",
- "@solidity-parser/parser": "^0.14.1",
- "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"
- },
- "bin": {
- "solidity-coverage": "plugins/bin.js"
- },
- "peerDependencies": {
- "hardhat": "^2.11.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/ansi-colors": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
- "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solidity-coverage/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/solidity-coverage/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solidity-coverage/node_modules/chokidar": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
- "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.1.1"
- }
- },
- "node_modules/solidity-coverage/node_modules/cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "dependencies": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/solidity-coverage/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/solidity-coverage/node_modules/debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/solidity-coverage/node_modules/diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/solidity-coverage/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "dependencies": {
- "locate-path": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/solidity-coverage/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/solidity-coverage/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solidity-coverage/node_modules/js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/solidity-coverage/node_modules/locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/solidity-coverage/node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/solidity-coverage/node_modules/mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.5"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/solidity-coverage/node_modules/mocha": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz",
- "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==",
- "dev": true,
- "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"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
- }
- },
- "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
- "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- },
- "node_modules/solidity-coverage/node_modules/object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/solidity-coverage/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/solidity-coverage/node_modules/p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solidity-coverage/node_modules/readdirp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
- "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/solidity-coverage/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/solidity-coverage/node_modules/string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/solidity-coverage/node_modules/wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/solidity-coverage/node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
- },
- "node_modules/solidity-coverage/node_modules/yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "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"
- }
- },
- "node_modules/solidity-coverage/node_modules/yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
- "dev": true,
- "dependencies": {
- "flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "amdefine": ">=0.0.4"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "node_modules/sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "peer": true,
- "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"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stacktrace-parser": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
- "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.7.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/stacktrace-parser/node_modules/type-fest": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
- "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-format": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz",
- "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==",
- "dev": true,
- "peer": true
- },
- "node_modules/string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "dependencies": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-hex-prefix": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
- "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
- "dev": true,
- "dependencies": {
- "is-hex-prefixed": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/sync-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
- "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "http-response-object": "^3.0.1",
- "sync-rpc": "^1.2.1",
- "then-request": "^6.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/sync-rpc": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
- "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "get-port": "^3.1.0"
- }
- },
- "node_modules/table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/table-layout": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
- "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^4.0.1",
- "deep-extend": "~0.6.0",
- "typical": "^5.2.0",
- "wordwrapjs": "^4.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/table-layout/node_modules/array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/table-layout/node_modules/typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/table/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/table/node_modules/string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/table/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
- "node_modules/then-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
- "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/concat-stream": "^1.6.0",
- "@types/form-data": "0.0.33",
- "@types/node": "^8.0.0",
- "@types/qs": "^6.2.31",
- "caseless": "~0.12.0",
- "concat-stream": "^1.6.0",
- "form-data": "^2.2.0",
- "http-basic": "^8.1.1",
- "http-response-object": "^3.0.1",
- "promise": "^8.0.0",
- "qs": "^6.4.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/then-request/node_modules/@types/node": {
- "version": "8.10.66",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
- "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
- "dev": true,
- "peer": true
- },
- "node_modules/then-request/node_modules/form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true
- },
- "node_modules/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "dev": true,
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/ts-command-line-args": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz",
- "integrity": "sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@morgan-stanley/ts-mocking-bird": "^0.6.2",
- "chalk": "^4.1.0",
- "command-line-args": "^5.1.1",
- "command-line-usage": "^6.1.0",
- "string-format": "^2.0.0"
- },
- "bin": {
- "write-markdown": "dist/write-markdown.js"
- }
- },
- "node_modules/ts-essentials": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz",
- "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==",
- "dev": true,
- "peer": true,
- "peerDependencies": {
- "typescript": ">=3.7.0"
- }
- },
- "node_modules/ts-node": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
- "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@cspotcode/source-map-support": "^0.8.0",
- "@tsconfig/node10": "^1.0.7",
- "@tsconfig/node12": "^1.0.7",
- "@tsconfig/node14": "^1.0.0",
- "@tsconfig/node16": "^1.0.2",
- "acorn": "^8.4.1",
- "acorn-walk": "^8.1.1",
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "v8-compile-cache-lib": "^3.0.1",
- "yn": "3.1.1"
- },
- "bin": {
- "ts-node": "dist/bin.js",
- "ts-node-cwd": "dist/bin-cwd.js",
- "ts-node-esm": "dist/bin-esm.js",
- "ts-node-script": "dist/bin-script.js",
- "ts-node-transpile-only": "dist/bin-transpile.js",
- "ts-script": "dist/bin-script-deprecated.js"
- },
- "peerDependencies": {
- "@swc/core": ">=1.2.50",
- "@swc/wasm": ">=1.2.50",
- "@types/node": "*",
- "typescript": ">=2.7"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "@swc/wasm": {
- "optional": true
- }
- }
- },
- "node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/tsort": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz",
- "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==",
- "dev": true
- },
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true,
- "peer": true
- },
- "node_modules/tweetnacl-util": {
- "version": "0.15.1",
- "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
- "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==",
- "dev": true
- },
- "node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/typechain": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz",
- "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==",
- "dev": true,
- "peer": true,
- "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"
- },
- "bin": {
- "typechain": "dist/cli/cli.js"
- },
- "peerDependencies": {
- "typescript": ">=4.3.0"
- }
- },
- "node_modules/typechain/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/typechain/node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "peer": true,
- "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"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/typechain/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "peer": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
- "dev": true,
- "peer": true
- },
- "node_modules/typescript": {
- "version": "4.9.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
- "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
- "dev": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/typical": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
- "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
- "dev": true,
- "optional": true,
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/undici": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.16.0.tgz",
- "integrity": "sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==",
- "dev": true,
- "dependencies": {
- "busboy": "^1.6.0"
- },
- "engines": {
- "node": ">=12.18"
- }
- },
- "node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/utf-8-validate": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
- "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
- "node_modules/utf8": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
- "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==",
- "dev": true
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/v8-compile-cache-lib": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
- "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
- "dev": true,
- "peer": true
- },
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "peer": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/web3-utils": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz",
- "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/web3-utils/node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "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"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
- "dev": true
- },
- "node_modules/wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dev": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
- "dev": true
- },
- "node_modules/wordwrapjs": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
- "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "reduce-flatten": "^2.0.0",
- "typical": "^5.2.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/wordwrapjs/node_modules/typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "dependencies": {
- "mkdirp": "^0.5.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ws": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
- "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
- "dev": true,
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xmlhttprequest": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
- "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.18.6"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@cspotcode/source-map-support": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
- "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
- "dev": true,
- "peer": true,
- "requires": {
- "@jridgewell/trace-mapping": "0.3.9"
- }
- },
- "@ethersproject/abi": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
- "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
- "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
- "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
- "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
- "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
- "dev": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0"
- }
- },
- "@ethersproject/basex": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz",
- "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/properties": "^5.7.0"
- }
- },
- "@ethersproject/bignumber": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
- "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
- "dev": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "bn.js": "^5.2.1"
- },
- "dependencies": {
- "bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- }
- }
- },
- "@ethersproject/bytes": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
- "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
- "dev": true,
- "requires": {
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/constants": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
- "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
- "dev": true,
- "requires": {
- "@ethersproject/bignumber": "^5.7.0"
- }
- },
- "@ethersproject/contracts": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz",
- "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
- "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
- "dev": true,
- "requires": {
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/base64": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "@ethersproject/hdnode": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz",
- "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz",
- "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
- "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
- "dev": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "js-sha3": "0.8.0"
- }
- },
- "@ethersproject/logger": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
- "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==",
- "dev": true
- },
- "@ethersproject/networks": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
- "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
- "dev": true,
- "requires": {
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/pbkdf2": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz",
- "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/sha2": "^5.7.0"
- }
- },
- "@ethersproject/properties": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
- "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
- "dev": true,
- "requires": {
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/providers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz",
- "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "ws": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
- "dev": true,
- "peer": true,
- "requires": {}
- }
- }
- },
- "@ethersproject/random": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz",
- "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/rlp": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
- "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
- "dev": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/sha2": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz",
- "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "hash.js": "1.1.7"
- }
- },
- "@ethersproject/signing-key": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
- "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
- "dev": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- }
- }
- },
- "@ethersproject/solidity": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz",
- "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
- "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
- "dev": true,
- "requires": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/transactions": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
- "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
- "dev": true,
- "requires": {
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/rlp": "^5.7.0",
- "@ethersproject/signing-key": "^5.7.0"
- }
- },
- "@ethersproject/units": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
- "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "@ethersproject/wallet": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz",
- "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
- "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
- "dev": true,
- "requires": {
- "@ethersproject/base64": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "@ethersproject/wordlists": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz",
- "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true,
- "peer": true
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true,
- "peer": true
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
- "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "@metamask/eth-sig-util": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz",
- "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==",
- "dev": true,
- "requires": {
- "ethereumjs-abi": "^0.6.8",
- "ethereumjs-util": "^6.2.1",
- "ethjs-util": "^0.1.6",
- "tweetnacl": "^1.0.3",
- "tweetnacl-util": "^0.15.1"
- },
- "dependencies": {
- "@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
- "dev": true,
- "requires": {
- "@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"
- }
- },
- "tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
- "dev": true
- }
- }
- },
- "@morgan-stanley/ts-mocking-bird": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz",
- "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==",
- "dev": true,
- "peer": true,
- "requires": {
- "lodash": "^4.17.16",
- "uuid": "^7.0.3"
- },
- "dependencies": {
- "uuid": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
- "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
- "dev": true,
- "peer": true
- }
- }
- },
- "@noble/hashes": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz",
- "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==",
- "dev": true
- },
- "@noble/secp256k1": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz",
- "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==",
- "dev": true
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@nomicfoundation/ethereumjs-block": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz",
- "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-tx": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "ethereum-cryptography": "0.1.3"
- }
- },
- "@nomicfoundation/ethereumjs-blockchain": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz",
- "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-ethash": "^2.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "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"
- },
- "dependencies": {
- "level": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz",
- "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==",
- "dev": true,
- "requires": {
- "browser-level": "^1.0.1",
- "classic-level": "^1.2.0"
- }
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- }
- }
- },
- "@nomicfoundation/ethereumjs-common": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz",
- "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "crc-32": "^1.2.0"
- }
- },
- "@nomicfoundation/ethereumjs-ethash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz",
- "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "abstract-level": "^1.0.3",
- "bigint-crypto-utils": "^3.0.23",
- "ethereum-cryptography": "0.1.3"
- }
- },
- "@nomicfoundation/ethereumjs-evm": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz",
- "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "@types/async-eventemitter": "^0.2.1",
- "async-eventemitter": "^0.2.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "mcl-wasm": "^0.7.1",
- "rustbn.js": "~0.2.0"
- }
- },
- "@nomicfoundation/ethereumjs-rlp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz",
- "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==",
- "dev": true
- },
- "@nomicfoundation/ethereumjs-statemanager": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz",
- "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "functional-red-black-tree": "^1.0.1"
- }
- },
- "@nomicfoundation/ethereumjs-trie": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz",
- "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "ethereum-cryptography": "0.1.3",
- "readable-stream": "^3.6.0"
- }
- },
- "@nomicfoundation/ethereumjs-tx": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz",
- "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "ethereum-cryptography": "0.1.3"
- }
- },
- "@nomicfoundation/ethereumjs-util": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz",
- "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2",
- "ethereum-cryptography": "0.1.3"
- }
- },
- "@nomicfoundation/ethereumjs-vm": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz",
- "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==",
- "dev": true,
- "requires": {
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-blockchain": "^6.0.0",
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-evm": "^1.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-statemanager": "^1.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-tx": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "@types/async-eventemitter": "^0.2.1",
- "async-eventemitter": "^0.2.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "functional-red-black-tree": "^1.0.1",
- "mcl-wasm": "^0.7.1",
- "rustbn.js": "~0.2.0"
- }
- },
- "@nomicfoundation/hardhat-chai-matchers": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.5.tgz",
- "integrity": "sha512-+W5C/+5FHI2xBajUN9THSNc1UP6FUsA7LeLmfnaC9VMi/50/DEjjxd8OmizEXgV1Bjck7my4NVQLL1Ti39FkpA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/abi": "^5.1.2",
- "@types/chai-as-promised": "^7.1.3",
- "chai-as-promised": "^7.1.1",
- "chalk": "^2.4.2",
- "deep-eql": "^4.0.1",
- "ordinal": "^1.0.3"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "@nomicfoundation/hardhat-network-helpers": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz",
- "integrity": "sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw==",
- "dev": true,
- "peer": true,
- "requires": {
- "ethereumjs-util": "^7.1.4"
- }
- },
- "@nomicfoundation/hardhat-toolbox": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.1.tgz",
- "integrity": "sha512-/pr8m9xlqiNlq6fXv4hEPNwdNwUhysoB2qbDCKqERfPpq34EydUQTC3Vis4aIea8RLwSrU8sDXFdv4TQxYstKw==",
- "dev": true,
- "requires": {}
- },
- "@nomicfoundation/solidity-analyzer": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz",
- "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==",
- "dev": true,
- "requires": {
- "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0",
- "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0",
- "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0",
- "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0",
- "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0",
- "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0",
- "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0"
- }
- },
- "@nomicfoundation/solidity-analyzer-darwin-arm64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz",
- "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-darwin-x64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz",
- "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-freebsd-x64": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz",
- "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz",
- "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-linux-arm64-musl": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz",
- "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-linux-x64-gnu": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz",
- "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-linux-x64-musl": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz",
- "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz",
- "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz",
- "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==",
- "dev": true,
- "optional": true
- },
- "@nomicfoundation/solidity-analyzer-win32-x64-msvc": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz",
- "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==",
- "dev": true,
- "optional": true
- },
- "@nomiclabs/hardhat-ethers": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz",
- "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==",
- "dev": true,
- "peer": true,
- "requires": {}
- },
- "@nomiclabs/hardhat-etherscan": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.5.tgz",
- "integrity": "sha512-PxPX28AGBAlxgXLU27NB3oiMsklxbNhM75SDC4v1QPCyPeAxGm4xV0WpYbR10W7sxY2WF3Ek7u7GhjbQWa2Fcg==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "peer": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "peer": true
- },
- "cbor": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz",
- "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==",
- "dev": true,
- "peer": true,
- "requires": {
- "nofilter": "^3.1.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "peer": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true
- },
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "peer": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "peer": true
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "peer": true
- },
- "nofilter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz",
- "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==",
- "dev": true,
- "peer": true
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
- }
- }
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "table": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
- "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
- "dev": true,
- "peer": true,
- "requires": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- }
- }
- }
- },
- "@nomiclabs/hardhat-solhint": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-solhint/-/hardhat-solhint-3.0.0.tgz",
- "integrity": "sha512-uouERJ2UVsN5ek2veA8nq/Pwq06INRcWdZxjE1vcEZ4i+Et8Qiy0SrPO7KRU0rh3rssBgfOtCbbAEOfh7YBAvA==",
- "dev": true,
- "requires": {
- "solhint": "^3.0.0"
- }
- },
- "@openzeppelin/contracts": {
- "version": "4.8.3",
- "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.3.tgz",
- "integrity": "sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg==",
- "dev": true
- },
- "@scure/base": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz",
- "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==",
- "dev": true
- },
- "@scure/bip32": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz",
- "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==",
- "dev": true,
- "requires": {
- "@noble/hashes": "~1.1.1",
- "@noble/secp256k1": "~1.6.0",
- "@scure/base": "~1.1.0"
- }
- },
- "@scure/bip39": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz",
- "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==",
- "dev": true,
- "requires": {
- "@noble/hashes": "~1.1.1",
- "@scure/base": "~1.1.0"
- }
- },
- "@sentry/core": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz",
- "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz",
- "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==",
- "dev": true,
- "requires": {
- "@sentry/types": "5.30.0",
- "@sentry/utils": "5.30.0",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/minimal": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz",
- "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==",
- "dev": true,
- "requires": {
- "@sentry/hub": "5.30.0",
- "@sentry/types": "5.30.0",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/node": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz",
- "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==",
- "dev": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true
- }
- }
- },
- "@sentry/tracing": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz",
- "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz",
- "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==",
- "dev": true
- },
- "@sentry/utils": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz",
- "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==",
- "dev": true,
- "requires": {
- "@sentry/types": "5.30.0",
- "tslib": "^1.9.3"
- }
- },
- "@solidity-parser/parser": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz",
- "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==",
- "dev": true,
- "requires": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "@tsconfig/node10": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
- "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
- "dev": true,
- "peer": true
- },
- "@tsconfig/node12": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
- "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
- "dev": true,
- "peer": true
- },
- "@tsconfig/node14": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
- "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
- "dev": true,
- "peer": true
- },
- "@tsconfig/node16": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
- "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
- "dev": true,
- "peer": true
- },
- "@typechain/ethers-v5": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz",
- "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==",
- "dev": true,
- "peer": true,
- "requires": {
- "lodash": "^4.17.15",
- "ts-essentials": "^7.0.1"
- }
- },
- "@typechain/hardhat": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz",
- "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==",
- "dev": true,
- "peer": true,
- "requires": {
- "fs-extra": "^9.1.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
- "dev": true,
- "peer": true
- }
- }
- },
- "@types/async-eventemitter": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz",
- "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==",
- "dev": true
- },
- "@types/bn.js": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz",
- "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/chai": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz",
- "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==",
- "dev": true,
- "peer": true
- },
- "@types/chai-as-promised": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz",
- "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "@types/chai": "*"
- }
- },
- "@types/concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/form-data": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
- "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
- "dev": true,
- "peer": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
- "dev": true,
- "requires": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==",
- "dev": true
- },
- "@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
- "dev": true
- },
- "@types/mocha": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz",
- "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==",
- "dev": true,
- "peer": true
- },
- "@types/node": {
- "version": "18.11.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
- "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==",
- "dev": true
- },
- "@types/pbkdf2": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
- "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/prettier": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
- "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
- "dev": true,
- "peer": true
- },
- "@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true,
- "peer": true
- },
- "@types/secp256k1": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
- "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "abbrev": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
- "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==",
- "dev": true
- },
- "abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "dev": true,
- "requires": {
- "event-target-shim": "^5.0.0"
- }
- },
- "abstract-level": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz",
- "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "level-supports": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz",
- "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==",
- "dev": true
- }
- }
- },
- "acorn": {
- "version": "8.8.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
- "dev": true,
- "peer": true
- },
- "acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "requires": {}
- },
- "acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
- "dev": true,
- "peer": true
- },
- "address": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
- "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
- "dev": true
- },
- "adm-zip": {
- "version": "0.4.16",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
- "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
- "dev": true
- },
- "aes-js": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
- "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==",
- "dev": true,
- "peer": true
- },
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "requires": {
- "debug": "4"
- }
- },
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "dependencies": {
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true
- }
- }
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
- "dev": true,
- "optional": true
- },
- "ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "dev": true
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "antlr4": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz",
- "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==",
- "dev": true
- },
- "antlr4ts": {
- "version": "0.5.0-alpha.4",
- "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz",
- "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==",
- "dev": true
- },
- "anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true,
- "peer": true
- },
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true,
- "peer": true
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
- "dev": true,
- "peer": true
- },
- "array.prototype.reduce": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz",
- "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "peer": true
- },
- "asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "peer": true
- },
- "assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "peer": true
- },
- "ast-parents": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz",
- "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==",
- "dev": true
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
- "dev": true
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
- "dev": true
- },
- "async-eventemitter": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz",
- "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==",
- "dev": true,
- "requires": {
- "async": "^2.4.0"
- },
- "dependencies": {
- "async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- }
- }
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true,
- "peer": true
- },
- "at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "peer": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "peer": true
- },
- "aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
- "dev": true,
- "peer": true
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "base-x": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
- "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "peer": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bech32": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
- "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==",
- "dev": true,
- "peer": true
- },
- "bigint-crypto-utils": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz",
- "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==",
- "dev": true,
- "requires": {
- "bigint-mod-arith": "^3.1.0"
- }
- },
- "bigint-mod-arith": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz",
- "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==",
- "dev": true
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "blakejs": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
- "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==",
- "dev": true
- },
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
- "dev": true
- },
- "browser-level": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz",
- "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==",
- "dev": true,
- "requires": {
- "abstract-level": "^1.0.2",
- "catering": "^2.1.1",
- "module-error": "^1.0.2",
- "run-parallel-limit": "^1.1.0"
- }
- },
- "browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "requires": {
- "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": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
- "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
- "dev": true,
- "requires": {
- "base-x": "^3.0.2"
- }
- },
- "bs58check": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
- "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
- "dev": true,
- "requires": {
- "bs58": "^4.0.0",
- "create-hash": "^1.1.0",
- "safe-buffer": "^5.1.2"
- }
- },
- "buffer-from": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
- "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
- "dev": true
- },
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
- "dev": true
- },
- "bufferutil": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
- "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "node-gyp-build": "^4.3.0"
- }
- },
- "busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dev": true,
- "requires": {
- "streamsearch": "^1.1.0"
- }
- },
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- }
- },
- "caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
- "dev": true,
- "requires": {
- "callsites": "^2.0.0"
- }
- },
- "caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
- "dev": true,
- "requires": {
- "caller-callsite": "^2.0.0"
- }
- },
- "callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true,
- "peer": true
- },
- "catering": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz",
- "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==",
- "dev": true
- },
- "chai": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
- "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
- "dev": true,
- "peer": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^4.1.2",
- "get-func-name": "^2.0.0",
- "loupe": "^2.3.1",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.5"
- }
- },
- "chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dev": true,
- "peer": true,
- "requires": {
- "check-error": "^1.0.2"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
- },
- "charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
- "dev": true,
- "peer": true
- },
- "check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
- "dev": true,
- "peer": true
- },
- "ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "classic-level": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz",
- "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==",
- "dev": true,
- "requires": {
- "abstract-level": "^1.0.2",
- "catering": "^2.1.0",
- "module-error": "^1.0.1",
- "napi-macros": "~2.0.0",
- "node-gyp-build": "^4.3.0"
- },
- "dependencies": {
- "napi-macros": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
- "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
- "dev": true
- }
- }
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
- "dev": true,
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-table3": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
- "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
- "dev": true,
- "peer": true,
- "requires": {
- "colors": "^1.1.2",
- "object-assign": "^4.1.0",
- "string-width": "^2.1.1"
- }
- },
- "cli-width": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
- "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
- "dev": true
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
- "peer": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "peer": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "command-exists": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
- "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
- "dev": true
- },
- "command-line-args": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
- "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
- "dev": true,
- "peer": true,
- "requires": {
- "array-back": "^3.1.0",
- "find-replace": "^3.0.0",
- "lodash.camelcase": "^4.3.0",
- "typical": "^4.0.0"
- }
- },
- "command-line-usage": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
- "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
- "dev": true,
- "peer": true,
- "requires": {
- "array-back": "^4.0.2",
- "chalk": "^2.4.2",
- "table-layout": "^1.0.2",
- "typical": "^5.2.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "peer": true
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true
- }
- }
- },
- "commander": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz",
- "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "peer": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "peer": true
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "peer": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "peer": true
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "peer": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true,
- "peer": true
- },
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- }
- }
- },
- "crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
- "dev": true
- },
- "create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "requires": {
- "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": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true,
- "peer": true
- },
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
- "dev": true,
- "peer": true
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "peer": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "death": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz",
- "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==",
- "dev": true
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true
- },
- "deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
- "dev": true,
- "peer": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "peer": true
- },
- "deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
- "dev": true,
- "requires": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
- "peer": true
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true
- },
- "detect-port": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
- "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
- "dev": true,
- "requires": {
- "address": "^1.0.1",
- "debug": "4"
- }
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
- "peer": true
- },
- "difflib": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz",
- "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==",
- "dev": true,
- "requires": {
- "heap": ">= 0.2.0"
- }
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "peer": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "dev": true,
- "requires": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "requires": {
- "ansi-colors": "^4.1.1"
- }
- },
- "env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.20.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
- "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.1.3",
- "get-symbol-description": "^1.0.0",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "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-weakref": "^1.0.2",
- "object-inspect": "^1.12.2",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.4.3",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "unbox-primitive": "^1.0.2"
- }
- },
- "es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
- "escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==",
- "dev": true,
- "requires": {
- "esprima": "^2.7.1",
- "estraverse": "^1.9.1",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.2.0"
- },
- "dependencies": {
- "esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true
- },
- "estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==",
- "dev": true
- }
- }
- },
- "eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
- "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
- "dev": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- },
- "espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
- "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
- "dev": true,
- "requires": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
- "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
- "dev": true
- }
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "requires": {
- "estraverse": "^5.1.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "requires": {
- "estraverse": "^5.2.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "eth-gas-reporter": {
- "version": "0.2.25",
- "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz",
- "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "@ethersproject/abi": "^5.0.0-beta.146",
- "@solidity-parser/parser": "^0.14.0",
- "cli-table3": "^0.5.0",
- "colors": "1.4.0",
- "ethereum-cryptography": "^1.0.3",
- "ethers": "^4.0.40",
- "fs-readdir-recursive": "^1.1.0",
- "lodash": "^4.17.14",
- "markdown-table": "^1.1.3",
- "mocha": "^7.1.1",
- "req-cwd": "^2.0.0",
- "request": "^2.88.0",
- "request-promise-native": "^1.0.5",
- "sha1": "^1.1.1",
- "sync-request": "^6.0.0"
- },
- "dependencies": {
- "ansi-colors": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
- "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
- "dev": true,
- "peer": true
- },
- "ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true,
- "peer": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "peer": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "chokidar": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
- "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
- "dev": true,
- "peer": true,
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.1",
- "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"
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "peer": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true,
- "peer": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "peer": true
- },
- "ethereum-cryptography": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz",
- "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "@noble/hashes": "1.1.2",
- "@noble/secp256k1": "1.6.3",
- "@scure/bip32": "1.1.0",
- "@scure/bip39": "1.1.0"
- }
- },
- "ethers": {
- "version": "4.0.49",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz",
- "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==",
- "dev": true,
- "peer": true,
- "requires": {
- "aes-js": "3.0.0",
- "bn.js": "^4.11.9",
- "elliptic": "6.5.4",
- "hash.js": "1.1.3",
- "js-sha3": "0.5.7",
- "scrypt-js": "2.0.4",
- "setimmediate": "1.0.4",
- "uuid": "2.0.1",
- "xmlhttprequest": "1.8.0"
- }
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "peer": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "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-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "peer": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true
- },
- "hash.js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
- "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
- "dev": true,
- "peer": true,
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "js-sha3": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
- "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==",
- "dev": true,
- "peer": true
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
- "peer": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "peer": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "chalk": "^2.4.2"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "peer": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "mocha": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
- "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "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"
- }
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true,
- "peer": true
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "peer": true,
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "peer": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "peer": true
- },
- "readdirp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
- "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "picomatch": "^2.0.4"
- }
- },
- "scrypt-js": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
- "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==",
- "dev": true,
- "peer": true
- },
- "setimmediate": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz",
- "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==",
- "dev": true,
- "peer": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "peer": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "peer": true
- },
- "supports-color": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
- "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "uuid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
- "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==",
- "dev": true,
- "peer": true
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true,
- "peer": true
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "peer": true,
- "requires": {
- "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-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "peer": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- },
- "yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
- "dev": true,
- "peer": true,
- "requires": {
- "flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.0"
- }
- }
- }
- },
- "ethereum-bloom-filters": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
- "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
- "dev": true,
- "requires": {
- "js-sha3": "^0.8.0"
- }
- },
- "ethereum-cryptography": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
- "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
- "dev": true,
- "requires": {
- "@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"
- }
- },
- "ethereumjs-abi": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz",
- "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==",
- "dev": true,
- "requires": {
- "bn.js": "^4.11.8",
- "ethereumjs-util": "^6.0.0"
- },
- "dependencies": {
- "@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
- "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
- "dev": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- }
- }
- },
- "ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "peer": true,
- "requires": {
- "@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": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
- "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==",
- "dev": true,
- "requires": {
- "bn.js": "4.11.6",
- "number-to-bn": "1.7.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
- "dev": true
- }
- }
- },
- "ethjs-util": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
- "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
- "dev": true,
- "requires": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
- }
- },
- "event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "dev": true
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true,
- "peer": true
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "peer": true
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-diff": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
- "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
- "dev": true,
- "requires": {
- "@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"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- }
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "dev": true,
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "find-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
- "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "array-back": "^3.0.1"
- }
- },
- "flat": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
- "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
- "dev": true,
- "requires": {
- "is-buffer": "~2.0.3"
- }
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "dev": true,
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- }
- },
- "flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
- "dev": true
- },
- "follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "peer": true
- },
- "fp-ts": {
- "version": "1.19.3",
- "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz",
- "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==",
- "dev": true
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true,
- "peer": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
- "dev": true,
- "requires": {
- "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": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
- "dev": true
- },
- "functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
- "get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
- "dev": true,
- "peer": true
- },
- "get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
- }
- },
- "get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
- "dev": true,
- "peer": true
- },
- "get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "peer": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "ghost-testrpc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
- "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2",
- "node-emoji": "^1.10.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
- "dev": true,
- "requires": {
- "@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"
- }
- },
- "gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.3"
- }
- },
- "graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "dev": true
- },
- "growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
- "dev": true
- },
- "handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.0",
- "source-map": "^0.6.1",
- "uglify-js": "^3.1.4",
- "wordwrap": "^1.0.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
- "dev": true,
- "peer": true
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "dev": true,
- "peer": true,
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "hardhat": {
- "version": "2.12.6",
- "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.6.tgz",
- "integrity": "sha512-0Ent1O5DsPgvaVb5sxEgsQ3bJRt/Ex92tsoO+xjoNH2Qc4bFmhI5/CHVlFikulalxOPjNmw5XQ2vJFuVQFESAA==",
- "dev": true,
- "requires": {
- "@ethersproject/abi": "^5.1.2",
- "@metamask/eth-sig-util": "^4.0.0",
- "@nomicfoundation/ethereumjs-block": "^4.0.0",
- "@nomicfoundation/ethereumjs-blockchain": "^6.0.0",
- "@nomicfoundation/ethereumjs-common": "^3.0.0",
- "@nomicfoundation/ethereumjs-evm": "^1.0.0",
- "@nomicfoundation/ethereumjs-rlp": "^4.0.0",
- "@nomicfoundation/ethereumjs-statemanager": "^1.0.0",
- "@nomicfoundation/ethereumjs-trie": "^5.0.0",
- "@nomicfoundation/ethereumjs-tx": "^4.0.0",
- "@nomicfoundation/ethereumjs-util": "^8.0.0",
- "@nomicfoundation/ethereumjs-vm": "^6.0.0",
- "@nomicfoundation/solidity-analyzer": "^0.1.0",
- "@sentry/node": "^5.18.1",
- "@types/bn.js": "^5.1.0",
- "@types/lru-cache": "^5.1.0",
- "abort-controller": "^3.0.0",
- "adm-zip": "^0.4.16",
- "aggregate-error": "^3.0.0",
- "ansi-escapes": "^4.3.0",
- "chalk": "^2.4.2",
- "chokidar": "^3.4.0",
- "ci-info": "^2.0.0",
- "debug": "^4.1.1",
- "enquirer": "^2.3.0",
- "env-paths": "^2.2.0",
- "ethereum-cryptography": "^1.0.3",
- "ethereumjs-abi": "^0.6.8",
- "find-up": "^2.1.0",
- "fp-ts": "1.19.3",
- "fs-extra": "^7.0.1",
- "glob": "7.2.0",
- "immutable": "^4.0.0-rc.12",
- "io-ts": "1.10.4",
- "keccak": "^3.0.2",
- "lodash": "^4.17.11",
- "mnemonist": "^0.38.0",
- "mocha": "^10.0.0",
- "p-map": "^4.0.0",
- "qs": "^6.7.0",
- "raw-body": "^2.4.1",
- "resolve": "1.17.0",
- "semver": "^6.3.0",
- "solc": "0.7.3",
- "source-map-support": "^0.5.13",
- "stacktrace-parser": "^0.1.10",
- "tsort": "0.0.1",
- "undici": "^5.14.0",
- "uuid": "^8.3.2",
- "ws": "^7.4.6"
- },
- "dependencies": {
- "ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true
- },
- "ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "requires": {
- "type-fest": "^0.21.3"
- }
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- }
- }
- },
- "chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.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"
- }
- },
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "commander": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
- "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
- "dev": true
- },
- "decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true
- },
- "diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "ethereum-cryptography": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz",
- "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==",
- "dev": true,
- "requires": {
- "@noble/hashes": "1.1.2",
- "@noble/secp256k1": "1.6.3",
- "@scure/bip32": "1.1.0",
- "@scure/bip39": "1.1.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true
- },
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "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-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "mocha": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
- "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "requires": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "requires": {
- "p-locate": "^5.0.0"
- }
- },
- "minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
- "p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "requires": {
- "p-limit": "^3.0.2"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "nanoid": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
- "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
- "dev": true
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "solc": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz",
- "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- },
- "dependencies": {
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- }
- }
- },
- "type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true
- },
- "workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
- "dev": true
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true
- },
- "yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "requires": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- }
- }
- }
- },
- "hardhat-gas-reporter": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz",
- "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==",
- "dev": true,
- "peer": true,
- "requires": {
- "array-uniq": "1.0.3",
- "eth-gas-reporter": "^0.2.25",
- "sha1": "^1.1.1"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.1"
- }
- },
- "has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true
- },
- "has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
- },
- "heap": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz",
- "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==",
- "dev": true
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dev": true,
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "http-basic": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
- "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
- "dev": true,
- "peer": true,
- "requires": {
- "caseless": "^0.12.0",
- "concat-stream": "^1.6.2",
- "http-response-object": "^3.0.1",
- "parse-cache-control": "^1.0.1"
- }
- },
- "http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- }
- },
- "http-response-object": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
- "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@types/node": "^10.0.3"
- },
- "dependencies": {
- "@types/node": {
- "version": "10.17.60",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
- "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
- "dev": true,
- "peer": true
- }
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "requires": {
- "agent-base": "6",
- "debug": "4"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true
- },
- "ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "dev": true
- },
- "immutable": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
- "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==",
- "dev": true
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
- "dev": true,
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "internal-slot": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
- "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- }
- },
- "interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "dev": true
- },
- "io-ts": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz",
- "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==",
- "dev": true,
- "requires": {
- "fp-ts": "^1.0.0"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "requires": {
- "has-bigints": "^1.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
- "dev": true
- },
- "is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true
- },
- "is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-hex-prefixed": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
- "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
- "dev": true
- },
- "is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- },
- "is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
- "is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true,
- "peer": true
- },
- "is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true
- },
- "is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true,
- "peer": true
- },
- "js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
- "dev": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true,
- "peer": true
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
- "json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true,
- "peer": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true,
- "peer": true
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "jsonschema": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
- "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==",
- "dev": true
- },
- "jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dev": true,
- "peer": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
- "keccak": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz",
- "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==",
- "dev": true,
- "requires": {
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0",
- "readable-stream": "^3.6.0"
- }
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.9"
- }
- },
- "level-transcoder": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz",
- "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==",
- "dev": true,
- "requires": {
- "buffer": "^6.0.3",
- "module-error": "^1.0.1"
- },
- "dependencies": {
- "buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- }
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
- "lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "dev": true,
- "peer": true
- },
- "lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true,
- "peer": true
- },
- "loupe": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
- "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
- "dev": true,
- "peer": true,
- "requires": {
- "get-func-name": "^2.0.0"
- }
- },
- "lru_map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
- "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
- "dev": true
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true,
- "peer": true
- },
- "markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
- "dev": true,
- "peer": true
- },
- "mcl-wasm": {
- "version": "0.7.9",
- "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz",
- "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==",
- "dev": true
- },
- "md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "memory-level": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz",
- "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==",
- "dev": true,
- "requires": {
- "abstract-level": "^1.0.0",
- "functional-red-black-tree": "^1.0.1",
- "module-error": "^1.0.1"
- }
- },
- "memorystream": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
- "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
- "dev": true
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "requires": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- }
- },
- "mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "peer": true
- },
- "mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "peer": true,
- "requires": {
- "mime-db": "1.52.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "dev": true
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
- "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.6"
- }
- },
- "mnemonist": {
- "version": "0.38.5",
- "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz",
- "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==",
- "dev": true,
- "requires": {
- "obliterator": "^2.0.0"
- }
- },
- "module-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz",
- "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==",
- "dev": true
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "node-addon-api": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
- "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
- "dev": true
- },
- "node-emoji": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
- "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.21"
- }
- },
- "node-environment-flags": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
- "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
- "dev": true,
- "requires": {
- "object.getownpropertydescriptors": "^2.0.3",
- "semver": "^5.7.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
- }
- },
- "node-gyp-build": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
- "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
- "dev": true
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "number-to-bn": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
- "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==",
- "dev": true,
- "requires": {
- "bn.js": "4.11.6",
- "strip-hex-prefix": "1.0.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
- "dev": true
- }
- }
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true,
- "peer": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "peer": true
- },
- "object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "dev": true
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
- },
- "object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz",
- "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==",
- "dev": true,
- "requires": {
- "array.prototype.reduce": "^1.0.5",
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
- },
- "obliterator": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
- "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
- "dev": true,
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "ordinal": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz",
- "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==",
- "dev": true,
- "peer": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
- "dev": true
- },
- "p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- },
- "dependencies": {
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- }
- }
- },
- "parse-cache-control": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
- "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
- "dev": true,
- "peer": true
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true,
- "peer": true
- },
- "pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
- "dev": true,
- "requires": {
- "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": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true,
- "peer": true
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true
- },
- "prettier": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
- "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
- "dev": true,
- "peer": true
- },
- "prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "requires": {
- "fast-diff": "^1.1.2"
- }
- },
- "prettier-plugin-solidity": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.2.tgz",
- "integrity": "sha512-KC5oNbFJfyBaFiO0kl56J6AXnDmr9tUlBV1iqo864x4KQrKYKaBZvW9jhT2oC0NHoNp7/GoMJNxqL8pp8k7C/g==",
- "dev": true,
- "peer": true,
- "requires": {
- "@solidity-parser/parser": "^0.15.0",
- "semver": "^7.3.8",
- "solidity-comments-extractor": "^0.0.7"
- },
- "dependencies": {
- "@solidity-parser/parser": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz",
- "integrity": "sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==",
- "dev": true,
- "peer": true,
- "requires": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "peer": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true,
- "peer": true
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "promise": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
- "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
- "dev": true,
- "peer": true,
- "requires": {
- "asap": "~2.0.6"
- }
- },
- "psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true,
- "peer": true
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dev": true,
- "requires": {
- "side-channel": "^1.0.4"
- }
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dev": true,
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dev": true,
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "recursive-readdir": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
- "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
- "dev": true,
- "requires": {
- "minimatch": "^3.0.5"
- }
- },
- "reduce-flatten": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
- "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
- "dev": true,
- "peer": true
- },
- "regexp.prototype.flags": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
- "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
- }
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
- "dev": true
- },
- "req-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
- "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "req-from": "^2.0.0"
- }
- },
- "req-from": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
- "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==",
- "dev": true,
- "peer": true,
- "requires": {
- "resolve-from": "^3.0.0"
- }
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "dev": true,
- "peer": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true,
- "peer": true
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true,
- "peer": true
- }
- }
- },
- "request-promise-core": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
- "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
- "dev": true,
- "peer": true,
- "requires": {
- "lodash": "^4.17.19"
- }
- },
- "request-promise-native": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
- "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
- "dev": true,
- "peer": true,
- "requires": {
- "request-promise-core": "1.1.4",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
- "dev": true
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
- "dev": true,
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "rlp": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
- "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
- "dev": true,
- "requires": {
- "bn.js": "^5.2.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- }
- }
- },
- "run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
- "dev": true
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "run-parallel-limit": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz",
- "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "rustbn.js": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz",
- "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==",
- "dev": true
- },
- "rxjs": {
- "version": "6.6.7",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
- "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
- "dev": true,
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- },
- "safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "sc-istanbul": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz",
- "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true
- },
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "dependencies": {
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- }
- }
- },
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==",
- "dev": true
- },
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "requires": {
- "has-flag": "^1.0.0"
- }
- }
- }
- },
- "scrypt-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
- "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
- "dev": true
- },
- "secp256k1": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz",
- "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==",
- "dev": true,
- "requires": {
- "elliptic": "^6.5.4",
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "sha1": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
- "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
- "dev": true,
- "peer": true,
- "requires": {
- "charenc": ">= 0.0.1",
- "crypt": ">= 0.0.1"
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dev": true,
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true
- },
- "shelljs": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
- "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
- "dev": true,
- "requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- }
- },
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- }
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- }
- }
- },
- "solhint": {
- "version": "3.3.8",
- "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.8.tgz",
- "integrity": "sha512-TkYyJ6uUJCaiqRKuhHhFuoAoyco9Ia+RDKhl3usjG/rkaNk8/LdLRla2Xln7MVdBTaPKNAU8ezTRSit50Yy4qw==",
- "dev": true,
- "requires": {
- "@solidity-parser/parser": "^0.14.5",
- "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",
- "prettier": "^1.14.3",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "prettier": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
- "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
- "dev": true,
- "optional": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "solhint-plugin-prettier": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz",
- "integrity": "sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==",
- "dev": true,
- "requires": {
- "prettier-linter-helpers": "^1.0.0"
- }
- },
- "solidity-comments-extractor": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz",
- "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==",
- "dev": true,
- "peer": true
- },
- "solidity-coverage": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz",
- "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==",
- "dev": true,
- "requires": {
- "@ethersproject/abi": "^5.0.9",
- "@solidity-parser/parser": "^0.14.1",
- "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"
- },
- "dependencies": {
- "ansi-colors": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
- "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
- "dev": true
- },
- "ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chokidar": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
- "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.1",
- "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"
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
- "dev": true,
- "requires": {
- "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-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2"
- }
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "mocha": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz",
- "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "supports-color": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
- "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true
- },
- "readdirp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
- "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
- "dev": true,
- "requires": {
- "picomatch": "^2.0.4"
- }
- },
- "semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "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-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- },
- "yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
- "dev": true,
- "requires": {
- "flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.0"
- }
- }
- }
- },
- "source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==",
- "dev": true,
- "optional": true,
- "requires": {
- "amdefine": ">=0.0.4"
- }
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "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": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
- "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.7.1"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
- "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
- "dev": true
- }
- }
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true
- },
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
- "dev": true,
- "peer": true
- },
- "streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- },
- "string-format": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz",
- "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==",
- "dev": true,
- "peer": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "node": ">=6"
},
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "dev": true
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
"dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
+ "license": "MIT"
},
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "strip-hex-prefix": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
- "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true,
- "requires": {
- "is-hex-prefixed": "1.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/is-text-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
"dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^4.0.0"
+ "license": "MIT",
+ "dependencies": {
+ "text-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "sync-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
- "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"dev": true,
- "peer": true,
- "requires": {
- "http-response-object": "^3.0.1",
- "sync-rpc": "^1.2.1",
- "then-request": "^6.0.0"
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
}
},
- "sync-rpc": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
- "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
- "peer": true,
- "requires": {
- "get-port": "^3.1.0"
- }
+ "license": "MIT"
},
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
+ "license": "MIT",
"dependencies": {
- "ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "table-layout": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
- "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true,
- "peer": true,
- "requires": {
- "array-back": "^4.0.1",
- "deep-extend": "~0.6.0",
- "typical": "^5.2.0",
- "wordwrapjs": "^4.0.0"
- },
- "dependencies": {
- "array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "peer": true
- },
- "typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true
- }
- }
+ "license": "MIT"
},
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "license": "MIT"
},
- "then-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
- "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
"dev": true,
- "peer": true,
- "requires": {
- "@types/concat-stream": "^1.6.0",
- "@types/form-data": "0.0.33",
- "@types/node": "^8.0.0",
- "@types/qs": "^6.2.31",
- "caseless": "~0.12.0",
- "concat-stream": "^1.6.0",
- "form-data": "^2.2.0",
- "http-basic": "^8.1.1",
- "http-response-object": "^3.0.1",
- "promise": "^8.0.0",
- "qs": "^6.4.0"
- },
+ "license": "(MIT OR Apache-2.0)",
"dependencies": {
- "@types/node": {
- "version": "8.10.66",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
- "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
- "dev": true,
- "peer": true
- },
- "form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "dev": true,
- "peer": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- }
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
}
},
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true,
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
+ "license": "MIT"
},
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true
+ "license": "MIT"
},
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true,
- "peer": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
+ "license": "MIT"
},
- "ts-command-line-args": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz",
- "integrity": "sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==",
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
"dev": true,
- "peer": true,
- "requires": {
- "@morgan-stanley/ts-mocking-bird": "^0.6.2",
- "chalk": "^4.1.0",
- "command-line-args": "^5.1.1",
- "command-line-usage": "^6.1.0",
- "string-format": "^2.0.0"
- }
+ "license": "MIT"
},
- "ts-essentials": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz",
- "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==",
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true,
- "peer": true,
- "requires": {}
+ "license": "MIT"
},
- "ts-node": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
- "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
"dev": true,
- "peer": true,
- "requires": {
- "@cspotcode/source-map-support": "^0.8.0",
- "@tsconfig/node10": "^1.0.7",
- "@tsconfig/node12": "^1.0.7",
- "@tsconfig/node14": "^1.0.0",
- "@tsconfig/node16": "^1.0.2",
- "acorn": "^8.4.1",
- "acorn-walk": "^8.1.1",
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "v8-compile-cache-lib": "^3.0.1",
- "yn": "3.1.1"
- }
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
+ "license": "MIT"
},
- "tsort": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz",
- "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
"dev": true,
- "peer": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
+ "license": "MIT"
},
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
"dev": true,
- "peer": true
+ "license": "MIT"
},
- "tweetnacl-util": {
- "version": "0.15.1",
- "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
- "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==",
- "dev": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
+ "license": "MIT"
},
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
"dev": true,
- "peer": true
+ "license": "MIT"
},
- "typechain": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz",
- "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==",
+ "node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
"dev": true,
- "peer": true,
- "requires": {
- "@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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.10"
},
- "dependencies": {
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "peer": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "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"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "peer": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
- "peer": true
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "typescript": {
- "version": "4.9.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
- "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
- "peer": true
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "typical": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
- "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
- "peer": true
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true,
- "optional": true
+ "license": "ISC"
},
- "unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "undici": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.16.0.tgz",
- "integrity": "sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==",
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
- "requires": {
- "busboy": "^1.6.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
- "requires": {
- "punycode": "^2.1.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
- "utf-8-validate": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
- "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "node-gyp-build": "^4.3.0"
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "utf8": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
- "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==",
- "dev": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "v8-compile-cache-lib": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
- "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
- "dev": true,
- "peer": true
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
- "peer": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "web3-utils": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz",
- "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==",
+ "node_modules/text-extensions": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
"dev": true,
- "requires": {
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
},
- "dependencies": {
- "bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
+ "license": "MIT"
},
- "which-boxed-primitive": {
+ "node_modules/tinyexec": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
"dev": true,
- "requires": {
- "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"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
}
},
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
- "dev": true
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
}
},
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
- "dev": true
+ "node_modules/undici-types": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
+ "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
+ "dev": true,
+ "license": "MIT"
},
- "wordwrapjs": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
- "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
"dev": true,
- "peer": true,
- "requires": {
- "reduce-flatten": "^2.0.0",
- "typical": "^5.2.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
- "dependencies": {
- "typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "wrap-ansi": {
+ "node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
- "dependencies": {
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "ws": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
- "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
- "dev": true,
- "requires": {}
- },
- "xmlhttprequest": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
- "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
- "dev": true,
- "peer": true
- },
- "y18n": {
+ "node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
- "peer": true
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
}
}
}
diff --git a/package.json b/package.json
index 4ae9136e..b87dcba5 100644
--- a/package.json
+++ b/package.json
@@ -1,20 +1,14 @@
{
"name": "@onchain-id/solidity",
- "version": "2.2.1",
+ "version": "2.2.2-beta3",
"description": "EVM solidity smart contracts for Blockchain OnchainID identities.",
+ "license": "ISC",
+ "author": "OnchainID Organization",
+ "type": "module",
"files": [
- "artifacts",
"contracts",
- "index.js",
- "index.d.ts",
- "typechain-types"
+ "out"
],
- "scripts": {
- "build": "npx hardhat compile",
- "coverage": "npx hardhat coverage",
- "lint": "npx hardhat check",
- "test": "hardhat test"
- },
"repository": {
"type": "git",
"url": "git+https://github.com/onchain-id/solidity.git"
@@ -28,18 +22,29 @@
"solidity",
"smart contracts"
],
- "author": "OnchainID Organization",
- "license": "ISC",
"bugs": {
"url": "https://github.com/onchain-id/solidity/issues"
},
"homepage": "https://github.com/onchain-id/solidity#readme",
+ "scripts": {
+ "prepare": "husky && forge soldeer install",
+ "build": "forge build",
+ "test": "forge test",
+ "lint": "forge fmt --check",
+ "lint:fix": "forge fmt",
+ "coverage": "forge coverage --no-match-coverage \"(test|script|dependencies|node_modules|FormatResolver)\"",
+ "coverage:report": "mkdir -p coverage && forge coverage --no-match-coverage \"(test|script|dependencies|node_modules|FormatResolver)\" --report lcov --report-file coverage/lcov.info && genhtml coverage/lcov.info -o coverage/report --branch-coverage && open coverage/report/index.html",
+ "docs": "forge doc --serve --open",
+ "clean": "forge clean"
+ },
"devDependencies": {
- "@nomicfoundation/hardhat-toolbox": "^2.0.1",
- "@nomiclabs/hardhat-solhint": "^3.0.0",
- "@openzeppelin/contracts": "^4.8.3",
- "hardhat": "^2.12.6",
- "solhint-plugin-prettier": "^0.0.5",
- "solidity-coverage": "^0.8.2"
+ "@ballcat/commitlint-config-gitmoji": "^1.1.0",
+ "@commitlint/cli": "^19.8.1",
+ "husky": "^9.1.7"
+ },
+ "commitlint": {
+ "extends": [
+ "@ballcat/commitlint-config-gitmoji"
+ ]
}
}
diff --git a/remappings.txt b/remappings.txt
new file mode 100644
index 00000000..c81387db
--- /dev/null
+++ b/remappings.txt
@@ -0,0 +1,5 @@
+@forge-std/=dependencies/forge-std-v1.14.0/src/
+@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-4.9.6/
+@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-5.2.0/
+forge-std/=dependencies/forge-std-v1.14.0/src/
+solady/=dependencies/solady-0.1.15/
diff --git a/scripts/deploy-claim-issuer.ts b/scripts/deploy-claim-issuer.ts
deleted file mode 100644
index 0d169407..00000000
--- a/scripts/deploy-claim-issuer.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import {ethers} from "hardhat";
-
-async function main() {
- const [claimIssuerOwner] = await ethers.getSigners();
-
- const claimIssuer = await ethers.deployContract("ClaimIssuer", [claimIssuerOwner.address]);
-
- console.log(`Deploying Claim Issuer at ${claimIssuer.address} ...`);
-
- await claimIssuer.deployed();
-
- console.log(`Deployed Claim Issuer ${claimIssuer.address} !`);
-}
-
-main().catch((error) => {
- console.error(error);
- process.exitCode = 1;
-});
diff --git a/scripts/deploy-factory.ts b/scripts/deploy-factory.ts
deleted file mode 100644
index dae8e158..00000000
--- a/scripts/deploy-factory.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import {ethers} from "hardhat";
-
-async function main() {
- const [deployer] = await ethers.getSigners();
-
- const identityImplementation = await ethers.deployContract("Identity", [deployer.address, true]);
- console.log(`Deploying identity implementation at ${identityImplementation.address} ... (tx hash: ${identityImplementation.deployTransaction.hash} )`);
- await identityImplementation.deployed();
- console.log(`Deployed identity implementation at ${identityImplementation.address} (tx hash: ${identityImplementation.deployTransaction.hash} )`);
-
- const implementationAuthority = await ethers.deployContract("ImplementationAuthority", [identityImplementation.address]);
- console.log(`Deploying implementation authority at ${implementationAuthority.address} ... (tx hash: ${implementationAuthority.deployTransaction.hash} )`);
- await implementationAuthority.deployed();
- console.log(`Deployed implementation authority at ${implementationAuthority.address} (tx hash: ${implementationAuthority.deployTransaction.hash} )`);
-
- const factory = await ethers.deployContract("IdFactory", [implementationAuthority.address]);
- console.log(`Deploying factory at ${factory.address} ... (tx hash: ${factory.deployTransaction.hash} )`);
- await factory.deployed();
- console.log(`Deployed factory at ${factory.address} (tx hash: ${factory.deployTransaction.hash} )`);
-}
-
-main().catch((error) => {
- console.error(error);
- process.exitCode = 1;
-});
diff --git a/scripts/deploy-identity.ts b/scripts/deploy-identity.ts
deleted file mode 100644
index 7025bb0d..00000000
--- a/scripts/deploy-identity.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import {ethers} from "hardhat";
-
-async function main() {
- const [identityOwner] = await ethers.getSigners();
-
- const Identity = await ethers.getContractFactory("Identity");
- const identity = await Identity.connect(identityOwner).deploy(identityOwner.address, false);
-
- console.log(`Deploying identity for ${identityOwner.address} at ${identity.address} ...`);
-
- await identity.deployed();
-
- console.log(`Deployed identity for ${identityOwner.address} at ${identity.address} !`);
-}
-
-main().catch((error) => {
- console.error(error);
- process.exitCode = 1;
-});
diff --git a/soldeer.lock b/soldeer.lock
new file mode 100644
index 00000000..db0b7194
--- /dev/null
+++ b/soldeer.lock
@@ -0,0 +1,26 @@
+[[dependencies]]
+name = "@openzeppelin-contracts"
+version = "5.2.0"
+url = "https://soldeer-revisions.s3.amazonaws.com/@openzeppelin-contracts/5_2_0_11-01-2025_09:30:20_contracts.zip"
+checksum = "6dbd0440446b2ed16ca25e9f1af08fc0c5c1e73e71fee86ae8a00daa774e3817"
+integrity = "4cb7f3777f67fdf4b7d0e2f94d2f93f198b2e5dce718b7062ac7c2c83e1183bd"
+
+[[dependencies]]
+name = "@openzeppelin-contracts-upgradeable"
+version = "4.9.6"
+url = "https://soldeer-revisions.s3.amazonaws.com/@openzeppelin-contracts-upgradeable/4_9_6_14-03-2024_06:12:03_contracts-upgradeable.zip"
+checksum = "dddc8efa3da3dcd0dbda63efdc34d6006ece3ae5a8f46b0cf914870df45b9c71"
+integrity = "e67f536c763f35149aac483acfa21637c6b6b6c3f8a71860f8e717cf110138cd"
+
+[[dependencies]]
+name = "forge-std"
+version = "v1.14.0"
+git = "https://github.com/foundry-rs/forge-std.git"
+rev = "1801b0541f4fda118a10798fd3486bb7051c5dd6"
+
+[[dependencies]]
+name = "solady"
+version = "0.1.15"
+url = "https://soldeer-revisions.s3.amazonaws.com/solady/0_1_15_22-04-2025_09:51:54_solady.zip"
+checksum = "beb9d62c10e0539f57e3f4bff3ceab6e139d4811e1cff0f1589b19baa91a3c11"
+integrity = "79a37db5b6982436ccb66c3838a5d8197670820b12f35b7596fcdd08f56add80"
diff --git a/tasks/add-claim.task.ts b/tasks/add-claim.task.ts
deleted file mode 100644
index 2fcb2552..00000000
--- a/tasks/add-claim.task.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("add-claim", "Add a claim to an identity")
- .addParam("identity", "The address of the identity")
- .addParam("from", "A CLAIM key on the claim issuer")
- .addParam("claim", "The content of a claim as a JSON string")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const identity = await hre.ethers.getContractAt('Identity', args.identity, signer);
-
- const claim = JSON.parse(args.claim);
-
- console.log(claim);
-
- const tx = await identity.addClaim(
- claim.topic,
- claim.scheme,
- claim.issuer,
- claim.signature,
- claim.data,
- claim.uri,
- );
-
- console.log(`Add claim of topic ${claim.topic} on identity ${args.identity} tx: ${tx.hash}`);
-
- await tx.wait();
-
- console.log(`Add claim of topic ${claim.topic} on identity ${args.identity} tx mined: ${tx.hash}`);
- });
diff --git a/tasks/add-key.task.ts b/tasks/add-key.task.ts
deleted file mode 100644
index 1deab1df..00000000
--- a/tasks/add-key.task.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("add-key", "Add a purpose to a key on an identity")
- .addParam("from", "A MANAGEMENT key on the claim issuer")
- .addParam("identity", "The address of the identity")
- .addParam("key", "The key (ethereum address)")
- .addParam("type", "The type of the key (ECDSA = 1)")
- .addParam("purpose", "The purpose to add (MANAGEMENT = 1, ACTION = 2, CLAIM = 3)")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const identity = await hre.ethers.getContractAt('Identity', args.identity, signer);
-
- const keyHash = hre.ethers.utils.keccak256(
- hre.ethers.utils.defaultAbiCoder.encode(['address'], [args.key]),
- );
-
- const tx = await identity.addKey(
- keyHash,
- args.purpose,
- args.type,
- );
-
- console.log(`Add purpose ${args.purpose} to key ${args.key} (hash: ${keyHash}) on identity ${args.identity} tx: ${tx.hash}`);
-
- await tx.wait();
-
- console.log(`Add purpose ${args.purpose} to key ${args.key} (hash: ${keyHash}) on identity ${args.identity} tx mined: ${tx.hash}`);
- });
diff --git a/tasks/deploy-identity.task.ts b/tasks/deploy-identity.task.ts
deleted file mode 100644
index 7583097a..00000000
--- a/tasks/deploy-identity.task.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("deploy-identity", "Deploy an identity as a standalone contract")
- .addParam("from", "Will pay the gas for the transaction")
- .addParam("key", "The ethereum address that will own the identity (as a MANAGEMENT key)")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const identity = await hre.ethers.deployContract('Identity', [args.key, false], signer);
-
- console.log(`Deploy a new identity at ${identity.address} . tx: ${identity.deployTransaction.hash}`);
-
- await identity.deployed();
-
- console.log(`Deployed a new identity at ${identity.address} . tx: ${identity.deployTransaction.hash}`);
- });
diff --git a/tasks/deploy-proxy.task.ts b/tasks/deploy-proxy.task.ts
deleted file mode 100644
index 293dcd34..00000000
--- a/tasks/deploy-proxy.task.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("deploy-proxy", "Deploy an identity as a proxy using a factory")
- .addParam("from", "Will pay the gas for the transaction")
- .addParam("factory", "The address of the identity factory")
- .addParam("key", "The ethereum address that will own the identity (as a MANAGEMENT key)")
- .addOptionalParam("salt", "A salt to use when creating the identity")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const factory = await hre.ethers.getContractAt('IdFactory', args.factory, signer);
- const tx = await factory.createIdentity(args.key, args.salt ?? args.key);
-
- console.log(`Deploy a new identity as a proxy using factory ${factory.address} . tx: ${tx.hash}`);
-
- await tx.wait();
-
- const identityAddress = await factory.getIdentity(args.key);
-
- console.log(`Deployed a new identity at ${identityAddress} as a proxy using factory ${factory.address} . tx: ${tx.hash}`);
- });
diff --git a/tasks/remove-claim.task.ts b/tasks/remove-claim.task.ts
deleted file mode 100644
index 1419efae..00000000
--- a/tasks/remove-claim.task.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("remove-claim", "Remove a cliam from an identity")
- .addParam("identity", "The address of the identity")
- .addParam("from", "A CLAIM key on the claim issuer")
- .addParam("claim", "The claim ID")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const identity = await hre.ethers.getContractAt('Identity', args.identity, signer);
-
- const tx = await identity.removeClaim(args.claim);
-
- console.log(`Remove claim ${args.claim} from identity ${args.identity} tx: ${tx.hash}`);
-
- await tx.wait();
-
- console.log(`Remove claim ${args.claim} from identity ${args.identity} tx mined: ${tx.hash}`);
- });
diff --git a/tasks/remove-key.task.ts b/tasks/remove-key.task.ts
deleted file mode 100644
index 2fe77955..00000000
--- a/tasks/remove-key.task.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("remove-key", "Remove a purpose from a key on an identity")
- .addParam("from", "A MANAGEMENT key on the claim issuer")
- .addParam("identity", "The address of the identity")
- .addParam("key", "The key (ethereum address)")
- .addParam("type", "The type of the key (ECDSA = 1)")
- .addParam("purpose", "The purpose to remove (MANAGEMENT = 1, ACTION = 2, CLAIM = 3)")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const identity = await hre.ethers.getContractAt('Identity', args.identity, signer);
-
- const keyHash = hre.ethers.utils.keccak256(
- hre.ethers.utils.defaultAbiCoder.encode(['address'], [args.key]),
- );
-
- const tx = await identity.removeKey(
- keyHash,
- args.purpose,
- );
-
- console.log(`Remove purpose ${args.purpose} from key ${args.key} (hash: ${keyHash}) on identity ${args.identity} tx: ${tx.hash}`);
-
- await tx.wait();
-
- console.log(`Remove purpose ${args.purpose} from key ${args.key} (hash: ${keyHash}) on identity ${args.identity} tx mined: ${tx.hash}`);
- });
diff --git a/tasks/revoke.task.ts b/tasks/revoke.task.ts
deleted file mode 100644
index 00668356..00000000
--- a/tasks/revoke.task.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import {task} from "hardhat/config";
-import {TaskArguments} from "hardhat/types";
-
-task("revoke", "Revoke a claim issued by a claim issuer")
- .addParam("from", "A MANAGEMENT key on the claim issuer")
- .addParam("issuer", "The address of the claim issuer")
- .addParam("signature", "The signature of the claim to revoke")
- .setAction(async (args: TaskArguments, hre) => {
- const signer = await hre.ethers.getSigner(args.from);
-
- const claimIssuer = await hre.ethers.getContractAt('ClaimIssuer', args.issuer, signer);
-
- const tx = await claimIssuer.revokeClaimBySignature(args.signature);
-
- console.log(`Revoke claim with signature ${args.signature} tx: ${tx.hash}`);
-
- await tx.wait();
-
- console.log(`Revoke claim with signature ${args.signature} tx mined: ${tx.hash}`);
- });
diff --git a/test/Proxy.t.sol b/test/Proxy.t.sol
new file mode 100644
index 00000000..ecc077f6
--- /dev/null
+++ b/test/Proxy.t.sol
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ERC1967Utils } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol";
+import { UpgradeableBeacon } from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
+import { Errors as OZErrors } from "@openzeppelin/contracts/utils/Errors.sol";
+
+import { Identity } from "contracts/Identity.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+import { IdentityProxy } from "contracts/proxy/IdentityProxy.sol";
+import { ImplementationAuthority } from "contracts/proxy/ImplementationAuthority.sol";
+
+import { OnchainIDSetup } from "./helpers/OnchainIDSetup.sol";
+import { Test as TestContract } from "./mocks/Test.sol";
+
+contract ProxyTest is OnchainIDSetup {
+
+ function test_revertBecauseImplementationIsZeroAddress() public {
+ vm.expectRevert(abi.encode(ERC1967Utils.ERC1967InvalidBeacon.selector, address(0)));
+ new IdentityProxy(address(0), alice, IdentityTypes.INDIVIDUAL);
+ }
+
+ function test_revertBecauseImplementationIsNotIdentity() public {
+ TestContract testContract = new TestContract();
+ ImplementationAuthority authority = new ImplementationAuthority(address(testContract));
+
+ vm.expectRevert(OZErrors.FailedCall.selector);
+ new IdentityProxy(address(authority), alice, IdentityTypes.INDIVIDUAL);
+ }
+
+ function test_revertBecauseInitialKeyIsZeroAddress() public {
+ Identity impl = new Identity(deployer, true);
+ ImplementationAuthority authority = new ImplementationAuthority(address(impl));
+
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ new IdentityProxy(address(authority), address(0), IdentityTypes.INDIVIDUAL);
+ }
+
+ function test_preventCreatingAuthorityWithZeroAddress() public {
+ vm.expectRevert(abi.encode(UpgradeableBeacon.BeaconInvalidImplementation.selector, address(0)));
+ new ImplementationAuthority(address(0));
+ }
+
+ function test_preventUpdatingToZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(abi.encode(UpgradeableBeacon.BeaconInvalidImplementation.selector, address(0)));
+ onchainidSetup.implementationAuthority.upgradeTo(address(0));
+ }
+
+ function test_preventUpdatingWhenNotOwner() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ onchainidSetup.implementationAuthority.upgradeTo(address(0));
+ }
+
+ function test_implementationAuthority_shouldReturnCorrectAddress() public {
+ Identity impl = new Identity(deployer, false);
+ ImplementationAuthority authority = new ImplementationAuthority(address(impl));
+ IdentityProxy proxy = new IdentityProxy(address(authority), deployer, IdentityTypes.INDIVIDUAL);
+
+ // ERC-1967 beacon slot: bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)
+ bytes32 beaconSlot = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
+ address storedBeacon = address(uint160(uint256(vm.load(address(proxy), beaconSlot))));
+ assertEq(storedBeacon, address(authority), "Should store the correct authority address as beacon");
+ }
+
+ function test_updateImplementationAddress() public {
+ // Deploy identity with its own proxy and authority
+ Identity impl = new Identity(deployer, false);
+ ImplementationAuthority authority = new ImplementationAuthority(address(impl));
+ new IdentityProxy(address(authority), deployer, IdentityTypes.INDIVIDUAL);
+
+ // Deploy new implementation
+ Identity newImpl = new Identity(deployer, false);
+
+ // Update implementation and verify event
+ vm.expectEmit(true, true, true, true);
+ emit UpgradeableBeacon.Upgraded(address(newImpl));
+ authority.upgradeTo(address(newImpl));
+ }
+
+}
diff --git a/test/claim-issuers/ClaimIssuer.t.sol b/test/claim-issuers/ClaimIssuer.t.sol
new file mode 100644
index 00000000..aabb60e4
--- /dev/null
+++ b/test/claim-issuers/ClaimIssuer.t.sol
@@ -0,0 +1,189 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { ClaimIssuer } from "contracts/ClaimIssuer.sol";
+import { IClaimIssuer } from "contracts/interface/IClaimIssuer.sol";
+import { IIdentity } from "contracts/interface/IIdentity.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+import { ClaimIssuerProxy } from "contracts/proxy/ClaimIssuerProxy.sol";
+
+contract ClaimIssuerTest is OnchainIDSetup {
+
+ // ---- revokeClaim ----
+
+ function test_revokeClaim_revertNonManagementKey() public {
+ vm.prank(alice);
+ vm.expectRevert(Errors.SenderDoesNotHaveManagementKey.selector);
+ claimIssuer.revokeClaim(aliceClaim666.id, aliceClaim666.identity);
+ }
+
+ function test_revokeClaim_revertAlreadyRevoked() public {
+ vm.prank(claimIssuerOwner);
+ claimIssuer.revokeClaim(aliceClaim666.id, aliceClaim666.identity);
+
+ vm.prank(claimIssuerOwner);
+ vm.expectRevert(Errors.ClaimAlreadyRevoked.selector);
+ claimIssuer.revokeClaim(aliceClaim666.id, aliceClaim666.identity);
+ }
+
+ function test_revokeClaim_shouldRevoke() public {
+ assertTrue(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data
+ )
+ );
+
+ vm.prank(claimIssuerOwner);
+ vm.expectEmit(true, false, false, false, address(claimIssuer));
+ emit IClaimIssuer.ClaimRevoked(aliceClaim666.signature);
+ claimIssuer.revokeClaim(aliceClaim666.id, aliceClaim666.identity);
+
+ assertTrue(claimIssuer.isClaimRevoked(aliceClaim666.signature));
+ assertFalse(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data
+ )
+ );
+ }
+
+ // ---- revokeClaimBySignature ----
+
+ function test_revokeClaimBySignature_revertNonManagementKey() public {
+ vm.prank(alice);
+ vm.expectRevert(Errors.SenderDoesNotHaveManagementKey.selector);
+ claimIssuer.revokeClaimBySignature(aliceClaim666.signature);
+ }
+
+ function test_revokeClaimBySignature_revertAlreadyRevoked() public {
+ vm.prank(claimIssuerOwner);
+ claimIssuer.revokeClaimBySignature(aliceClaim666.signature);
+
+ vm.prank(claimIssuerOwner);
+ vm.expectRevert(Errors.ClaimAlreadyRevoked.selector);
+ claimIssuer.revokeClaimBySignature(aliceClaim666.signature);
+ }
+
+ function test_revokeClaimBySignature_shouldRevoke() public {
+ assertTrue(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data
+ )
+ );
+
+ vm.prank(claimIssuerOwner);
+ vm.expectEmit(true, false, false, false, address(claimIssuer));
+ emit IClaimIssuer.ClaimRevoked(aliceClaim666.signature);
+ claimIssuer.revokeClaimBySignature(aliceClaim666.signature);
+
+ assertTrue(claimIssuer.isClaimRevoked(aliceClaim666.signature));
+ assertFalse(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data
+ )
+ );
+ }
+
+ // ---- signature validation ----
+
+ function test_signatureValidation_invalidLength() public view {
+ // Create 66-byte signature (one byte too long)
+ bytes memory invalidSig = abi.encodePacked(aliceClaim666.signature, hex"00");
+
+ assertFalse(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, invalidSig, aliceClaim666.data
+ )
+ );
+ }
+
+ function test_signatureValidation_malformed() public view {
+ bytes memory invalidSig = hex"1234567890abcdef";
+
+ assertFalse(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, invalidSig, aliceClaim666.data
+ )
+ );
+ }
+
+ function test_signatureValidation_wrongSigner() public view {
+ bytes memory invalidSig = new bytes(65);
+
+ assertFalse(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, invalidSig, aliceClaim666.data
+ )
+ );
+ }
+
+ function test_signatureValidation_validSignature() public view {
+ assertTrue(
+ claimIssuer.isClaimValid(
+ IIdentity(address(aliceIdentity)), aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data
+ )
+ );
+ }
+
+ /// @notice CLAIM_ADDER key should NOT validate claim signatures (only CLAIM_SIGNER can)
+ function test_isClaimValid_claimAdderKey_shouldReturnFalse() public {
+ // Create a signer that will be added as CLAIM_ADDER (not CLAIM_SIGNER)
+ (address claimAdderAddr, uint256 claimAdderPk) = makeAddrAndKey("claimAdderSigner");
+
+ // Add claimAdderAddr as CLAIM_ADDER on the claimIssuer (not CLAIM_SIGNER)
+ vm.prank(claimIssuerOwner);
+ claimIssuer.addKey(ClaimSignerHelper.addressToKey(claimAdderAddr), KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+
+ // Sign a claim with the CLAIM_ADDER key
+ uint256 topic = 999;
+ bytes memory data = hex"0099";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimAdderPk, address(aliceIdentity), topic, data);
+
+ // isClaimValid should return false because CLAIM_ADDER cannot sign claims
+ assertFalse(
+ claimIssuer.isClaimValid(IIdentity(address(aliceIdentity)), topic, signature, data),
+ "CLAIM_ADDER key should not validate claim signatures"
+ );
+ }
+
+ // ---- upgrade ----
+
+ function test_upgrade_revertIfNotOwner() public {
+ address freshDeployer = makeAddr("freshClaimDeployer");
+ address nonOwner = makeAddr("nonOwner");
+
+ ClaimIssuer impl = new ClaimIssuer(freshDeployer);
+ ClaimIssuerProxy proxyContract = new ClaimIssuerProxy(
+ address(impl), abi.encodeCall(ClaimIssuer.initialize, (freshDeployer, IdentityTypes.CLAIM_ISSUER))
+ );
+ ClaimIssuer proxy = ClaimIssuer(address(proxyContract));
+
+ ClaimIssuer newImpl = new ClaimIssuer(nonOwner);
+
+ vm.prank(nonOwner);
+ vm.expectRevert(Errors.SenderDoesNotHaveManagementKey.selector);
+ proxy.upgradeTo(address(newImpl));
+ }
+
+ function test_upgrade_shouldUpgrade() public {
+ address freshDeployer = makeAddr("freshClaimDeployer2");
+
+ ClaimIssuer impl = new ClaimIssuer(freshDeployer);
+ ClaimIssuerProxy proxyContract = new ClaimIssuerProxy(
+ address(impl), abi.encodeCall(ClaimIssuer.initialize, (freshDeployer, IdentityTypes.CLAIM_ISSUER))
+ );
+ ClaimIssuer proxy = ClaimIssuer(address(proxyContract));
+
+ ClaimIssuer newImpl = new ClaimIssuer(freshDeployer);
+
+ vm.prank(freshDeployer);
+ proxy.upgradeTo(address(newImpl));
+
+ assertTrue(proxy.keyHasPurpose(ClaimSignerHelper.addressToKey(freshDeployer), KeyPurposes.MANAGEMENT));
+ }
+
+}
diff --git a/test/claim-issuers/ClaimTo.t.sol b/test/claim-issuers/ClaimTo.t.sol
new file mode 100644
index 00000000..b600e8ac
--- /dev/null
+++ b/test/claim-issuers/ClaimTo.t.sol
@@ -0,0 +1,191 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { IIdentity } from "contracts/interface/IIdentity.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+import { Test as TestContract } from "test/mocks/Test.sol";
+
+/// @notice Test suite for ClaimIssuer.addClaimTo functionality
+contract ClaimToTest is OnchainIDSetup {
+
+ /// @notice When claimIssuer has MANAGEMENT key on aliceIdentity, addClaimTo auto-approves
+ function test_addClaimTo_withManagementKey() public {
+ // Add claimIssuer as MANAGEMENT key on aliceIdentity
+ bytes32 claimIssuerKey = ClaimSignerHelper.addressToKey(address(claimIssuer));
+ vm.prank(alice);
+ aliceIdentity.addKey(claimIssuerKey, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+
+ // Build claim
+ uint256 topic = 999;
+ bytes memory data = hex"0099";
+ string memory uri = "https://example.com/new-claim";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ // Call addClaimTo (last param is IIdentity, not address)
+ vm.prank(claimIssuerOwner);
+ claimIssuer.addClaimTo(topic, 1, signature, data, uri, IIdentity(address(aliceIdentity)));
+
+ // Verify claim was added
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+ (
+ uint256 retTopic,
+ uint256 retScheme,
+ address retIssuer,
+ bytes memory retSig,
+ bytes memory retData,
+ string memory retUri
+ ) = aliceIdentity.getClaim(claimId);
+
+ assertEq(retTopic, topic);
+ assertEq(retScheme, 1);
+ assertEq(retIssuer, address(claimIssuer));
+ assertEq(retSig, signature);
+ assertEq(retData, data);
+ assertEq(retUri, uri);
+ }
+
+ /// @notice Non-management key caller should revert with SenderDoesNotHaveManagementKey
+ function test_addClaimTo_revertWithoutManagementKey() public {
+ vm.prank(bob);
+ vm.expectRevert(Errors.SenderDoesNotHaveManagementKey.selector);
+ claimIssuer.addClaimTo(
+ aliceClaim666.topic,
+ aliceClaim666.scheme,
+ aliceClaim666.signature,
+ aliceClaim666.data,
+ aliceClaim666.uri,
+ IIdentity(aliceClaim666.identity)
+ );
+ }
+
+ /// @notice Invalid signature should revert with InvalidClaim
+ function test_addClaimTo_revertInvalidSignature() public {
+ bytes memory invalidSig = hex"1234567890abcdef";
+
+ vm.prank(claimIssuerOwner);
+ vm.expectRevert(Errors.InvalidClaim.selector);
+ claimIssuer.addClaimTo(
+ 999, 1, invalidSig, hex"0099", "https://example.com/invalid-claim", IIdentity(address(aliceIdentity))
+ );
+ }
+
+ /// @notice Zero address identity should revert with InvalidClaim
+ function test_addClaimTo_revertZeroAddressIdentity() public {
+ vm.prank(claimIssuerOwner);
+ vm.expectRevert(Errors.InvalidClaim.selector);
+ claimIssuer.addClaimTo(999, 1, hex"0099", hex"0099", "https://example.com/new-claim", IIdentity(address(0)));
+ }
+
+ /// @notice Without key on aliceIdentity, addClaimTo creates pending execution requiring approval
+ function test_addClaimTo_requiresApproval() public {
+ // ClaimIssuer does NOT have any key on aliceIdentity
+ // So the execution requires manual approval from alice
+ uint256 topic = 999;
+ bytes memory data = hex"0099";
+ string memory uri = "https://example.com/new-claim";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ vm.prank(claimIssuerOwner);
+ claimIssuer.addClaimTo(topic, 1, signature, data, uri, IIdentity(address(aliceIdentity)));
+
+ // Verify claim is NOT yet added (execution is pending)
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+ (uint256 retTopic,,,,,) = aliceIdentity.getClaim(claimId);
+ assertEq(retTopic, 0);
+
+ // Nonce was 0 before addClaimTo, so executionId = 0
+ // Alice approves the pending execution
+ vm.prank(alice);
+ aliceIdentity.approve(0, true);
+
+ // Verify claim is now added
+ (retTopic,,,,,) = aliceIdentity.getClaim(claimId);
+ assertEq(retTopic, topic);
+ }
+
+ /// @notice Pending execution then owner approves -- full verification of claim fields
+ function test_addClaimTo_pendingThenOwnerApproves() public {
+ uint256 topic = 999;
+ bytes memory data = hex"0099";
+ string memory uri = "https://example.com/new-claim";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ vm.prank(claimIssuerOwner);
+ claimIssuer.addClaimTo(topic, 1, signature, data, uri, IIdentity(address(aliceIdentity)));
+
+ // Verify claim NOT added yet
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+ (uint256 retTopic,,,,,) = aliceIdentity.getClaim(claimId);
+ assertEq(retTopic, 0);
+
+ // Approve execution ID 0
+ vm.prank(alice);
+ aliceIdentity.approve(0, true);
+
+ // Verify all claim fields after approval
+ (uint256 t, uint256 s, address iss, bytes memory sig, bytes memory d, string memory u) =
+ aliceIdentity.getClaim(claimId);
+
+ assertEq(t, topic);
+ assertEq(s, 1);
+ assertEq(iss, address(claimIssuer));
+ assertEq(sig, signature);
+ assertEq(d, data);
+ assertEq(u, uri);
+ }
+
+ /// @notice With MANAGEMENT key on aliceIdentity, addClaimTo auto-approves immediately
+ function test_addClaimTo_autoApproveWithManagementKey() public {
+ // Add claimIssuer as MANAGEMENT key on aliceIdentity
+ bytes32 claimIssuerKey = ClaimSignerHelper.addressToKey(address(claimIssuer));
+ vm.prank(alice);
+ aliceIdentity.addKey(claimIssuerKey, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+
+ // Build and add claim
+ uint256 topic = 999;
+ bytes memory data = hex"0099";
+ string memory uri = "https://example.com/new-claim";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ vm.prank(claimIssuerOwner);
+ claimIssuer.addClaimTo(topic, 1, signature, data, uri, IIdentity(address(aliceIdentity)));
+
+ // Verify claim was auto-approved and added immediately
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+ (
+ uint256 retTopic,
+ uint256 retScheme,
+ address retIssuer,
+ bytes memory retSig,
+ bytes memory retData,
+ string memory retUri
+ ) = aliceIdentity.getClaim(claimId);
+
+ assertEq(retTopic, topic);
+ assertEq(retScheme, 1);
+ assertEq(retIssuer, address(claimIssuer));
+ assertEq(retSig, signature);
+ assertEq(retData, data);
+ assertEq(retUri, uri);
+ }
+
+ /// @notice addClaimTo to an invalid contract (no execute function) should revert with CallFailed
+ function test_addClaimTo_revertInvalidIdentityContract() public {
+ TestContract invalidIdentity = new TestContract();
+
+ uint256 topic = 999;
+ bytes memory data = hex"0099";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(invalidIdentity), topic, data);
+
+ vm.prank(claimIssuerOwner);
+ vm.expectRevert(Errors.CallFailed.selector);
+ claimIssuer.addClaimTo(
+ topic, 1, signature, data, "https://example.com/invalid-claim", IIdentity(address(invalidIdentity))
+ );
+ }
+
+}
diff --git a/test/claim-issuers/claim-issuer.test.ts b/test/claim-issuers/claim-issuer.test.ts
deleted file mode 100644
index 92a7fd25..00000000
--- a/test/claim-issuers/claim-issuer.test.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
-import { expect } from "chai";
-import {ethers} from "hardhat";
-import {deployIdentityFixture} from "../fixtures";
-
-describe('ClaimIssuer - Reference (with revoke)', () => {
- describe('revokeClaim (deprecated)', () => {
- describe('when calling as a non MANAGEMENT key', () => {
- it('should revert for missing permissions', async () => {
- const { claimIssuer, aliceWallet, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- await expect(claimIssuer.connect(aliceWallet).revokeClaim(aliceClaim666.id, aliceClaim666.identity)).to.be.revertedWith('Permissions: Sender does not have management key');
- });
- });
-
- describe("when calling as a MANAGEMENT key", () => {
- describe('when claim was already revoked', () => {
- it('should revert for conflict', async () => {
- const { claimIssuer, claimIssuerWallet, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- await claimIssuer.connect(claimIssuerWallet).revokeClaim(aliceClaim666.id, aliceClaim666.identity);
-
- await expect(claimIssuer.connect(claimIssuerWallet).revokeClaim(aliceClaim666.id, aliceClaim666.identity)).to.be.revertedWith('Conflict: Claim already revoked');
- });
- });
-
- describe('when is not revoked already', () => {
- it('should revoke the claim', async () => {
- const { claimIssuer, claimIssuerWallet, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- expect(await claimIssuer.isClaimValid(aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data)).to.be.true;
-
- const tx = await claimIssuer.connect(claimIssuerWallet).revokeClaim(aliceClaim666.id, aliceClaim666.identity);
-
- await expect(tx).to.emit(claimIssuer, 'ClaimRevoked').withArgs(aliceClaim666.signature);
-
- expect(await claimIssuer.isClaimRevoked(aliceClaim666.signature)).to.be.true;
- expect(await claimIssuer.isClaimValid(aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data)).to.be.false;
- });
- });
- });
- });
-
- describe('revokeClaimBySignature', () => {
- describe('when calling as a non MANAGEMENT key', () => {
- it('should revert for missing permissions', async () => {
- const { claimIssuer, aliceWallet, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- await expect(claimIssuer.connect(aliceWallet).revokeClaimBySignature(aliceClaim666.signature)).to.be.revertedWith('Permissions: Sender does not have management key');
- });
- });
-
- describe("when calling as a MANAGEMENT key", () => {
- describe('when claim was already revoked', () => {
- it('should revert for conflict', async () => {
- const { claimIssuer, claimIssuerWallet, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- await claimIssuer.connect(claimIssuerWallet).revokeClaimBySignature(aliceClaim666.signature);
-
- await expect(claimIssuer.connect(claimIssuerWallet).revokeClaimBySignature(aliceClaim666.signature)).to.be.revertedWith('Conflict: Claim already revoked');
- });
- });
-
- describe('when is not revoked already', () => {
- it('should revoke the claim', async () => {
- const { claimIssuer, claimIssuerWallet, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- expect(await claimIssuer.isClaimValid(aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data)).to.be.true;
-
- const tx = await claimIssuer.connect(claimIssuerWallet).revokeClaimBySignature(aliceClaim666.signature);
-
- await expect(tx).to.emit(claimIssuer, 'ClaimRevoked').withArgs(aliceClaim666.signature);
-
- expect(await claimIssuer.isClaimRevoked(aliceClaim666.signature)).to.be.true;
- expect(await claimIssuer.isClaimValid(aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.signature, aliceClaim666.data)).to.be.false;
- });
- });
- });
- });
-
- describe('getRecoveredAddress', () => {
- it('should return with a zero address with signature is not of proper length', async () => {
- const { claimIssuer, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- expect(await claimIssuer.getRecoveredAddress(aliceClaim666.signature + "00", ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))))).to.be.equal(ethers.constants.AddressZero);
- });
- });
-});
diff --git a/test/factory/ClaimIssuerFactory.t.sol b/test/factory/ClaimIssuerFactory.t.sol
new file mode 100644
index 00000000..3cd2fd92
--- /dev/null
+++ b/test/factory/ClaimIssuerFactory.t.sol
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimIssuer } from "contracts/ClaimIssuer.sol";
+import { ClaimIssuerFactory } from "contracts/factory/ClaimIssuerFactory.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { Test } from "forge-std/Test.sol";
+
+contract ClaimIssuerFactoryTest is Test {
+
+ ClaimIssuerFactory internal factory;
+ ClaimIssuer internal claimIssuerImpl;
+
+ address internal deployer;
+ address internal alice;
+
+ function setUp() public {
+ deployer = makeAddr("cifDeployer");
+ alice = makeAddr("cifAlice");
+
+ vm.startPrank(deployer);
+ claimIssuerImpl = new ClaimIssuer(deployer);
+ factory = new ClaimIssuerFactory(address(claimIssuerImpl));
+ vm.stopPrank();
+ }
+
+ function test_shouldDeployClaimIssuer() public {
+ vm.prank(deployer);
+ factory.deployClaimIssuer();
+
+ address deployed = factory.claimIssuer(deployer);
+ assertTrue(deployed != address(0));
+ }
+
+ function test_revertAlreadyDeployed() public {
+ vm.prank(deployer);
+ factory.deployClaimIssuer();
+
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.ClaimIssuerAlreadyDeployed.selector, deployer));
+ factory.deployClaimIssuer();
+ }
+
+ function test_revertDeployOnBehalfZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ factory.deployClaimIssuerOnBehalf(address(0));
+ }
+
+ function test_revertBlacklistNotOwner() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ factory.blacklistAddress(deployer, true);
+ }
+
+ function test_revertBlacklistZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ factory.blacklistAddress(address(0), true);
+ }
+
+ function test_shouldBlacklistAddress() public {
+ vm.prank(deployer);
+ factory.blacklistAddress(alice, true);
+
+ assertTrue(factory.isBlacklisted(alice));
+ }
+
+ function test_shouldUnblacklistAddress() public {
+ vm.startPrank(deployer);
+ factory.blacklistAddress(alice, true);
+ factory.blacklistAddress(alice, false);
+ vm.stopPrank();
+
+ assertFalse(factory.isBlacklisted(alice));
+ }
+
+ function test_revertDeployFromBlacklisted() public {
+ vm.prank(deployer);
+ factory.blacklistAddress(alice, true);
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.Blacklisted.selector, alice));
+ factory.deployClaimIssuer();
+ }
+
+ function test_revertDeployOnBehalfNotOwner() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ factory.deployClaimIssuerOnBehalf(alice);
+ }
+
+ function test_revertUpdateImplementationNotOwner() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ factory.updateImplementation(alice);
+ }
+
+ function test_revertUpdateImplementationZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ factory.updateImplementation(address(0));
+ }
+
+ function test_shouldDeployClaimIssuerOnBehalf() public {
+ vm.prank(deployer);
+ address deployed = factory.deployClaimIssuerOnBehalf(alice);
+
+ assertTrue(deployed != address(0), "Should deploy ClaimIssuer");
+ assertEq(factory.claimIssuer(alice), deployed, "Should map alice to deployed ClaimIssuer");
+ }
+
+ function test_shouldUpdateImplementation() public {
+ vm.prank(deployer);
+ factory.updateImplementation(alice);
+
+ assertEq(factory.implementation(), alice);
+ }
+
+}
diff --git a/test/factory/IdFactory.t.sol b/test/factory/IdFactory.t.sol
new file mode 100644
index 00000000..c6055b21
--- /dev/null
+++ b/test/factory/IdFactory.t.sol
@@ -0,0 +1,390 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { Constants } from "../utils/Constants.sol";
+import { Identity } from "contracts/Identity.sol";
+import { IdFactory } from "contracts/factory/IdFactory.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { ImplementationAuthority } from "contracts/proxy/ImplementationAuthority.sol";
+import { RevertingIdentity } from "test/mocks/RevertingIdentity.sol";
+
+contract IdFactoryTest is OnchainIDSetup {
+
+ // ============ createIdentity ============
+
+ function test_revertBecauseAuthorityIsZeroAddress() public {
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ new IdFactory(address(0));
+ }
+
+ function test_revertBecauseSenderNotAllowedToCreateIdentities() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ onchainidSetup.idFactory.createIdentity(address(0), "salt1", IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_revertBecauseWalletCannotBeZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ onchainidSetup.idFactory.createIdentity(address(0), "salt1", IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_revertBecauseSaltCannotBeEmpty() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.EmptyString.selector);
+ onchainidSetup.idFactory.createIdentity(david, "", IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_revertBecauseSaltAlreadyUsed() public {
+ vm.prank(deployer);
+ onchainidSetup.idFactory.createIdentity(carol, "saltUsed", IdentityTypes.INDIVIDUAL, new address[](0));
+
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.SaltTaken.selector, "OIDsaltUsed"));
+ onchainidSetup.idFactory.createIdentity(david, "saltUsed", IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_revertBecauseWalletAlreadyLinked() public {
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.WalletAlreadyLinkedToIdentity.selector, alice));
+ onchainidSetup.idFactory.createIdentity(alice, "newSalt", IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ // ============ linkWallet ============
+
+ function test_linkWallet_revertForZeroAddress() public {
+ vm.prank(alice);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ onchainidSetup.idFactory.linkWallet(address(0));
+ }
+
+ function test_linkWallet_revertForSenderNotLinked() public {
+ vm.prank(david);
+ vm.expectRevert(abi.encodeWithSelector(Errors.WalletNotLinkedToIdentity.selector, david));
+ onchainidSetup.idFactory.linkWallet(david);
+ }
+
+ function test_linkWallet_revertForNewWalletAlreadyLinked() public {
+ vm.prank(bob);
+ vm.expectRevert(abi.encodeWithSelector(Errors.WalletAlreadyLinkedToIdentity.selector, alice));
+ onchainidSetup.idFactory.linkWallet(alice);
+ }
+
+ function test_linkWallet_revertForNewWalletLinkedToToken() public {
+ vm.prank(bob);
+ vm.expectRevert(abi.encodeWithSelector(Errors.TokenAlreadyLinked.selector, Constants.TOKEN_ADDRESS));
+ onchainidSetup.idFactory.linkWallet(Constants.TOKEN_ADDRESS);
+ }
+
+ function test_linkWallet_shouldLinkNewWallet() public {
+ vm.prank(alice);
+ onchainidSetup.idFactory.linkWallet(david);
+
+ address[] memory wallets = onchainidSetup.idFactory.getWallets(address(aliceIdentity));
+ assertEq(wallets.length, 2);
+ assertEq(wallets[0], alice);
+ assertEq(wallets[1], david);
+ }
+
+ // ============ unlinkWallet ============
+
+ function test_unlinkWallet_revertForZeroAddress() public {
+ vm.prank(alice);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ onchainidSetup.idFactory.unlinkWallet(address(0));
+ }
+
+ function test_unlinkWallet_revertForUnlinkingSelf() public {
+ vm.prank(alice);
+ vm.expectRevert(Errors.CannotBeCalledOnSenderAddress.selector);
+ onchainidSetup.idFactory.unlinkWallet(alice);
+ }
+
+ function test_unlinkWallet_revertForSenderNotLinked() public {
+ vm.prank(david);
+ vm.expectRevert(Errors.OnlyLinkedWalletCanUnlink.selector);
+ onchainidSetup.idFactory.unlinkWallet(alice);
+ }
+
+ function test_unlinkWallet_shouldUnlink() public {
+ vm.prank(alice);
+ onchainidSetup.idFactory.linkWallet(david);
+
+ vm.prank(alice);
+ onchainidSetup.idFactory.unlinkWallet(david);
+
+ address[] memory wallets = onchainidSetup.idFactory.getWallets(address(aliceIdentity));
+ assertEq(wallets.length, 1);
+ assertEq(wallets[0], alice);
+ }
+
+ // ============ getIdentity ============
+
+ /// @notice getIdentity should return token identity for token addresses
+ function test_getIdentity_forTokenAddress_shouldReturnTokenIdentity() public view {
+ address identity = onchainidSetup.idFactory.getIdentity(Constants.TOKEN_ADDRESS);
+ assertTrue(identity != address(0), "Token identity should exist");
+ }
+
+ /// @notice getIdentity should return user identity for wallet addresses
+ function test_getIdentity_forUserWallet_shouldReturnUserIdentity() public view {
+ address identity = onchainidSetup.idFactory.getIdentity(alice);
+ assertEq(identity, address(aliceIdentity), "Should return alice's identity");
+ }
+
+ /// @notice getIdentity should return zero for unknown addresses
+ function test_getIdentity_forUnknownAddress_shouldReturnZero() public {
+ address identity = onchainidSetup.idFactory.getIdentity(makeAddr("unknown"));
+ assertEq(identity, address(0), "Should return zero address");
+ }
+
+ // ============ linkWallet - max wallets ============
+
+ /// @notice Linking more than 100 extra wallets should revert
+ function test_linkWallet_revertForMaxWalletsExceeded() public {
+ // alice already has 1 wallet linked. Link 100 more to reach the limit of 101.
+ for (uint256 i = 0; i < 100; i++) {
+ address newWallet = vm.addr(1000 + i);
+ vm.prank(alice);
+ onchainidSetup.idFactory.linkWallet(newWallet);
+ }
+
+ // The 102nd wallet should revert (101 wallets already linked)
+ address overflowWallet = makeAddr("overflowWallet");
+ vm.prank(alice);
+ vm.expectRevert(Errors.MaxWalletsPerIdentityExceeded.selector);
+ onchainidSetup.idFactory.linkWallet(overflowWallet);
+ }
+
+ // ============ unlinkWallet - swap-and-pop ============
+
+ /// @notice Unlinking a wallet that is not the last in the array exercises swap-and-pop
+ function test_unlinkWallet_shouldSwapAndPop() public {
+ // Link carol and david to alice's identity
+ vm.prank(alice);
+ onchainidSetup.idFactory.linkWallet(carol);
+ vm.prank(alice);
+ onchainidSetup.idFactory.linkWallet(david);
+
+ // wallets = [alice, carol, david]
+ // Unlink carol (middle element) — triggers swap with david
+ vm.prank(alice);
+ onchainidSetup.idFactory.unlinkWallet(carol);
+
+ address[] memory wallets = onchainidSetup.idFactory.getWallets(address(aliceIdentity));
+ assertEq(wallets.length, 2, "Should have 2 wallets");
+ assertEq(wallets[0], alice, "First wallet should be alice");
+ assertEq(wallets[1], david, "Second wallet should be david (swapped)");
+ }
+
+ // ============ createIdentityWithManagementKeys ============
+
+ function test_createIdentityWithManagementKeys_revertZeroAddress() public {
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(alice);
+
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(address(0), "salt1", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_createIdentityWithManagementKeys_revertEmptySalt() public {
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(alice);
+
+ vm.prank(deployer);
+ vm.expectRevert(Errors.EmptyString.selector);
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(david, "", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_createIdentityWithManagementKeys_revertSaltTaken() public {
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(alice);
+
+ vm.prank(deployer);
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(david, "sharedSalt", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+
+ address anotherWallet = makeAddr("anotherWallet");
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.SaltTaken.selector, "OIDsharedSalt"));
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(
+ anotherWallet, "sharedSalt", keys, IdentityTypes.INDIVIDUAL, new address[](0)
+ );
+ }
+
+ function test_createIdentityWithManagementKeys_revertWalletAlreadyLinked() public {
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(carol);
+
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.WalletAlreadyLinkedToIdentity.selector, alice));
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(alice, "uniqueSalt", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_createIdentityWithManagementKeys_revertNoKeys() public {
+ bytes32[] memory keys = new bytes32[](0);
+
+ vm.prank(deployer);
+ vm.expectRevert(Errors.EmptyListOfKeys.selector);
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(david, "salt1", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_createIdentityWithManagementKeys_revertWalletInKeys() public {
+ bytes32[] memory keys = new bytes32[](2);
+ keys[0] = ClaimSignerHelper.addressToKey(alice);
+ keys[1] = ClaimSignerHelper.addressToKey(david);
+
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.WalletAlsoListedInManagementKeys.selector, david));
+ onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(david, "salt1", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_createIdentityWithManagementKeys_shouldDeployAndSetKeys() public {
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(alice);
+
+ vm.prank(deployer);
+ address identityAddr = onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(david, "salt1", keys, IdentityTypes.INDIVIDUAL, new address[](0));
+
+ Identity identity = Identity(identityAddr);
+
+ // Raw abi.encode (not hashed) should return false
+ assertFalse(
+ identity.keyHasPurpose(bytes32(uint256(uint160(address(onchainidSetup.idFactory)))), KeyPurposes.MANAGEMENT)
+ );
+ assertFalse(identity.keyHasPurpose(bytes32(uint256(uint160(david))), KeyPurposes.MANAGEMENT));
+ assertFalse(identity.keyHasPurpose(bytes32(uint256(uint160(alice))), KeyPurposes.MANAGEMENT));
+
+ // Proper keccak256 hashed key SHOULD be a management key
+ assertTrue(identity.keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT));
+ }
+
+ // ============ createIdentity with claimAdders ============
+
+ /// @notice createIdentity with claimAdders should set CLAIM_ADDER keys on the identity
+ function test_createIdentity_withClaimAdders_shouldSetClaimAdderKeys() public {
+ address claimAdder1 = makeAddr("claimAdder1");
+ address claimAdder2 = makeAddr("claimAdder2");
+ address[] memory claimAdders = new address[](2);
+ claimAdders[0] = claimAdder1;
+ claimAdders[1] = claimAdder2;
+
+ vm.prank(deployer);
+ address identityAddr =
+ onchainidSetup.idFactory.createIdentity(david, "saltWithAdders", IdentityTypes.INDIVIDUAL, claimAdders);
+
+ Identity identity = Identity(identityAddr);
+
+ // Verify CLAIM_ADDER keys are set
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(claimAdder1), KeyPurposes.CLAIM_ADDER),
+ "claimAdder1 should have CLAIM_ADDER purpose"
+ );
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(claimAdder2), KeyPurposes.CLAIM_ADDER),
+ "claimAdder2 should have CLAIM_ADDER purpose"
+ );
+
+ // Verify management key is still set for wallet
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(david), KeyPurposes.MANAGEMENT),
+ "david should have MANAGEMENT purpose"
+ );
+ }
+
+ /// @notice createIdentityWithManagementKeys with claimAdders should set CLAIM_ADDER keys
+ function test_createIdentityWithManagementKeys_withClaimAdders_shouldSetClaimAdderKeys() public {
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(alice);
+
+ address claimAdder = makeAddr("claimAdder");
+ address[] memory claimAdders = new address[](1);
+ claimAdders[0] = claimAdder;
+
+ vm.prank(deployer);
+ address identityAddr = onchainidSetup.idFactory
+ .createIdentityWithManagementKeys(david, "saltMgmtAdders", keys, IdentityTypes.INDIVIDUAL, claimAdders);
+
+ Identity identity = Identity(identityAddr);
+
+ // Verify CLAIM_ADDER key is set
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(claimAdder), KeyPurposes.CLAIM_ADDER),
+ "claimAdder should have CLAIM_ADDER purpose"
+ );
+
+ // Verify management key is set
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT),
+ "alice should have MANAGEMENT purpose"
+ );
+ }
+
+ /// @notice Factory's own management key should be removed after identity creation
+ function test_createIdentity_factoryKeyRemoved() public {
+ vm.prank(deployer);
+ address identityAddr = onchainidSetup.idFactory
+ .createIdentity(david, "saltFactoryKey", IdentityTypes.INDIVIDUAL, new address[](0));
+
+ Identity identity = Identity(identityAddr);
+
+ // Factory should NOT have management key
+ assertFalse(
+ identity.keyHasPurpose(
+ ClaimSignerHelper.addressToKey(address(onchainidSetup.idFactory)), KeyPurposes.MANAGEMENT
+ ),
+ "Factory should not have MANAGEMENT key after creation"
+ );
+ }
+
+ // ============ createIdentity with new identity types ============
+
+ /// @notice createIdentity with SMART_CONTRACT type should deploy and set type
+ function test_createIdentity_smartContractType_shouldSetType() public {
+ vm.prank(deployer);
+ address identityAddr = onchainidSetup.idFactory
+ .createIdentity(david, "saltSmartContract", IdentityTypes.SMART_CONTRACT, new address[](0));
+
+ Identity identity = Identity(identityAddr);
+ assertEq(identity.getIdentityType(), IdentityTypes.SMART_CONTRACT, "Identity type should be SMART_CONTRACT");
+ }
+
+ /// @notice createIdentity with PUBLIC_AUTHORITY type should deploy and set type
+ function test_createIdentity_publicAuthorityType_shouldSetType() public {
+ vm.prank(deployer);
+ address identityAddr = onchainidSetup.idFactory
+ .createIdentity(david, "saltPublicAuth", IdentityTypes.PUBLIC_AUTHORITY, new address[](0));
+
+ Identity identity = Identity(identityAddr);
+ assertEq(identity.getIdentityType(), IdentityTypes.PUBLIC_AUTHORITY, "Identity type should be PUBLIC_AUTHORITY");
+ }
+
+ // ============ _deploy CREATE2 failure ============
+
+ /// @notice CREATE2 failure triggers assembly revert when proxy constructor reverts
+ function test_createIdentity_revertWhenCreate2Fails() public {
+ // Deploy a factory with a reverting implementation
+ RevertingIdentity revertingImpl = new RevertingIdentity();
+ ImplementationAuthority badAuthority = new ImplementationAuthority(address(revertingImpl));
+ IdFactory badFactory = new IdFactory(address(badAuthority));
+
+ // createIdentity will try CREATE2 with IdentityProxy whose constructor
+ // delegatecalls initialize() on RevertingIdentity, which reverts,
+ // causing CREATE2 to return address(0) and triggering assembly revert
+ vm.expectRevert();
+ badFactory.createIdentity(david, "salt1", IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+}
diff --git a/test/factory/TokenOid.t.sol b/test/factory/TokenOid.t.sol
new file mode 100644
index 00000000..652708dd
--- /dev/null
+++ b/test/factory/TokenOid.t.sol
@@ -0,0 +1,178 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { IdentityHelper } from "../helpers/IdentityHelper.sol";
+import { Identity } from "contracts/Identity.sol";
+import { IdFactory } from "contracts/factory/IdFactory.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { Test } from "forge-std/Test.sol";
+
+contract TokenOidTest is Test {
+
+ IdentityHelper.OnchainIDSetup internal setup;
+
+ address internal deployer;
+ address internal alice;
+ address internal bob;
+
+ function setUp() public {
+ deployer = makeAddr("tokenOidDeployer");
+ alice = makeAddr("tokenOidAlice");
+ bob = makeAddr("tokenOidBob");
+
+ vm.startPrank(deployer);
+ setup = IdentityHelper.deployFactory(deployer);
+ vm.stopPrank();
+ }
+
+ // ============ addTokenFactory ============
+
+ function test_addTokenFactory_revertNotOwner() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ setup.idFactory.addTokenFactory(alice);
+ }
+
+ function test_addTokenFactory_revertZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ setup.idFactory.addTokenFactory(address(0));
+ }
+
+ function test_addTokenFactory_shouldAdd() public {
+ vm.prank(deployer);
+ setup.idFactory.addTokenFactory(alice);
+ assertTrue(setup.idFactory.isTokenFactory(alice));
+ }
+
+ function test_addTokenFactory_revertAlreadyFactory() public {
+ vm.prank(deployer);
+ setup.idFactory.addTokenFactory(alice);
+
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.AlreadyAFactory.selector, alice));
+ setup.idFactory.addTokenFactory(alice);
+ }
+
+ // ============ removeTokenFactory ============
+
+ function test_removeTokenFactory_revertNotOwner() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ setup.idFactory.removeTokenFactory(bob);
+ }
+
+ function test_removeTokenFactory_revertZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ setup.idFactory.removeTokenFactory(address(0));
+ }
+
+ function test_removeTokenFactory_revertNotFactory() public {
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.NotAFactory.selector, bob));
+ setup.idFactory.removeTokenFactory(bob);
+ }
+
+ function test_removeTokenFactory_shouldRemove() public {
+ vm.prank(deployer);
+ setup.idFactory.addTokenFactory(alice);
+
+ vm.prank(deployer);
+ setup.idFactory.removeTokenFactory(alice);
+ assertFalse(setup.idFactory.isTokenFactory(alice));
+ }
+
+ // ============ createTokenIdentity ============
+
+ function test_createTokenIdentity_revertNotAuthorized() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ setup.idFactory.createTokenIdentity(alice, alice, "TST", new address[](0));
+ }
+
+ function test_createTokenIdentity_revertTokenZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ setup.idFactory.createTokenIdentity(address(0), alice, "TST", new address[](0));
+ }
+
+ function test_createTokenIdentity_revertOwnerZeroAddress() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ setup.idFactory.createTokenIdentity(alice, address(0), "TST", new address[](0));
+ }
+
+ function test_createTokenIdentity_revertEmptySalt() public {
+ vm.prank(deployer);
+ vm.expectRevert(Errors.EmptyString.selector);
+ setup.idFactory.createTokenIdentity(alice, alice, "", new address[](0));
+ }
+
+ /// @notice Token factory should be able to create token identity
+ function test_createTokenIdentity_viaTokenFactory_shouldCreate() public {
+ // Register alice as a token factory
+ vm.prank(deployer);
+ setup.idFactory.addTokenFactory(alice);
+
+ // alice (as token factory) creates a token identity
+ address token = makeAddr("tokenAddr");
+ vm.prank(alice);
+ address identity = setup.idFactory.createTokenIdentity(token, bob, "factorySalt", new address[](0));
+
+ assertTrue(identity != address(0), "Identity should be deployed");
+ assertEq(setup.idFactory.getIdentity(token), identity, "Token should map to identity");
+ assertEq(setup.idFactory.getToken(identity), token, "Identity should map to token");
+ }
+
+ function test_createTokenIdentity_shouldCreateAndRevertDuplicate() public {
+ assertFalse(setup.idFactory.isSaltTaken("Tokensalt1"));
+
+ vm.prank(deployer);
+ setup.idFactory.createTokenIdentity(alice, bob, "salt1", new address[](0));
+
+ address tokenIdentityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(tokenIdentityAddr != address(0));
+ assertTrue(setup.idFactory.isSaltTaken("Tokensalt1"));
+ assertFalse(setup.idFactory.isSaltTaken("Tokensalt2"));
+ assertEq(setup.idFactory.getToken(tokenIdentityAddr), alice);
+
+ // Same salt should revert
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.SaltTaken.selector, "Tokensalt1"));
+ setup.idFactory.createTokenIdentity(alice, alice, "salt1", new address[](0));
+
+ // Same token address should revert
+ vm.prank(deployer);
+ vm.expectRevert(abi.encodeWithSelector(Errors.TokenAlreadyLinked.selector, alice));
+ setup.idFactory.createTokenIdentity(alice, alice, "salt2", new address[](0));
+ }
+
+ /// @notice createTokenIdentity with claimAdders should set CLAIM_ADDER keys
+ function test_createTokenIdentity_withClaimAdders_shouldSetClaimAdderKeys() public {
+ address claimAdder = makeAddr("tokenClaimAdder");
+ address[] memory claimAdders = new address[](1);
+ claimAdders[0] = claimAdder;
+
+ address token = makeAddr("tokenWithAdders");
+ vm.prank(deployer);
+ address identityAddr = setup.idFactory.createTokenIdentity(token, bob, "saltAdders", claimAdders);
+
+ Identity identity = Identity(identityAddr);
+
+ // Verify CLAIM_ADDER key is set
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(claimAdder), KeyPurposes.CLAIM_ADDER),
+ "claimAdder should have CLAIM_ADDER purpose"
+ );
+
+ // Verify token owner has management key
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(bob), KeyPurposes.MANAGEMENT),
+ "token owner should have MANAGEMENT purpose"
+ );
+ }
+
+}
diff --git a/test/factory/factory.test.ts b/test/factory/factory.test.ts
deleted file mode 100644
index b29c18ba..00000000
--- a/test/factory/factory.test.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import {expect} from "chai";
-import {ethers} from "hardhat";
-import {loadFixture} from "@nomicfoundation/hardhat-network-helpers";
-
-import {deployIdentityFixture} from "../fixtures";
-
-describe('IdFactory', () => {
- it('should revert because authority is Zero address', async () => {
- const [deployerWallet] = await ethers.getSigners();
-
- const IdFactory = await ethers.getContractFactory('IdFactory');
- await expect(IdFactory.connect(deployerWallet).deploy(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert because sender is not allowed to create identities', async () => {
- const {identityFactory, aliceWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(aliceWallet).createIdentity(ethers.constants.AddressZero, 'salt1')).to.be.revertedWith('Ownable: caller is not the owner');
- });
-
- it('should revert because wallet of identity cannot be Zero address', async () => {
- const {identityFactory, deployerWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(deployerWallet).createIdentity(ethers.constants.AddressZero, 'salt1')).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert because salt cannot be empty', async () => {
- const {identityFactory, deployerWallet, davidWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(deployerWallet).createIdentity(davidWallet.address, '')).to.be.revertedWith('invalid argument - empty string');
- });
-
- it('should revert because salt cannot be already used', async () => {
- const {identityFactory, deployerWallet, davidWallet, carolWallet} = await loadFixture(deployIdentityFixture);
-
- await identityFactory.connect(deployerWallet).createIdentity(carolWallet.address, 'saltUsed');
-
- await expect(identityFactory.connect(deployerWallet).createIdentity(davidWallet.address, 'saltUsed')).to.be.revertedWith('salt already taken');
- });
-
- it('should revert because wallet is already linked to an identity', async () => {
- const {identityFactory, deployerWallet, aliceWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(deployerWallet).createIdentity(aliceWallet.address, 'newSalt')).to.be.revertedWith('wallet already linked to an identity');
- });
-
- describe('link/unlink wallet', () => {
- describe('linkWallet', () => {
- it('should revert for new wallet being zero address', async () => {
- const { identityFactory, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(aliceWallet).linkWallet(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert for sender wallet being not linked', async () => {
- const { identityFactory, davidWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(davidWallet).linkWallet(davidWallet.address)).to.be.revertedWith('wallet not linked to an identity contract');
- });
-
- it('should revert for new wallet being already linked', async () => {
- const { identityFactory, bobWallet, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(bobWallet).linkWallet(aliceWallet.address)).to.be.revertedWith('new wallet already linked');
- });
-
- it('should revert for new wallet being already to a token identity', async () => {
- const { identityFactory, bobWallet, tokenAddress } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(bobWallet).linkWallet(tokenAddress)).to.be.revertedWith('invalid argument - token address');
- });
-
- it('should link the new wallet to the existing identity', async () => {
- const { identityFactory, aliceIdentity, aliceWallet, davidWallet } = await loadFixture(deployIdentityFixture);
-
- const tx = await identityFactory.connect(aliceWallet).linkWallet(davidWallet.address);
- await expect(tx).to.emit(identityFactory, 'WalletLinked').withArgs(davidWallet.address, aliceIdentity.address);
-
- expect(await identityFactory.getWallets(aliceIdentity.address)).to.deep.equal([aliceWallet.address, davidWallet.address]);
- });
- });
-
- describe('unlinkWallet', () => {
- it('should revert for wallet to unlink being zero address', async () => {
- const { identityFactory, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(aliceWallet).unlinkWallet(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert for sender wallet attemoting to unlink itself', async () => {
- const { identityFactory, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(aliceWallet).unlinkWallet(aliceWallet.address)).to.be.revertedWith('cannot be called on sender address');
- });
-
- it('should revert for sender wallet being not linked', async () => {
- const { identityFactory, aliceWallet, davidWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(davidWallet).unlinkWallet(aliceWallet.address)).to.be.revertedWith('only a linked wallet can unlink');
- });
-
- it('should unlink the wallet', async () => {
- const { identityFactory, aliceIdentity, aliceWallet, davidWallet } = await loadFixture(deployIdentityFixture);
-
- await identityFactory.connect(aliceWallet).linkWallet(davidWallet.address);
- const tx = await identityFactory.connect(aliceWallet).unlinkWallet(davidWallet.address);
- await expect(tx).to.emit(identityFactory, 'WalletUnlinked').withArgs(davidWallet.address, aliceIdentity.address);
-
- expect(await identityFactory.getWallets(aliceIdentity.address)).to.deep.equal([aliceWallet.address]);
- });
- });
- });
-
- describe('createIdentityWithManagementKeys()', () => {
- describe('when no management keys are provided', () => {
- it('should revert', async () => {
- const {identityFactory, deployerWallet, davidWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(deployerWallet).createIdentityWithManagementKeys(davidWallet.address, 'salt1', [])).to.be.revertedWith('invalid argument - empty list of keys');
- });
- });
-
- describe('when the wallet is included in the management keys listed', () => {
- it('should revert', async () => {
- const {identityFactory, deployerWallet, aliceWallet, davidWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityFactory.connect(deployerWallet).createIdentityWithManagementKeys(davidWallet.address, 'salt1', [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])),
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [davidWallet.address])),
- ])).to.be.revertedWith('invalid argument - wallet is also listed in management keys');
- });
- });
-
- describe('when other management keys are specified', () => {
- it('should deploy the identity proxy, set keys and wallet as management, and link wallet to identity', async () => {
- const {identityFactory, deployerWallet, aliceWallet, davidWallet} = await loadFixture(deployIdentityFixture);
-
- const tx = await identityFactory.connect(deployerWallet).createIdentityWithManagementKeys(davidWallet.address, 'salt1', [ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address]))]);
-
- await expect(tx).to.emit(identityFactory, 'WalletLinked');
- await expect(tx).to.emit(identityFactory, 'Deployed');
-
- const identity = await ethers.getContractAt('Identity', await identityFactory.getIdentity(davidWallet.address));
-
- await expect(tx).to.emit(identity, 'KeyAdded').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1, 1);
- await expect(identity.keyHasPurpose(
- ethers.utils.defaultAbiCoder.encode(['address'], [identityFactory.address]),
- 1
- )).to.eventually.be.false;
- await expect(identity.keyHasPurpose(
- ethers.utils.defaultAbiCoder.encode(['address'], [davidWallet.address]),
- 1
- )).to.eventually.be.false;
- await expect(identity.keyHasPurpose(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address]),
- 1
- )).to.eventually.be.false;
- });
- });
- });
-});
diff --git a/test/factory/token-oid.test.ts b/test/factory/token-oid.test.ts
deleted file mode 100644
index c59e5f65..00000000
--- a/test/factory/token-oid.test.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
-import { expect } from "chai";
-import {ethers} from "hardhat";
-
-import {deployFactoryFixture, deployIdentityFixture} from "../fixtures";
-
-describe('IdFactory', () => {
- describe('add/remove Token factory', () => {
- it('should manipulate Token factory list', async () => {
- const { identityFactory, deployerWallet, aliceWallet, bobWallet } = await loadFixture(deployFactoryFixture);
-
- await expect(identityFactory.connect(aliceWallet).addTokenFactory(aliceWallet.address)).to.be.revertedWith('Ownable: caller is not the owner');
-
- await expect(identityFactory.connect(deployerWallet).addTokenFactory(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
-
- const addTx = await identityFactory.connect(deployerWallet).addTokenFactory(aliceWallet.address);
- await expect(addTx).to.emit(identityFactory, 'TokenFactoryAdded').withArgs(aliceWallet.address);
-
- await expect(identityFactory.connect(deployerWallet).addTokenFactory(aliceWallet.address)).to.be.revertedWith('already a factory');
-
- await expect(identityFactory.connect(aliceWallet).removeTokenFactory(bobWallet.address)).to.be.revertedWith('Ownable: caller is not the owner');
-
- await expect(identityFactory.connect(deployerWallet).removeTokenFactory(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
-
- await expect(identityFactory.connect(deployerWallet).removeTokenFactory(bobWallet.address)).to.be.revertedWith('not a factory');
-
- const removeTx = await identityFactory.connect(deployerWallet).removeTokenFactory(aliceWallet.address);
- await expect(removeTx).to.emit(identityFactory, 'TokenFactoryRemoved').withArgs(aliceWallet.address);
- });
- });
-
- describe('createTokenIdentity', () => {
- it('should revert for being not authorized to deploy token', async () => {
- const { identityFactory, aliceWallet } = await loadFixture(deployFactoryFixture);
-
- await expect(identityFactory.connect(aliceWallet).createTokenIdentity(aliceWallet.address, aliceWallet.address, 'TST')).to.be.revertedWith('only Factory or owner can call');
- });
-
- it('should revert for token address being zero address', async () => {
- const { identityFactory, deployerWallet, aliceWallet } = await loadFixture(deployFactoryFixture);
-
- await expect(identityFactory.connect(deployerWallet).createTokenIdentity(ethers.constants.AddressZero, aliceWallet.address, 'TST')).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert for owner being zero address', async () => {
- const { identityFactory, deployerWallet, aliceWallet } = await loadFixture(deployFactoryFixture);
-
- await expect(identityFactory.connect(deployerWallet).createTokenIdentity(aliceWallet.address, ethers.constants.AddressZero, 'TST')).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert for salt being empty', async () => {
- const { identityFactory, deployerWallet, aliceWallet } = await loadFixture(deployFactoryFixture);
-
- await expect(identityFactory.connect(deployerWallet).createTokenIdentity(aliceWallet.address, aliceWallet.address, '')).to.be.revertedWith('invalid argument - empty string');
- });
-
- it('should create one identity and then revert for salt/address being already used', async () => {
- const { identityFactory, deployerWallet, aliceWallet, bobWallet } = await loadFixture(deployFactoryFixture);
-
- expect(await identityFactory.isSaltTaken('Tokensalt1')).to.be.false;
-
- const tx = await identityFactory.connect(deployerWallet).createTokenIdentity(aliceWallet.address, bobWallet.address, 'salt1');
- const tokenIdentityAddress = await identityFactory.getIdentity(aliceWallet.address);
- await expect(tx).to.emit(identityFactory, 'TokenLinked').withArgs(aliceWallet.address, tokenIdentityAddress);
- await expect(tx).to.emit(identityFactory, 'Deployed').withArgs(tokenIdentityAddress);
-
- expect(await identityFactory.isSaltTaken('Tokensalt1')).to.be.true;
- expect(await identityFactory.isSaltTaken('Tokensalt2')).to.be.false;
- expect(await identityFactory.getToken(tokenIdentityAddress)).to.deep.equal(aliceWallet.address);
-
- await expect(identityFactory.connect(deployerWallet).createTokenIdentity(aliceWallet.address, aliceWallet.address, 'salt1')).to.be.revertedWith('salt already taken');
- await expect(identityFactory.connect(deployerWallet).createTokenIdentity(aliceWallet.address, aliceWallet.address, 'salt2')).to.be.revertedWith('token already linked to an identity');
- });
- });
-});
diff --git a/test/fixtures.ts b/test/fixtures.ts
deleted file mode 100644
index ce94c466..00000000
--- a/test/fixtures.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { ethers } from 'hardhat';
-
-export async function deployFactoryFixture() {
- const [deployerWallet, claimIssuerWallet, aliceWallet, bobWallet, carolWallet, davidWallet] =
- await ethers.getSigners();
-
- const Identity = await ethers.getContractFactory('Identity');
- const identityImplementation = await Identity.connect(deployerWallet).deploy(deployerWallet.address, true);
-
- const ImplementationAuthority = await ethers.getContractFactory(
- 'ImplementationAuthority'
- );
- const implementationAuthority = await ImplementationAuthority.connect(deployerWallet).deploy(
- identityImplementation.address,
- );
-
- const IdentityFactory = await ethers.getContractFactory('IdFactory');
- const identityFactory = await IdentityFactory.connect(deployerWallet).deploy(
- implementationAuthority.address,
- );
-
- return {
- identityFactory,
- identityImplementation,
- implementationAuthority,
- aliceWallet,
- bobWallet,
- carolWallet,
- davidWallet,
- deployerWallet,
- claimIssuerWallet,
- };
-}
-
-export async function deployIdentityFixture() {
- const [deployerWallet, claimIssuerWallet, aliceWallet, bobWallet, carolWallet, davidWallet, tokenOwnerWallet] =
- await ethers.getSigners();
-
- const { identityFactory, identityImplementation, implementationAuthority } = await deployFactoryFixture();
-
- const ClaimIssuer = await ethers.getContractFactory('ClaimIssuer');
- const claimIssuer = await ClaimIssuer.connect(claimIssuerWallet).deploy(claimIssuerWallet.address);
- await claimIssuer.connect(claimIssuerWallet).addKey(
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [claimIssuerWallet.address])
- ),
- 3,
- 1,
- );
-
- await identityFactory.connect(deployerWallet).createIdentity(aliceWallet.address, 'alice');
- const aliceIdentity = await ethers.getContractAt('Identity', await identityFactory.getIdentity(aliceWallet.address));
- await aliceIdentity.connect(aliceWallet).addKey(ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [carolWallet.address])
- ), 3, 1);
- await aliceIdentity.connect(aliceWallet).addKey(ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [davidWallet.address])
- ), 2, 1);
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.id = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [aliceClaim666.issuer, aliceClaim666.topic]));
- aliceClaim666.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
-
- await aliceIdentity.connect(aliceWallet).addClaim(aliceClaim666.topic, aliceClaim666.scheme, aliceClaim666.issuer, aliceClaim666.signature, aliceClaim666.data, aliceClaim666.uri);
-
- await identityFactory.connect(deployerWallet).createIdentity(bobWallet.address, 'bob');
- const bobIdentity = await ethers.getContractAt('Identity', await identityFactory.getIdentity(bobWallet.address));
-
- const tokenAddress = '0xdEE019486810C7C620f6098EEcacA0244b0fa3fB';
- await identityFactory.connect(deployerWallet).createTokenIdentity(tokenAddress, tokenOwnerWallet.address, 'tokenOwner');
-
- return {
- identityFactory,
- identityImplementation,
- implementationAuthority,
- claimIssuer,
- aliceWallet,
- bobWallet,
- carolWallet,
- davidWallet,
- deployerWallet,
- claimIssuerWallet,
- tokenOwnerWallet,
- aliceIdentity,
- bobIdentity,
- aliceClaim666,
- tokenAddress
- };
-}
-
-export async function deployVerifierFixture() {
-
-}
diff --git a/test/gateway/Gateway.t.sol b/test/gateway/Gateway.t.sol
new file mode 100644
index 00000000..5aec9a39
--- /dev/null
+++ b/test/gateway/Gateway.t.sol
@@ -0,0 +1,551 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { IdentityHelper } from "../helpers/IdentityHelper.sol";
+import { Identity } from "contracts/Identity.sol";
+import { IdFactory } from "contracts/factory/IdFactory.sol";
+import { Gateway } from "contracts/gateway/Gateway.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { Test } from "forge-std/Test.sol";
+import { Vm } from "forge-std/Vm.sol";
+
+contract GatewayTest is Test {
+
+ IdentityHelper.OnchainIDSetup internal setup;
+
+ address internal deployer;
+ uint256 internal deployerPk;
+ address internal alice;
+ uint256 internal alicePk;
+ address internal bob;
+ uint256 internal bobPk;
+ address internal carol;
+ uint256 internal carolPk;
+
+ function setUp() public {
+ (deployer, deployerPk) = makeAddrAndKey("gwDeployer");
+ (alice, alicePk) = makeAddrAndKey("gwAlice");
+ (bob, bobPk) = makeAddrAndKey("gwBob");
+ (carol, carolPk) = makeAddrAndKey("gwCarol");
+
+ vm.warp(365 days);
+
+ vm.startPrank(deployer);
+ setup = IdentityHelper.deployFactory(deployer);
+ vm.stopPrank();
+ }
+
+ // ---- helpers ----
+
+ function _signDeploy(
+ uint256 signerPk,
+ address owner,
+ string memory salt,
+ uint256 identityType,
+ address[] memory claimAdders,
+ uint256 expiry
+ ) internal pure returns (bytes memory) {
+ bytes32 digest = keccak256(
+ abi.encode("Authorize ONCHAINID deployment", owner, salt, identityType, claimAdders, expiry)
+ );
+ bytes32 ethSignedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest));
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, ethSignedHash);
+ return abi.encodePacked(r, s, v);
+ }
+
+ function _signDeployWithKeys(
+ uint256 signerPk,
+ address owner,
+ string memory salt,
+ bytes32[] memory keys,
+ uint256 identityType,
+ address[] memory claimAdders,
+ uint256 expiry
+ ) internal pure returns (bytes memory) {
+ bytes32 digest = keccak256(
+ abi.encode("Authorize ONCHAINID deployment", owner, salt, keys, identityType, claimAdders, expiry)
+ );
+ bytes32 ethSignedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", digest));
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, ethSignedHash);
+ return abi.encodePacked(r, s, v);
+ }
+
+ function _deployGateway(address[] memory signers) internal returns (Gateway) {
+ return new Gateway(address(setup.idFactory), signers);
+ }
+
+ function _deployGatewayWithCarol() internal returns (Gateway) {
+ address[] memory signers = new address[](1);
+ signers[0] = carol;
+ return _deployGateway(signers);
+ }
+
+ // ============ constructor ============
+
+ function test_constructor_revertZeroFactory() public {
+ address[] memory signers = new address[](0);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ new Gateway(address(0), signers);
+ }
+
+ function test_constructor_revertTooManySigners() public {
+ address[] memory signers = new address[](11);
+ vm.expectRevert(Errors.TooManySigners.selector);
+ new Gateway(address(setup.idFactory), signers);
+ }
+
+ // ============ deployIdentityWithSalt ============
+
+ function test_deployIdentityWithSalt_revertZeroAddress() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ bytes memory sig = new bytes(65);
+
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ gateway.deployIdentityWithSalt(
+ address(0), "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), block.timestamp + 365 days, sig
+ );
+ }
+
+ function test_deployIdentityWithSalt_revertInvalidSignature() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ bytes memory sig = new bytes(65);
+
+ vm.expectRevert();
+ gateway.deployIdentityWithSalt(
+ alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), block.timestamp + 365 days, sig
+ );
+ }
+
+ function test_deployIdentityWithSalt_revertUnapprovedSigner() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(bobPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.UnapprovedSigner.selector, bob));
+ gateway.deployIdentityWithSalt(alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig);
+ }
+
+ function test_deployIdentityWithSalt_shouldDeploy() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+ gateway.deployIdentityWithSalt(alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig);
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(identityAddr != address(0));
+ assertTrue(Identity(identityAddr).keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT));
+ }
+
+ /// @notice deployIdentityWithSalt with claimAdders should set CLAIM_ADDER keys
+ function test_deployIdentityWithSalt_withClaimAdders_shouldSetKeys() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ address claimAdder = makeAddr("gwClaimAdder");
+ address[] memory claimAdders = new address[](1);
+ claimAdders[0] = claimAdder;
+
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltWithAdders", IdentityTypes.INDIVIDUAL, claimAdders, expiry);
+ gateway.deployIdentityWithSalt(alice, "saltWithAdders", IdentityTypes.INDIVIDUAL, claimAdders, expiry, sig);
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(identityAddr != address(0), "Identity should be deployed");
+
+ Identity identity = Identity(identityAddr);
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT),
+ "alice should have MANAGEMENT key"
+ );
+ assertTrue(
+ identity.keyHasPurpose(ClaimSignerHelper.addressToKey(claimAdder), KeyPurposes.CLAIM_ADDER),
+ "claimAdder should have CLAIM_ADDER key"
+ );
+ }
+
+ function test_deployIdentityWithSalt_noExpiry() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), 0);
+ gateway.deployIdentityWithSalt(alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), 0, sig);
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(identityAddr != address(0));
+ }
+
+ function test_deployIdentityWithSalt_revertRevokedSignature() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ gateway.revokeSignature(sig);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.RevokedSignature.selector, sig));
+ gateway.deployIdentityWithSalt(alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig);
+ }
+
+ function test_deployIdentityWithSalt_revertExpiredSignature() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ uint256 expiry = block.timestamp - 2 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.ExpiredSignature.selector, sig));
+ gateway.deployIdentityWithSalt(alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig);
+ }
+
+ // ============ deployIdentityWithSaltAndManagementKeys ============
+
+ function test_deployWithKeys_revertZeroAddress() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ bytes32[] memory keys = new bytes32[](0);
+ bytes memory sig = new bytes(65);
+
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ gateway.deployIdentityWithSaltAndManagementKeys(
+ address(0), "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), block.timestamp + 365 days, sig
+ );
+ }
+
+ function test_deployWithKeys_revertUnapprovedSigner() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(bob);
+ bytes memory sig =
+ _signDeployWithKeys(bobPk, alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.UnapprovedSigner.selector, bob));
+ gateway.deployIdentityWithSaltAndManagementKeys(
+ alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig
+ );
+ }
+
+ function test_deployWithKeys_shouldDeploy() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ uint256 expiry = block.timestamp + 365 days;
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(bob);
+ bytes memory sig = _signDeployWithKeys(
+ carolPk, alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry
+ );
+
+ gateway.deployIdentityWithSaltAndManagementKeys(
+ alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig
+ );
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(identityAddr != address(0));
+ Identity identity = Identity(identityAddr);
+ // alice should NOT have management key (managed by bob's key only)
+ assertFalse(identity.keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT));
+ // bob should have management key
+ assertTrue(identity.keyHasPurpose(ClaimSignerHelper.addressToKey(bob), KeyPurposes.MANAGEMENT));
+ }
+
+ function test_deployWithKeys_noExpiry() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(bob);
+ bytes memory sig =
+ _signDeployWithKeys(carolPk, alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), 0);
+
+ gateway.deployIdentityWithSaltAndManagementKeys(
+ alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), 0, sig
+ );
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ Identity identity = Identity(identityAddr);
+ assertFalse(identity.keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT));
+ assertTrue(identity.keyHasPurpose(ClaimSignerHelper.addressToKey(bob), KeyPurposes.MANAGEMENT));
+ }
+
+ function test_deployWithKeys_revertRevokedSignature() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ uint256 expiry = block.timestamp + 365 days;
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(bob);
+ bytes memory sig = _signDeployWithKeys(
+ carolPk, alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry
+ );
+
+ gateway.revokeSignature(sig);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.RevokedSignature.selector, sig));
+ gateway.deployIdentityWithSaltAndManagementKeys(
+ alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig
+ );
+ }
+
+ function test_deployWithKeys_revertExpiredSignature() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ uint256 expiry = block.timestamp - 2 days;
+ bytes32[] memory keys = new bytes32[](1);
+ keys[0] = ClaimSignerHelper.addressToKey(bob);
+ bytes memory sig = _signDeployWithKeys(
+ carolPk, alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry
+ );
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.ExpiredSignature.selector, sig));
+ gateway.deployIdentityWithSaltAndManagementKeys(
+ alice, "saltToUse", keys, IdentityTypes.INDIVIDUAL, new address[](0), expiry, sig
+ );
+ }
+
+ // ============ deployIdentityForWallet ============
+
+ function test_deployForWallet_revertZeroAddress() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ gateway.deployIdentityForWallet(address(0), IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ function test_deployForWallet_anotherSender() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.prank(bob);
+ gateway.deployIdentityForWallet(alice, IdentityTypes.INDIVIDUAL, new address[](0));
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(identityAddr != address(0));
+ assertTrue(Identity(identityAddr).keyHasPurpose(ClaimSignerHelper.addressToKey(alice), KeyPurposes.MANAGEMENT));
+ }
+
+ function test_deployForWallet_shouldDeploy() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.prank(alice);
+ gateway.deployIdentityForWallet(alice, IdentityTypes.INDIVIDUAL, new address[](0));
+
+ address identityAddr = setup.idFactory.getIdentity(alice);
+ assertTrue(identityAddr != address(0));
+ }
+
+ function test_deployForWallet_revertAlreadyDeployed() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.prank(alice);
+ gateway.deployIdentityForWallet(alice, IdentityTypes.INDIVIDUAL, new address[](0));
+
+ vm.prank(alice);
+ vm.expectRevert();
+ gateway.deployIdentityForWallet(alice, IdentityTypes.INDIVIDUAL, new address[](0));
+ }
+
+ // ============ transferFactoryOwnership ============
+
+ function test_transferOwnership_shouldTransfer() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ gateway.transferFactoryOwnership(bob);
+ assertEq(setup.idFactory.owner(), bob);
+ }
+
+ function test_transferOwnership_revertNotOwner() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ gateway.transferFactoryOwnership(bob);
+ }
+
+ // ============ revokeSignature ============
+
+ function test_revokeSignature_revertNotOwner() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ gateway.revokeSignature(sig);
+ }
+
+ function test_revokeSignature_revertAlreadyRevoked() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ gateway.revokeSignature(sig);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.SignatureAlreadyRevoked.selector, sig));
+ gateway.revokeSignature(sig);
+ }
+
+ // ============ approveSignature ============
+
+ function test_approveSignature_revertNotOwner() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ gateway.approveSignature(sig);
+ }
+
+ function test_approveSignature_revertNotRevoked() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.SignatureNotRevoked.selector, sig));
+ gateway.approveSignature(sig);
+ }
+
+ function test_approveSignature_shouldApprove() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ uint256 expiry = block.timestamp + 365 days;
+ bytes memory sig = _signDeploy(carolPk, alice, "saltToUse", IdentityTypes.INDIVIDUAL, new address[](0), expiry);
+
+ gateway.revokeSignature(sig);
+ gateway.approveSignature(sig);
+ }
+
+ // ============ approveSigner ============
+
+ function test_approveSigner_revertZeroAddress() public {
+ Gateway gateway = _deployGatewayWithCarol();
+
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ gateway.approveSigner(address(0));
+ }
+
+ function test_approveSigner_revertNotOwner() public {
+ Gateway gateway = _deployGatewayWithCarol();
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ gateway.approveSigner(bob);
+ }
+
+ function test_approveSigner_revertAlreadyApproved() public {
+ Gateway gateway = _deployGatewayWithCarol();
+
+ gateway.approveSigner(bob);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.SignerAlreadyApproved.selector, bob));
+ gateway.approveSigner(bob);
+ }
+
+ function test_approveSigner_shouldApprove() public {
+ Gateway gateway = _deployGatewayWithCarol();
+ gateway.approveSigner(bob);
+ assertTrue(gateway.approvedSigners(bob));
+ }
+
+ // ============ revokeSigner ============
+
+ function test_revokeSigner_revertZeroAddress() public {
+ address[] memory signers = new address[](1);
+ signers[0] = alice;
+ Gateway gateway = _deployGateway(signers);
+
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ gateway.revokeSigner(address(0));
+ }
+
+ function test_revokeSigner_revertNotOwner() public {
+ address[] memory signers = new address[](1);
+ signers[0] = bob;
+ Gateway gateway = _deployGateway(signers);
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ gateway.revokeSigner(bob);
+ }
+
+ function test_revokeSigner_revertNotApproved() public {
+ address[] memory signers = new address[](1);
+ signers[0] = alice;
+ Gateway gateway = _deployGateway(signers);
+
+ vm.expectRevert(abi.encodeWithSelector(Errors.SignerAlreadyNotApproved.selector, bob));
+ gateway.revokeSigner(bob);
+ }
+
+ function test_revokeSigner_shouldRevoke() public {
+ address[] memory signers = new address[](1);
+ signers[0] = bob;
+ Gateway gateway = _deployGateway(signers);
+
+ gateway.revokeSigner(bob);
+ assertFalse(gateway.approvedSigners(bob));
+ }
+
+ // ============ callFactory ============
+
+ function test_callFactory_revertNotOwner() public {
+ address[] memory signers = new address[](1);
+ signers[0] = alice;
+ Gateway gateway = _deployGateway(signers);
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.OwnableUnauthorizedAccount.selector, alice));
+ gateway.callFactory(abi.encodeCall(IdFactory.addTokenFactory, (address(0))));
+ }
+
+ function test_callFactory_revertFactoryError() public {
+ address[] memory signers = new address[](1);
+ signers[0] = alice;
+ Gateway gateway = _deployGateway(signers);
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ vm.expectRevert(Errors.CallToFactoryFailed.selector);
+ gateway.callFactory(abi.encodeCall(IdFactory.addTokenFactory, (address(0))));
+ }
+
+ function test_callFactory_shouldExecute() public {
+ address[] memory signers = new address[](1);
+ signers[0] = alice;
+ Gateway gateway = _deployGateway(signers);
+ vm.prank(deployer);
+ setup.idFactory.transferOwnership(address(gateway));
+
+ gateway.callFactory(abi.encodeCall(IdFactory.addTokenFactory, (bob)));
+ assertTrue(setup.idFactory.isTokenFactory(bob));
+ }
+
+}
diff --git a/test/gateway/gateway.test.ts b/test/gateway/gateway.test.ts
deleted file mode 100644
index 39982ff1..00000000
--- a/test/gateway/gateway.test.ts
+++ /dev/null
@@ -1,831 +0,0 @@
-import {ethers} from "hardhat";
-import {expect} from "chai";
-import {loadFixture} from "@nomicfoundation/hardhat-network-helpers";
-import {deployFactoryFixture} from "../fixtures";
-import {BigNumber} from "ethers";
-
-describe('Gateway', () => {
- describe('constructor', () => {
- describe('when factory address is not specified', () => {
- it('should revert', async () => {
- await expect(ethers.deployContract('Gateway', [ethers.constants.AddressZero, []])).to.be.reverted;
- });
- });
-
- describe('when specifying more than 10 signer', () => {
- it('should revert', async () => {
- const {identityFactory, carolWallet} = await loadFixture(deployFactoryFixture);
- await expect(ethers.deployContract('Gateway', [identityFactory.address, Array(11).fill(ethers.constants.AddressZero)])).to.be.reverted;
- });
- });
- });
-
- describe('.deployIdentityWithSalt()', () => {
- describe('when input address is the zero address', () => {
- it('should revert', async () => {
- const {identityFactory, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
-
- await expect(gateway.deployIdentityWithSalt(ethers.constants.AddressZero, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60), ethers.utils.randomBytes(65))).to.be.reverted;
- });
- });
-
- describe('when signature is not valid', () => {
- it('should revert with UnsignedDeployment', async () => {
- const {identityFactory, aliceWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
-
- await expect(gateway.deployIdentityWithSalt(aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60), ethers.utils.randomBytes(65))).to.be.reverted;
- });
- });
-
- describe('when signature is signed by a non authorized signer', () => {
- it('should revert with UnsignedDeployment', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
-
- await expect(
- gateway.deployIdentityWithSalt(
- aliceWallet.address,
- 'saltToUse',
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60),
- bobWallet.signMessage(
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['string', 'address', 'string', 'uint256'], ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)])),
- ),
- ),
- ).to.be.revertedWithCustomError(gateway, 'UnapprovedSigner');
- });
- });
-
- describe('when signature is correct and signed by an authorized signer', () => {
- it('should deploy the identity', async () => {
- const {identityFactory, aliceWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- const tx = await gateway.deployIdentityWithSalt(
- aliceWallet.address,
- 'saltToUse',
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60),
- signature,
- );
- await expect(tx).to.emit(identityFactory, "WalletLinked").withArgs(aliceWallet.address, await identityFactory.getIdentity(aliceWallet.address));
- await expect(tx).to.emit(identityFactory, "Deployed").withArgs(await identityFactory.getIdentity(aliceWallet.address));
- const identityAddress = await identityFactory.getIdentity(aliceWallet.address);
- const identity = await ethers.getContractAt('Identity', identityAddress);
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1)).to.be.true;
- });
- });
-
- describe('when signature is correct with no expiry', () => {
- it('should deploy the identity', async () => {
- const {identityFactory, aliceWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', 0],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- const tx = await gateway.deployIdentityWithSalt(
- aliceWallet.address,
- 'saltToUse',
- 0,
- signature,
- );
- await expect(tx).to.emit(identityFactory, "WalletLinked").withArgs(aliceWallet.address, await identityFactory.getIdentity(aliceWallet.address));
- await expect(tx).to.emit(identityFactory, "Deployed").withArgs(await identityFactory.getIdentity(aliceWallet.address));
- const identityAddress = await identityFactory.getIdentity(aliceWallet.address);
- const identity = await ethers.getContractAt('Identity', identityAddress);
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1)).to.be.true;
- });
- });
-
- describe('when signature is correct and signed by an authorized signer, but revoked', () => {
- it('should revert', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await gateway.revokeSignature(signature);
-
- await expect(gateway.deployIdentityWithSalt(
- aliceWallet.address,
- 'saltToUse',
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60),
- signature,
- )).to.be.revertedWithCustomError(gateway, 'RevokedSignature');
- });
- });
-
- describe('when signature is correct and signed by an authorized signer, but has expired', () => {
- it('should revert', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).sub(2 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await gateway.revokeSignature(signature);
-
- await expect(gateway.deployIdentityWithSalt(
- aliceWallet.address,
- 'saltToUse',
- BigNumber.from(new Date().getTime()).div(1000).sub(2 * 24 * 60 * 60),
- signature,
- )).to.be.revertedWithCustomError(gateway, 'ExpiredSignature');
- });
- });
- });
-
- describe('.deployIdentityWithSaltAndManagementKeys', () => {
- describe('when input address is the zero address', () => {
- it('should revert', async () => {
- const {identityFactory, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
-
- await expect(gateway.deployIdentityWithSaltAndManagementKeys(ethers.constants.AddressZero, 'saltToUse', [], BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60), ethers.utils.randomBytes(65))).to.be.reverted;
- });
- });
-
- describe('when signature is not valid', () => {
- it('should revert with UnsignedDeployment', async () => {
- const {identityFactory, aliceWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
-
- await expect(gateway.deployIdentityWithSaltAndManagementKeys(aliceWallet.address, 'saltToUse', [], BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60), ethers.utils.randomBytes(65))).to.be.reverted;
- });
- });
-
- describe('when signature is signed by a non authorized signer', () => {
- it('should revert with UnsignedDeployment', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
-
- await expect(
- gateway.deployIdentityWithSaltAndManagementKeys(
- aliceWallet.address,
- 'saltToUse',
- [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ],
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60),
- bobWallet.signMessage(
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'bytes32[]', 'uint256'],
- [
- 'Authorize ONCHAINID deployment',
- aliceWallet.address,
- 'saltToUse',
- [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ],
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)
- ],
- )),
- ),
- ),
- ).to.be.revertedWithCustomError(gateway, 'UnapprovedSigner');
- });
- });
-
- describe('when signature is correct and signed by an authorized signer', () => {
- it('should deploy the identity', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'bytes32[]', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ], BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- const tx = await gateway.deployIdentityWithSaltAndManagementKeys(
- aliceWallet.address,
- 'saltToUse',
- [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ],
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60),
- signature,
- );
- await expect(tx).to.emit(identityFactory, "WalletLinked").withArgs(aliceWallet.address, await identityFactory.getIdentity(aliceWallet.address));
- await expect(tx).to.emit(identityFactory, "Deployed").withArgs(await identityFactory.getIdentity(aliceWallet.address));
- const identityAddress = await identityFactory.getIdentity(aliceWallet.address);
- const identity = await ethers.getContractAt('Identity', identityAddress);
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1)).to.be.false;
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])), 1)).to.be.true;
- });
- });
-
- describe('when signature is correct with no expiry', () => {
- it('should deploy the identity', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'bytes32[]', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ], 0],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- const tx = await gateway.deployIdentityWithSaltAndManagementKeys(
- aliceWallet.address,
- 'saltToUse',
- [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ],
- 0,
- signature,
- );
- await expect(tx).to.emit(identityFactory, "WalletLinked").withArgs(aliceWallet.address, await identityFactory.getIdentity(aliceWallet.address));
- await expect(tx).to.emit(identityFactory, "Deployed").withArgs(await identityFactory.getIdentity(aliceWallet.address));
- const identityAddress = await identityFactory.getIdentity(aliceWallet.address);
- const identity = await ethers.getContractAt('Identity', identityAddress);
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1)).to.be.false;
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])), 1)).to.be.true;
- });
- });
-
- describe('when signature is correct and signed by an authorized signer, but revoked', () => {
- it('should revert', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'bytes32[]', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ], BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await gateway.revokeSignature(signature);
-
- await expect(gateway.deployIdentityWithSaltAndManagementKeys(
- aliceWallet.address,
- 'saltToUse',
- [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ],
- BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60),
- signature,
- )).to.be.revertedWithCustomError(gateway, 'RevokedSignature');
- });
- });
-
- describe('when signature is correct and signed by an authorized signer, but has expired', () => {
- it('should revert', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'bytes32[]', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ], BigNumber.from(new Date().getTime()).div(1000).sub(2 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await gateway.revokeSignature(signature);
-
- await expect(gateway.deployIdentityWithSaltAndManagementKeys(
- aliceWallet.address,
- 'saltToUse',
- [
- ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])),
- ],
- BigNumber.from(new Date().getTime()).div(1000).sub(2 * 24 * 60 * 60),
- signature,
- )).to.be.revertedWithCustomError(gateway, 'ExpiredSignature');
- });
- });
- });
-
- describe('deployIdentityForWallet', () => {
- describe('when input address is the zero address', () => {
- it('should revert', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
- await expect(gateway.deployIdentityForWallet(ethers.constants.AddressZero)).to.revertedWithCustomError(gateway, 'ZeroAddress');
- });
- });
-
- describe('when sender is not the desired identity owner', () => {
- it('should deploy the identity for the identity owner', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const tx = await gateway.connect(bobWallet).deployIdentityForWallet(aliceWallet.address);
-
- await expect(tx).to.emit(identityFactory, "WalletLinked").withArgs(aliceWallet.address, await identityFactory.getIdentity(aliceWallet.address));
- await expect(tx).to.emit(identityFactory, "Deployed").withArgs(await identityFactory.getIdentity(aliceWallet.address));
- const identityAddress = await identityFactory.getIdentity(aliceWallet.address);
- const identity = await ethers.getContractAt('Identity', identityAddress);
-
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1)).to.be.true;
- });
- });
-
- describe('when an identity was not yet deployed for this walet', () => {
- it('should deploy the identity', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
- const tx = await gateway.connect(aliceWallet).deployIdentityForWallet(aliceWallet.address);
-
- await expect(tx).to.emit(identityFactory, "WalletLinked").withArgs(aliceWallet.address, await identityFactory.getIdentity(aliceWallet.address));
- await expect(tx).to.emit(identityFactory, "Deployed").withArgs(await identityFactory.getIdentity(aliceWallet.address));
- const identityAddress = await identityFactory.getIdentity(aliceWallet.address);
- const identity = await ethers.getContractAt('Identity', identityAddress);
-
- expect(await identity.keyHasPurpose(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])), 1)).to.be.true;
- });
- });
-
- describe('when an identity was already deployed for this wallet as salt with the factory', () => {
- it('should revert because factory reverts', async () => {
- const {identityFactory, aliceWallet, bobWallet, carolWallet} = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await gateway.connect(aliceWallet).deployIdentityForWallet(aliceWallet.address);
-
- await expect(gateway.connect(aliceWallet).deployIdentityForWallet(aliceWallet.address)).to.be.revertedWith('salt already taken');
- });
- });
- });
-
- describe('.transferFactoryOwnership', () => {
- describe('when called by the owner', () => {
- it('should transfer ownership of the factory to the specified address', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.transferFactoryOwnership(bobWallet.address)).to.emit(identityFactory, "OwnershipTransferred").withArgs(gateway.address, bobWallet.address);
- expect(await identityFactory.owner()).to.be.equal(bobWallet.address);
- });
- });
-
- describe('when not called by the owner', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.connect(aliceWallet).transferFactoryOwnership(bobWallet.address)).to.be.revertedWith('Ownable: caller is not the owner')
- });
- });
- });
-
- describe('.revokeSignature', () => {
- describe('when calling not as owner', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await expect(gateway.connect(aliceWallet).revokeSignature(signature)).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when signature was already revoked', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await gateway.revokeSignature(signature);
-
- await expect(gateway.revokeSignature(signature)).to.be.revertedWithCustomError(gateway, 'SignatureAlreadyRevoked');
- });
- })
- });
-
- describe('.approveSignature', () => {
- describe('when calling not as owner', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await expect(gateway.connect(aliceWallet).approveSignature(signature)).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when signature is not revoked', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await expect(gateway.approveSignature(signature)).to.be.revertedWithCustomError(gateway, 'SignatureNotRevoked');
- });
- });
-
- describe('when signature is revoked', () => {
- it('should approve the signature', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const digest =
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(
- ['string', 'address', 'string', 'uint256'],
- ['Authorize ONCHAINID deployment', aliceWallet.address, 'saltToUse', BigNumber.from(new Date().getTime()).div(1000).add(365 * 24 * 60 * 60)],
- ),
- );
- const signature = await carolWallet.signMessage(
- ethers.utils.arrayify(
- digest,
- ),
- );
-
- await gateway.revokeSignature(signature);
-
- const tx = await gateway.approveSignature(signature);
-
- expect(tx).to.emit(gateway, "SignatureApproved").withArgs(signature);
- });
- });
- });
-
- describe('.approveSigner', () => {
- describe('when signer address is zero', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.approveSigner(ethers.constants.AddressZero)).to.be.revertedWithCustomError(gateway, 'ZeroAddress');
- });
- });
-
- describe('when calling not as owner', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.connect(aliceWallet).approveSigner(bobWallet.address)).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when signer is already approved', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await gateway.approveSigner(bobWallet.address);
-
- await expect(gateway.approveSigner(bobWallet.address)).to.be.revertedWithCustomError(gateway, 'SignerAlreadyApproved');
- });
- });
-
- describe('when signer is not approved', () => {
- it('should approve the signer', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [carolWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const tx = await gateway.approveSigner(bobWallet.address);
-
- expect(tx).to.emit(gateway, "SignerApproved").withArgs(bobWallet.address);
- });
- });
- });
-
- describe('.revokeSigner', () => {
- describe('when signer address is zero', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
-
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [aliceWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.revokeSigner(ethers.constants.AddressZero)).to.be.revertedWithCustomError(gateway, 'ZeroAddress');
- });
- });
-
- describe('when calling not as owner', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [bobWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.connect(aliceWallet).revokeSigner(bobWallet.address)).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when signer is not approved', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
-
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [aliceWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.revokeSigner(bobWallet.address)).to.be.revertedWithCustomError(gateway, 'SignerAlreadyNotApproved');
- });
- });
-
- describe('when signer is approved', () => {
- it('should revoke the signer', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
-
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [bobWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const tx = await gateway.revokeSigner(bobWallet.address);
-
- expect(tx).to.emit(gateway, "SignerRevoked").withArgs(bobWallet.address);
- });
- });
- });
-
- describe('.callFactory', () => {
- describe('when not calling as the owner', () => {
- it('should revert', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
-
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [aliceWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.connect(aliceWallet).callFactory(
- new ethers.utils.Interface(['function addTokenFactory(address)']).encodeFunctionData('addTokenFactory', [ethers.constants.AddressZero]))
- ).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when calling as the owner with invalid parameters', () => {
- it('should revert for Factory error', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- carolWallet
- } = await loadFixture(deployFactoryFixture);
-
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [aliceWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- await expect(gateway.connect(deployerWallet).callFactory(
- new ethers.utils.Interface(['function addTokenFactory(address)']).encodeFunctionData('addTokenFactory', [ethers.constants.AddressZero]))
- ).to.be.revertedWith('Gateway: call to factory failed');
- });
- });
-
- describe('when calling as the owner with correct parameters', () => {
- it('should execute the function call', async () => {
- const {
- identityFactory,
- deployerWallet,
- aliceWallet,
- bobWallet,
- } = await loadFixture(deployFactoryFixture);
-
- const gateway = await ethers.deployContract('Gateway', [identityFactory.address, [aliceWallet.address]]);
- await identityFactory.transferOwnership(gateway.address);
-
- const tx = await gateway.connect(deployerWallet).callFactory(new ethers.utils.Interface(['function addTokenFactory(address)']).encodeFunctionData('addTokenFactory', [bobWallet.address]));
-
- expect(tx).to.emit(identityFactory, "TokenFactoryAdded").withArgs(bobWallet.address);
- });
- });
- });
-});
diff --git a/test/helpers/ClaimIssuerHelper.sol b/test/helpers/ClaimIssuerHelper.sol
new file mode 100644
index 00000000..4885c464
--- /dev/null
+++ b/test/helpers/ClaimIssuerHelper.sol
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+import { ClaimIssuer } from "contracts/ClaimIssuer.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+
+/// @notice Helper library for deploying ClaimIssuer contracts with proxy
+library ClaimIssuerHelper {
+
+ /// @notice Deploys a ClaimIssuer behind an ERC1967Proxy
+ /// @param initialManagementKey The management key for the claim issuer
+ /// @return claimIssuer The ClaimIssuer contract at the proxy address
+ function deployWithProxy(address initialManagementKey) internal returns (ClaimIssuer) {
+ ClaimIssuer impl = new ClaimIssuer(initialManagementKey);
+ ERC1967Proxy proxy = new ERC1967Proxy(
+ address(impl), abi.encodeCall(ClaimIssuer.initialize, (initialManagementKey, IdentityTypes.CLAIM_ISSUER))
+ );
+ return ClaimIssuer(address(proxy));
+ }
+
+}
diff --git a/test/helpers/ClaimSignerHelper.sol b/test/helpers/ClaimSignerHelper.sol
new file mode 100644
index 00000000..d2092e47
--- /dev/null
+++ b/test/helpers/ClaimSignerHelper.sol
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { Vm } from "forge-std/Vm.sol";
+
+/// @notice Helper library for building and signing claims in tests
+/// @dev Centralizes the EIP-191 signature logic used across many test files
+library ClaimSignerHelper {
+
+ struct Claim {
+ address identity;
+ address issuer;
+ uint256 topic;
+ uint256 scheme;
+ bytes data;
+ bytes signature;
+ string uri;
+ bytes32 id;
+ }
+
+ Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
+
+ /// @notice Computes claim ID from issuer and topic
+ function computeClaimId(address issuer, uint256 topic) internal pure returns (bytes32) {
+ return keccak256(abi.encode(issuer, topic));
+ }
+
+ /// @notice Computes the key hash for an address (used in addKey / keyHasPurpose)
+ function addressToKey(address addr) internal pure returns (bytes32) {
+ return keccak256(abi.encode(addr));
+ }
+
+ /// @notice Signs a claim using EIP-191 format matching the Identity contract
+ /// @param signerPk The private key of the signer
+ /// @param identity The identity address the claim is for
+ /// @param topic The claim topic
+ /// @param data The claim data
+ /// @return signature The EIP-191 signature (r, s, v packed)
+ function signClaim(uint256 signerPk, address identity, uint256 topic, bytes memory data)
+ internal
+ pure
+ returns (bytes memory)
+ {
+ bytes32 dataHash = keccak256(abi.encode(identity, topic, data));
+ bytes32 ethSignedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", dataHash));
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, ethSignedHash);
+ return abi.encodePacked(r, s, v);
+ }
+
+ /// @notice Builds a complete Claim struct with computed id and signature
+ function buildClaim(
+ uint256 signerPk,
+ address identityAddr,
+ address issuerAddr,
+ uint256 topic,
+ bytes memory data,
+ string memory uri
+ ) internal pure returns (Claim memory claim) {
+ claim.identity = identityAddr;
+ claim.issuer = issuerAddr;
+ claim.topic = topic;
+ claim.scheme = 1;
+ claim.data = data;
+ claim.uri = uri;
+ claim.id = computeClaimId(issuerAddr, topic);
+ claim.signature = signClaim(signerPk, identityAddr, topic, data);
+ }
+
+}
diff --git a/test/helpers/IdentityHelper.sol b/test/helpers/IdentityHelper.sol
new file mode 100644
index 00000000..2594d3ee
--- /dev/null
+++ b/test/helpers/IdentityHelper.sol
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { Identity } from "contracts/Identity.sol";
+import { IdFactory } from "contracts/factory/IdFactory.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+import { IdentityProxy } from "contracts/proxy/IdentityProxy.sol";
+import { ImplementationAuthority } from "contracts/proxy/ImplementationAuthority.sol";
+
+/// @notice Helper library for deploying OnchainID Identity Factory infrastructure
+library IdentityHelper {
+
+ struct OnchainIDSetup {
+ Identity identityImplementation;
+ ImplementationAuthority implementationAuthority;
+ IdFactory idFactory;
+ }
+
+ /// @notice Deploys complete Identity Factory infrastructure
+ /// @param managementKey The initial management key address
+ /// @return setup Struct containing all deployed contracts
+ function deployFactory(address managementKey) internal returns (OnchainIDSetup memory setup) {
+ setup.identityImplementation = new Identity(managementKey, false);
+ setup.implementationAuthority = new ImplementationAuthority(address(setup.identityImplementation));
+ setup.idFactory = new IdFactory(address(setup.implementationAuthority));
+ }
+
+ /// @notice Deploys an Identity through the custom IdentityProxy pattern
+ /// @param initialManagementKey The management key for the identity
+ /// @return identity The Identity contract at the proxy address
+ function deployIdentityWithProxy(address initialManagementKey) internal returns (Identity) {
+ return deployIdentityWithProxy(initialManagementKey, IdentityTypes.INDIVIDUAL);
+ }
+
+ function deployIdentityWithProxy(address initialManagementKey, uint256 identityType) internal returns (Identity) {
+ Identity impl = new Identity(initialManagementKey, false);
+ ImplementationAuthority ia = new ImplementationAuthority(address(impl));
+ IdentityProxy proxy = new IdentityProxy(address(ia), initialManagementKey, identityType);
+ return Identity(address(proxy));
+ }
+
+}
diff --git a/test/helpers/OnchainIDSetup.sol b/test/helpers/OnchainIDSetup.sol
new file mode 100644
index 00000000..91240989
--- /dev/null
+++ b/test/helpers/OnchainIDSetup.sol
@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { Constants } from "../utils/Constants.sol";
+import { ClaimIssuerHelper } from "./ClaimIssuerHelper.sol";
+import { ClaimSignerHelper } from "./ClaimSignerHelper.sol";
+import { IdentityHelper } from "./IdentityHelper.sol";
+import { ClaimIssuer } from "contracts/ClaimIssuer.sol";
+import { Identity } from "contracts/Identity.sol";
+import { IdFactory } from "contracts/factory/IdFactory.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+import { ImplementationAuthority } from "contracts/proxy/ImplementationAuthority.sol";
+import { Test } from "forge-std/Test.sol";
+
+/// @notice Base test contract providing full OnchainID infrastructure
+contract OnchainIDSetup is Test {
+
+ // Infrastructure
+ IdentityHelper.OnchainIDSetup public onchainidSetup;
+
+ // Standard test addresses with private keys
+ address public deployer;
+ uint256 public deployerPk;
+
+ address public claimIssuerOwner;
+ uint256 public claimIssuerOwnerPk;
+
+ address public alice;
+ uint256 public alicePk;
+
+ address public bob;
+ uint256 public bobPk;
+
+ address public carol;
+ uint256 public carolPk;
+
+ address public david;
+ uint256 public davidPk;
+
+ address public tokenOwner;
+ uint256 public tokenOwnerPk;
+
+ // Deployed identities
+ Identity public aliceIdentity;
+ Identity public bobIdentity;
+ ClaimIssuer public claimIssuer;
+
+ // Pre-built claim
+ ClaimSignerHelper.Claim public aliceClaim666;
+
+ function setUp() public virtual {
+ // Create labeled addresses with known private keys
+ (deployer, deployerPk) = makeAddrAndKey("deployer");
+ (claimIssuerOwner, claimIssuerOwnerPk) = makeAddrAndKey("claimIssuerOwner");
+ (alice, alicePk) = makeAddrAndKey("alice");
+ (bob, bobPk) = makeAddrAndKey("bob");
+ (carol, carolPk) = makeAddrAndKey("carol");
+ (david, davidPk) = makeAddrAndKey("david");
+ (tokenOwner, tokenOwnerPk) = makeAddrAndKey("tokenOwner");
+
+ // Deploy factory infrastructure (as deployer)
+ vm.startPrank(deployer);
+ onchainidSetup = IdentityHelper.deployFactory(deployer);
+ vm.stopPrank();
+
+ // Deploy ClaimIssuer with proxy
+ claimIssuer = ClaimIssuerHelper.deployWithProxy(claimIssuerOwner);
+
+ // Add CLAIM_SIGNER key to ClaimIssuer
+ vm.prank(claimIssuerOwner);
+ claimIssuer.addKey(ClaimSignerHelper.addressToKey(claimIssuerOwner), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Create alice identity via factory
+ vm.prank(deployer);
+ address aliceIdentityAddr =
+ onchainidSetup.idFactory.createIdentity(alice, "alice", IdentityTypes.INDIVIDUAL, new address[](0));
+ aliceIdentity = Identity(aliceIdentityAddr);
+
+ // Add carol as CLAIM_SIGNER and david as ACTION key on alice's identity
+ vm.startPrank(alice);
+ aliceIdentity.addKey(ClaimSignerHelper.addressToKey(carol), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+ aliceIdentity.addKey(ClaimSignerHelper.addressToKey(david), KeyPurposes.ACTION, KeyTypes.ECDSA);
+ vm.stopPrank();
+
+ // Build and add alice's claim 666
+ aliceClaim666 = ClaimSignerHelper.buildClaim(
+ claimIssuerOwnerPk,
+ address(aliceIdentity),
+ address(claimIssuer),
+ Constants.CLAIM_TOPIC_666,
+ hex"0042",
+ "https://example.com"
+ );
+
+ vm.prank(alice);
+ aliceIdentity.addClaim(
+ aliceClaim666.topic,
+ aliceClaim666.scheme,
+ aliceClaim666.issuer,
+ aliceClaim666.signature,
+ aliceClaim666.data,
+ aliceClaim666.uri
+ );
+
+ // Create bob identity via factory
+ vm.prank(deployer);
+ address bobIdentityAddr =
+ onchainidSetup.idFactory.createIdentity(bob, "bob", IdentityTypes.INDIVIDUAL, new address[](0));
+ bobIdentity = Identity(bobIdentityAddr);
+
+ // Create token identity
+ vm.prank(deployer);
+ onchainidSetup.idFactory
+ .createTokenIdentity(Constants.TOKEN_ADDRESS, tokenOwner, "tokenOwner", new address[](0));
+ }
+
+ // ---- Convenience getters ----
+
+ function getIdFactory() public view returns (IdFactory) {
+ return onchainidSetup.idFactory;
+ }
+
+ function getImplementationAuthority() public view returns (ImplementationAuthority) {
+ return onchainidSetup.implementationAuthority;
+ }
+
+ function getIdentityImplementation() public view returns (Identity) {
+ return onchainidSetup.identityImplementation;
+ }
+
+}
diff --git a/test/identities/Claims.t.sol b/test/identities/Claims.t.sol
new file mode 100644
index 00000000..adbb28b0
--- /dev/null
+++ b/test/identities/Claims.t.sol
@@ -0,0 +1,476 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { Constants } from "../utils/Constants.sol";
+import { ClaimIssuer } from "contracts/ClaimIssuer.sol";
+import { Identity } from "contracts/Identity.sol";
+import { IERC734 } from "contracts/interface/IERC734.sol";
+import { IERC735 } from "contracts/interface/IERC735.sol";
+import { IIdentity } from "contracts/interface/IIdentity.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+
+/// @notice Test suite for claim management functionality (addClaim, removeClaim, getClaim, getClaimIdsByTopic)
+contract ClaimsTest is OnchainIDSetup {
+
+ // ============ addClaim - Self-Attested (issuer = identity) ============
+
+ /// @notice When claim is self-attested but signature is invalid, should revert
+ function test_addClaim_selfAttested_invalidClaim_shouldRevert() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Sign with wrong data (0x101010 instead of 0x0042)
+ bytes memory wrongSignature = ClaimSignerHelper.signClaim(
+ alicePk,
+ address(aliceIdentity),
+ topic,
+ hex"101010" // wrong signature because this data is not the hex"0042" as data variable above
+ );
+
+ // Should revert because claim validation now applies to all claims
+ vm.expectRevert(Errors.InvalidClaim.selector);
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(aliceIdentity), wrongSignature, data, uri);
+ }
+
+ /// @notice Self-attested valid claim via execute/approve pattern
+ function test_addClaim_selfAttested_valid_viaExecute() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Sign claim correctly
+ bytes memory signature = ClaimSignerHelper.signClaim(alicePk, address(aliceIdentity), topic, data);
+
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(aliceIdentity), topic);
+
+ // Encode addClaim call
+ bytes memory actionData = abi.encodeCall(
+ Identity.addClaim, (topic, Constants.CLAIM_SCHEME, address(aliceIdentity), signature, data, uri)
+ );
+
+ // Bob (ACTION key) executes
+ vm.prank(bob);
+ uint256 executionId = aliceIdentity.execute(address(aliceIdentity), 0, actionData);
+
+ // Expect all three events in order: Approved, ClaimAdded, Executed
+ vm.expectEmit(true, false, false, true, address(aliceIdentity));
+ emit IERC734.Approved(executionId, true);
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC735.ClaimAdded(claimId, topic, Constants.CLAIM_SCHEME, address(aliceIdentity), signature, data, uri);
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC734.Executed(executionId, address(aliceIdentity), 0, actionData);
+
+ // Alice (MANAGEMENT) approves
+ vm.prank(alice);
+ aliceIdentity.approve(executionId, true);
+
+ // Verify claim is valid
+ bool isValid = aliceIdentity.isClaimValid(IIdentity(address(aliceIdentity)), topic, signature, data);
+ assertTrue(isValid, "Claim should be valid");
+ }
+
+ /// @notice When caller is not a CLAIM key, should revert
+ function test_addClaim_selfAttested_notClaimKey_shouldRevert() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Sign claim
+ bytes memory signature = ClaimSignerHelper.signClaim(alicePk, address(aliceIdentity), topic, data);
+
+ // Bob (no CLAIM_SIGNER key) tries to add claim
+ vm.prank(bob);
+ vm.expectRevert(Errors.SenderDoesNotHaveClaimSignerKey.selector);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(aliceIdentity), signature, data, uri);
+ }
+
+ // ============ addClaim - From Claim Issuer ============
+
+ /// @notice When claim is from claim issuer but signature is invalid, should revert
+ function test_addClaim_claimIssuer_invalidClaim_shouldRevert() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Sign with wrong data (0x10101010 instead of 0x0042)
+ bytes memory wrongSignature = ClaimSignerHelper.signClaim(
+ claimIssuerOwnerPk,
+ address(aliceIdentity),
+ topic,
+ hex"10101010" // wrong signature because this data is not the hex"0042" as data variable above
+ );
+
+ // Try to add claim
+ vm.prank(alice);
+ vm.expectRevert(Errors.InvalidClaim.selector);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), wrongSignature, data, uri);
+ }
+
+ /// @notice Claim from claim issuer via execute/approve pattern
+ function test_addClaim_claimIssuer_valid_viaExecute() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Sign claim correctly
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+
+ // Encode addClaim call
+ bytes memory actionData = abi.encodeCall(
+ Identity.addClaim, (topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri)
+ );
+
+ // Bob (ACTION key) executes
+ vm.prank(bob);
+ uint256 executionId = aliceIdentity.execute(address(aliceIdentity), 0, actionData);
+
+ // Expect all three events in order: Approved, ClaimAdded, Executed
+ vm.expectEmit(true, false, false, true, address(aliceIdentity));
+ emit IERC734.Approved(executionId, true);
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC735.ClaimAdded(claimId, topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC734.Executed(executionId, address(aliceIdentity), 0, actionData);
+
+ // Alice (MANAGEMENT) approves
+ vm.prank(alice);
+ aliceIdentity.approve(executionId, true);
+ }
+
+ /// @notice When caller is not a CLAIM key (with claim issuer), should revert
+ function test_addClaim_claimIssuer_notClaimKey_shouldRevert() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Sign claim
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ // Bob (no CLAIM_SIGNER key) tries to add claim
+ vm.prank(bob);
+ vm.expectRevert(Errors.SenderDoesNotHaveClaimSignerKey.selector);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+ }
+
+ // ============ updateClaim (addClaim on existing claim) ============
+
+ /// @notice When claim already exists for issuer+topic, should emit ClaimChanged
+ function test_updateClaim_shouldReplaceExistingClaim() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory initialData = hex"0042";
+ bytes memory updatedData = hex"004200101010";
+ string memory uri = "https://example.com";
+
+ // Add initial claim
+ bytes memory initialSignature =
+ ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, initialData);
+
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), initialSignature, initialData, uri);
+
+ // Update claim with different data
+ bytes memory updatedSignature =
+ ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, updatedData);
+
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+
+ // Expect ClaimChanged event
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC735.ClaimChanged(
+ claimId, topic, Constants.CLAIM_SCHEME, address(claimIssuer), updatedSignature, updatedData, uri
+ );
+
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), updatedSignature, updatedData, uri);
+ }
+
+ // ============ removeClaim ============
+
+ /// @notice Remove claim via execute/approve pattern
+ function test_removeClaim_viaExecute_shouldRemoveClaim() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Add claim first
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+
+ // Encode removeClaim call
+ bytes memory actionData = abi.encodeCall(Identity.removeClaim, (claimId));
+
+ // Bob (ACTION key) executes
+ vm.prank(bob);
+ uint256 executionId = aliceIdentity.execute(address(aliceIdentity), 0, actionData);
+
+ // Expect ClaimRemoved event
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC735.ClaimRemoved(claimId, topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+
+ // Alice (MANAGEMENT) approves
+ vm.prank(alice);
+ aliceIdentity.approve(executionId, true);
+ }
+
+ /// @notice When caller is not a CLAIM key, removeClaim should revert
+ function test_removeClaim_notClaimKey_shouldRevert() public {
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), Constants.CLAIM_TOPIC_42);
+
+ // Bob (no CLAIM_SIGNER key) tries to remove claim
+ vm.prank(bob);
+ vm.expectRevert(Errors.SenderDoesNotHaveClaimSignerKey.selector);
+ aliceIdentity.removeClaim(claimId);
+ }
+
+ /// @notice When claim does not exist, should revert
+ function test_removeClaim_nonExistentClaim_shouldRevert() public {
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), Constants.CLAIM_TOPIC_42);
+
+ // Carol (CLAIM_SIGNER) tries to remove non-existent claim
+ vm.prank(carol);
+ vm.expectRevert(abi.encodeWithSelector(Errors.ClaimNotRegistered.selector, claimId));
+ aliceIdentity.removeClaim(claimId);
+ }
+
+ /// @notice When claim exists, should remove successfully
+ function test_removeClaim_existingClaim_shouldRemove() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ // Add claim first
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+
+ // Expect ClaimRemoved event
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC735.ClaimRemoved(claimId, topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+
+ // Alice removes claim
+ vm.prank(alice);
+ aliceIdentity.removeClaim(claimId);
+ }
+
+ // ============ removeClaim Edge Cases ============
+
+ /// @notice Removing the middle claim from multiple claims on the same topic
+ function test_removeClaim_middleClaim_shouldRemoveCorrectly() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+
+ // Create second claim issuer
+ ClaimIssuer claimIssuer2 = new ClaimIssuer(alice);
+ vm.prank(alice);
+ claimIssuer2.addKey(ClaimSignerHelper.addressToKey(alice), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Add three claims with different issuers, same topic
+ address[3] memory issuers = [
+ address(claimIssuer),
+ address(claimIssuer2),
+ address(aliceIdentity) // Self-attested
+ ];
+ bytes32[3] memory claimIds;
+
+ for (uint256 i = 0; i < 3; i++) {
+ bytes memory data = abi.encodePacked(hex"0040", uint8(i));
+ string memory uri = string(abi.encodePacked("https://example", vm.toString(i), ".com"));
+
+ bytes memory signature;
+ if (i == 0) {
+ signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+ } else {
+ signature = ClaimSignerHelper.signClaim(alicePk, address(aliceIdentity), topic, data);
+ }
+
+ claimIds[i] = ClaimSignerHelper.computeClaimId(issuers[i], topic);
+
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, issuers[i], signature, data, uri);
+ }
+
+ // Verify all claims are added
+ bytes32[] memory claimIdsByTopic = aliceIdentity.getClaimIdsByTopic(topic);
+ assertEq(claimIdsByTopic.length, 3, "Should have 3 claims");
+
+ // Remove middle claim
+ vm.prank(alice);
+ aliceIdentity.removeClaim(claimIds[1]);
+
+ // Verify remaining claims
+ bytes32[] memory remainingClaimIds = aliceIdentity.getClaimIdsByTopic(topic);
+ assertEq(remainingClaimIds.length, 2, "Should have 2 claims remaining");
+
+ // Check that claims 0 and 2 are still present
+ bool hasFirst = false;
+ bool hasThird = false;
+ for (uint256 i = 0; i < remainingClaimIds.length; i++) {
+ if (remainingClaimIds[i] == claimIds[0]) hasFirst = true;
+ if (remainingClaimIds[i] == claimIds[2]) hasThird = true;
+ }
+ assertTrue(hasFirst, "First claim should still exist");
+ assertTrue(hasThird, "Third claim should still exist");
+
+ // Verify removed claim no longer exists
+ (uint256 retTopic,, address retIssuer,,,) = aliceIdentity.getClaim(claimIds[1]);
+ assertEq(retTopic, 0, "Removed claim topic should be 0");
+ assertEq(retIssuer, address(0), "Removed claim issuer should be zero address");
+ }
+
+ // ============ getClaim ============
+
+ /// @notice When claim does not exist, should return empty struct
+ function test_getClaim_nonExistent_shouldReturnEmpty() public {
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), Constants.CLAIM_TOPIC_42);
+
+ (uint256 topic, uint256 scheme, address issuer, bytes memory signature, bytes memory data, string memory uri) =
+ aliceIdentity.getClaim(claimId);
+
+ assertEq(topic, 0, "Topic should be 0");
+ assertEq(scheme, 0, "Scheme should be 0");
+ assertEq(issuer, address(0), "Issuer should be zero address");
+ assertEq(signature, hex"", "Signature should be empty");
+ assertEq(data, hex"", "Data should be empty");
+ assertEq(bytes(uri).length, 0, "URI should be empty");
+ }
+
+ /// @notice When claim exists, should return correct data
+ function test_getClaim_existing_shouldReturnData() public {
+ // Use the pre-built aliceClaim666 from setup
+ (uint256 topic, uint256 scheme, address issuer, bytes memory signature, bytes memory data, string memory uri) =
+ aliceIdentity.getClaim(aliceClaim666.id);
+
+ assertEq(topic, aliceClaim666.topic, "Topic should match");
+ assertEq(scheme, aliceClaim666.scheme, "Scheme should match");
+ assertEq(issuer, aliceClaim666.issuer, "Issuer should match");
+ assertEq(signature, aliceClaim666.signature, "Signature should match");
+ assertEq(data, aliceClaim666.data, "Data should match");
+ assertEq(uri, aliceClaim666.uri, "URI should match");
+ }
+
+ // ============ isClaimValid - ECDSA recovery error ============
+
+ /// @notice When signature causes ECDSA recovery error, isClaimValid should return false
+ function test_isClaimValid_ecdsaRecoveryError_shouldReturnFalse() public view {
+ // Use a zero-length signature which causes ECDSA.RecoverError
+ bytes memory invalidSignature = hex"";
+ bool isValid = aliceIdentity.isClaimValid(
+ IIdentity(address(aliceIdentity)), Constants.CLAIM_TOPIC_666, invalidSignature, hex"0042"
+ );
+ assertFalse(isValid, "Claim with recovery error should be invalid");
+ }
+
+ // ============ removeClaim - single claim for topic ============
+
+ /// @notice Removing the only claim for a topic should leave the topic empty
+ function test_removeClaim_onlyClaimForTopic_shouldRemove() public {
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+
+ // Add a single claim for this topic
+ vm.prank(alice);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+
+ // Verify it's the only claim for this topic
+ bytes32[] memory claimIdsBefore = aliceIdentity.getClaimIdsByTopic(topic);
+ assertEq(claimIdsBefore.length, 1, "Should have exactly 1 claim");
+
+ // Remove it
+ vm.prank(alice);
+ aliceIdentity.removeClaim(claimId);
+
+ bytes32[] memory claimIdsAfter = aliceIdentity.getClaimIdsByTopic(topic);
+ assertEq(claimIdsAfter.length, 0, "Should have 0 claims");
+ }
+
+ // ============ CLAIM_ADDER key behavior ============
+
+ /// @notice Identity.isClaimValid should reject CLAIM_ADDER signatures (only CLAIM_SIGNER)
+ function test_isClaimValid_claimAdderKey_shouldReturnFalse() public {
+ // Add bob as CLAIM_ADDER (not CLAIM_SIGNER) on alice's identity
+ vm.prank(alice);
+ aliceIdentity.addKey(ClaimSignerHelper.addressToKey(bob), KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+
+ // Sign a claim with bob's private key
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ bytes memory signature = ClaimSignerHelper.signClaim(bobPk, address(aliceIdentity), topic, data);
+
+ // isClaimValid should return false because CLAIM_ADDER cannot sign claims
+ assertFalse(
+ aliceIdentity.isClaimValid(IIdentity(address(aliceIdentity)), topic, signature, data),
+ "CLAIM_ADDER key should not validate claim signatures"
+ );
+ }
+
+ /// @notice CLAIM_ADDER key should be able to add claims (onlyClaimKey allows CLAIM_ADDER)
+ function test_addClaim_withClaimAdderKey_shouldSucceed() public {
+ // Add bob as CLAIM_ADDER on alice's identity
+ vm.prank(alice);
+ aliceIdentity.addKey(ClaimSignerHelper.addressToKey(bob), KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+
+ // Build claim signed by claimIssuerOwner (who has CLAIM_SIGNER on claimIssuer)
+ uint256 topic = Constants.CLAIM_TOPIC_42;
+ bytes memory data = hex"0042";
+ string memory uri = "https://example.com";
+ bytes memory signature = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(aliceIdentity), topic, data);
+
+ // Bob (CLAIM_ADDER) should be able to add the claim
+ vm.prank(bob);
+ aliceIdentity.addClaim(topic, Constants.CLAIM_SCHEME, address(claimIssuer), signature, data, uri);
+
+ // Verify claim was added
+ bytes32 claimId = ClaimSignerHelper.computeClaimId(address(claimIssuer), topic);
+ (uint256 retTopic,, address retIssuer,,,) = aliceIdentity.getClaim(claimId);
+ assertEq(retTopic, topic, "Claim topic should match");
+ assertEq(retIssuer, address(claimIssuer), "Claim issuer should match");
+ }
+
+ /// @notice CLAIM_ADDER key should NOT be able to remove claims (onlyClaimSignerKey blocks it)
+ function test_removeClaim_withClaimAdderKey_shouldRevert() public {
+ // Add bob as CLAIM_ADDER on alice's identity
+ vm.prank(alice);
+ aliceIdentity.addKey(ClaimSignerHelper.addressToKey(bob), KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+
+ // Bob (CLAIM_ADDER) tries to remove aliceClaim666 — should revert
+ vm.prank(bob);
+ vm.expectRevert(Errors.SenderDoesNotHaveClaimSignerKey.selector);
+ aliceIdentity.removeClaim(aliceClaim666.id);
+ }
+
+ // ============ getClaimIdsByTopic ============
+
+ /// @notice When no claims exist for topic, should return empty array
+ function test_getClaimIdsByTopic_empty_shouldReturnEmpty() public {
+ bytes32[] memory claimIds = aliceIdentity.getClaimIdsByTopic(101010);
+ assertEq(claimIds.length, 0, "Should return empty array");
+ }
+
+ /// @notice When claims exist for topic, should return array of claim IDs
+ function test_getClaimIdsByTopic_hasClaims_shouldReturnIds() public {
+ // Use the pre-built aliceClaim666 from setup
+ bytes32[] memory claimIds = aliceIdentity.getClaimIdsByTopic(aliceClaim666.topic);
+
+ assertEq(claimIds.length, 1, "Should return 1 claim ID");
+ assertEq(claimIds[0], aliceClaim666.id, "Claim ID should match");
+ }
+
+}
diff --git a/test/identities/Executions.t.sol b/test/identities/Executions.t.sol
new file mode 100644
index 00000000..617263f0
--- /dev/null
+++ b/test/identities/Executions.t.sol
@@ -0,0 +1,476 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { Identity } from "contracts/Identity.sol";
+import { KeyManager } from "contracts/KeyManager.sol";
+import { IERC734 } from "contracts/interface/IERC734.sol";
+import { IERC735 } from "contracts/interface/IERC735.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+import { Structs } from "contracts/storage/Structs.sol";
+
+contract ExecutionsTest is OnchainIDSetup {
+
+ function test_getCurrentNonce_newIdentityReturnsZero() public view {
+ assertEq(aliceIdentity.getCurrentNonce(), 0);
+ }
+
+ function test_getCurrentNonce_incrementsAfterExecutions() public {
+ vm.deal(alice, 1 ether);
+
+ vm.prank(alice);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"");
+ assertEq(aliceIdentity.getCurrentNonce(), 1);
+
+ vm.prank(alice);
+ aliceIdentity.execute{ value: 5 }(carol, 5, hex"");
+ assertEq(aliceIdentity.getCurrentNonce(), 2);
+ }
+
+ function test_getExecutionData_validExecutionId() public {
+ vm.deal(alice, 1 ether);
+
+ uint256 executionId = aliceIdentity.getCurrentNonce();
+ vm.prank(alice);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"123456");
+
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(executionId);
+
+ assertEq(exec.to, carol);
+ assertEq(exec.value, 10);
+ assertEq(exec.data, hex"123456");
+ assertTrue(exec.approved);
+ assertTrue(exec.executed);
+ }
+
+ function test_getExecutionData_pendingExecution() public {
+ vm.deal(bob, 1 ether);
+
+ uint256 executionId = aliceIdentity.getCurrentNonce();
+ vm.prank(bob);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"123456");
+
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(executionId);
+
+ assertEq(exec.to, carol);
+ assertEq(exec.value, 10);
+ assertEq(exec.data, hex"123456");
+ assertFalse(exec.approved);
+ assertFalse(exec.executed);
+ }
+
+ function test_getExecutionData_nonExistentId() public view {
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(999);
+
+ assertEq(exec.to, address(0));
+ assertEq(exec.value, 0);
+ assertEq(exec.data.length, 0);
+ assertFalse(exec.approved);
+ assertFalse(exec.executed);
+ }
+
+ function test_nestedExecute_claimIssuerAsManagementKey_immediateExecution() public {
+ // Add claimIssuer as MANAGEMENT key on alice's identity
+ bytes32 claimIssuerKeyHash = keccak256(abi.encode(address(claimIssuer)));
+ vm.prank(alice);
+ aliceIdentity.addKey(claimIssuerKeyHash, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+
+ // Build claim
+ ClaimSignerHelper.Claim memory claim = ClaimSignerHelper.buildClaim(
+ claimIssuerOwnerPk, address(aliceIdentity), address(claimIssuer), 42, hex"0042", "https://example.com"
+ );
+
+ // Encode inner action: addClaim on aliceIdentity
+ bytes memory innerData = abi.encodeCall(
+ Identity.addClaim, (claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)
+ );
+
+ // Encode outer action: execute inner on aliceIdentity from claimIssuer
+ bytes memory outerData = abi.encodeCall(KeyManager.execute, (address(aliceIdentity), 0, innerData));
+
+ // ClaimIssuer owner executes outer on claimIssuer
+ vm.prank(claimIssuerOwner);
+ claimIssuer.execute(address(aliceIdentity), 0, outerData);
+
+ // Verify claim was added
+ bytes32 claimId = keccak256(abi.encode(claim.issuer, claim.topic));
+ bytes32[] memory claimIds = aliceIdentity.getClaimIdsByTopic(42);
+ assertEq(claimIds.length, 1);
+ assertEq(claimIds[0], claimId);
+ }
+
+ function test_nestedExecute_claimIssuerNotManagementKey_pendingExecution() public {
+ // DON'T add claimIssuer as MANAGEMENT key
+
+ // Build claim
+ ClaimSignerHelper.Claim memory claim = ClaimSignerHelper.buildClaim(
+ claimIssuerOwnerPk, address(aliceIdentity), address(claimIssuer), 42, hex"0042", "https://example.com"
+ );
+
+ // Encode inner action: addClaim on aliceIdentity
+ bytes memory innerData = abi.encodeCall(
+ Identity.addClaim, (claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)
+ );
+
+ // Encode outer action: execute inner on aliceIdentity from claimIssuer
+ bytes memory outerData = abi.encodeCall(KeyManager.execute, (address(aliceIdentity), 0, innerData));
+
+ // ClaimIssuer owner executes outer on claimIssuer
+ vm.prank(claimIssuerOwner);
+ claimIssuer.execute(address(aliceIdentity), 0, outerData);
+
+ // Inner execution creates pending request on aliceIdentity (executionId = 0)
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(0);
+ assertFalse(exec.approved);
+ assertFalse(exec.executed);
+
+ // Alice approves the pending execution
+ vm.prank(alice);
+ aliceIdentity.approve(0, true);
+
+ // Verify claim was added
+ bytes32 claimId = keccak256(abi.encode(claim.issuer, claim.topic));
+ bytes32[] memory claimIds = aliceIdentity.getClaimIdsByTopic(42);
+ assertEq(claimIds.length, 1);
+ }
+
+ function test_executeAsManagement_transferValue() public {
+ vm.deal(alice, 1 ether);
+ uint256 carolBalanceBefore = carol.balance;
+
+ vm.prank(alice);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"");
+
+ assertEq(carol.balance, carolBalanceBefore + 10);
+ }
+
+ function test_executeAsManagement_successfulCall() public {
+ bytes32 aliceKeyHash = keccak256(abi.encode(alice));
+
+ bytes memory addKeyData =
+ abi.encodeCall(KeyManager.addKey, (aliceKeyHash, KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA));
+
+ vm.prank(alice);
+ aliceIdentity.execute(address(aliceIdentity), 0, addKeyData);
+
+ // Verify alice's key now has both MANAGEMENT and CLAIM_SIGNER purposes
+ uint256[] memory purposes = aliceIdentity.getKeyPurposes(aliceKeyHash);
+ assertEq(purposes.length, 2);
+ assertTrue(
+ (purposes[0] == KeyPurposes.MANAGEMENT && purposes[1] == KeyPurposes.CLAIM_SIGNER)
+ || (purposes[0] == KeyPurposes.CLAIM_SIGNER && purposes[1] == KeyPurposes.MANAGEMENT)
+ );
+ }
+
+ function test_executeAsManagement_failingCall() public {
+ bytes32 aliceKeyHash = keccak256(abi.encode(alice));
+
+ // Try to add MANAGEMENT purpose again (duplicate — will fail)
+ bytes memory addKeyData =
+ abi.encodeCall(KeyManager.addKey, (aliceKeyHash, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA));
+
+ uint256 executionId = aliceIdentity.getCurrentNonce();
+
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC734.ExecutionFailed(executionId, address(aliceIdentity), 0, addKeyData);
+
+ vm.prank(alice);
+ aliceIdentity.execute(address(aliceIdentity), 0, addKeyData);
+ }
+
+ function test_executeAsAction_targetIsIdentity_createsRequest() public {
+ // Use a fresh address that has ONLY ACTION key (not CLAIM_SIGNER)
+ address actionOnly = makeAddr("actionOnly");
+ bytes32 actionOnlyKeyHash = keccak256(abi.encode(actionOnly));
+ vm.prank(alice);
+ aliceIdentity.addKey(actionOnlyKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ // actionOnly executes addKey on aliceIdentity (ACTION key targeting self → pending request)
+ bytes32 aliceKeyHash = keccak256(abi.encode(alice));
+ bytes memory addKeyData = abi.encodeCall(KeyManager.addKey, (aliceKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA));
+
+ vm.prank(actionOnly);
+ aliceIdentity.execute(address(aliceIdentity), 0, addKeyData);
+
+ // Verify execution is pending (ACTION key targeting identity = not auto-approved)
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(0);
+ assertFalse(exec.approved);
+ assertFalse(exec.executed);
+ }
+
+ function test_executeAsAction_targetIsAnotherAddress_executionFailed() public {
+ // Add carol as ACTION key
+ bytes32 carolKeyHash = keccak256(abi.encode(carol));
+ vm.prank(alice);
+ aliceIdentity.addKey(carolKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ bytes32 aliceKeyHash = keccak256(abi.encode(alice));
+ bytes memory addKeyData =
+ abi.encodeCall(KeyManager.addKey, (aliceKeyHash, KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA));
+
+ vm.deal(carol, 1 ether);
+
+ uint256 executionId = aliceIdentity.getCurrentNonce();
+
+ vm.expectEmit(true, true, true, true, address(aliceIdentity));
+ emit IERC734.ExecutionFailed(executionId, address(bobIdentity), 10, addKeyData);
+
+ vm.prank(carol);
+ aliceIdentity.execute{ value: 10 }(address(bobIdentity), 10, addKeyData);
+ }
+
+ function test_executeAsAction_targetIsAnotherAddress_success() public {
+ // Add carol as ACTION key
+ bytes32 carolKeyHash = keccak256(abi.encode(carol));
+ vm.prank(alice);
+ aliceIdentity.addKey(carolKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ vm.deal(carol, 1 ether);
+ uint256 davidBalanceBefore = david.balance;
+
+ vm.prank(carol);
+ aliceIdentity.execute{ value: 10 }(david, 10, hex"");
+
+ assertEq(david.balance, davidBalanceBefore + 10);
+ }
+
+ function test_executeAsNonActionKey_pendingRequest() public {
+ vm.deal(bob, 1 ether);
+ uint256 carolBalanceBefore = carol.balance;
+
+ // bob has no keys on aliceIdentity
+ vm.prank(bob);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"");
+
+ // Verify execution is pending and carol balance unchanged
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(0);
+ assertFalse(exec.approved);
+ assertFalse(exec.executed);
+ assertEq(carol.balance, carolBalanceBefore);
+ }
+
+ function test_approveNonExistingExecution() public {
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.InvalidRequestId.selector, 2));
+ aliceIdentity.approve(2, true);
+ }
+
+ function test_approveAlreadyExecuted() public {
+ vm.deal(alice, 1 ether);
+
+ vm.prank(alice);
+ aliceIdentity.execute{ value: 10 }(bob, 10, hex"");
+
+ vm.prank(alice);
+ vm.expectRevert(abi.encodeWithSelector(Errors.RequestAlreadyExecuted.selector, 0));
+ aliceIdentity.approve(0, true);
+ }
+
+ function test_approveAsNonActionKey_forExternalTarget() public {
+ vm.deal(bob, 1 ether);
+
+ // bob creates pending execution
+ vm.prank(bob);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"");
+
+ // bob tries to approve (bob has no ACTION key)
+ vm.prank(bob);
+ vm.expectRevert(abi.encodeWithSelector(Errors.SenderDoesNotHaveActionKey.selector, bob));
+ aliceIdentity.approve(0, true);
+ }
+
+ function test_approveAsNonManagementKey_forIdentityTarget() public {
+ // bob creates pending execution targeting the identity itself
+ bytes memory addKeyData = abi.encodeCall(
+ KeyManager.addKey, (keccak256(abi.encode(makeAddr("newKey"))), KeyPurposes.ACTION, KeyTypes.ECDSA)
+ );
+
+ vm.deal(bob, 1 ether);
+ vm.prank(bob);
+ aliceIdentity.execute{ value: 10 }(address(aliceIdentity), 10, addKeyData);
+
+ // david tries to approve (david has ACTION key but not MANAGEMENT)
+ vm.prank(david);
+ vm.expectRevert(abi.encodeWithSelector(Errors.SenderDoesNotHaveManagementKey.selector, david));
+ aliceIdentity.approve(0, true);
+ }
+
+ function test_approveAsManagement_executesPending() public {
+ vm.deal(bob, 1 ether);
+ uint256 carolBalanceBefore = carol.balance;
+
+ // bob creates pending execution
+ vm.prank(bob);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"");
+
+ // alice approves
+ vm.prank(alice);
+ aliceIdentity.approve(0, true);
+
+ assertEq(carol.balance, carolBalanceBefore + 10);
+ }
+
+ function test_approveWithFalse_doesNotExecute() public {
+ vm.deal(bob, 1 ether);
+ uint256 carolBalanceBefore = carol.balance;
+
+ // bob creates pending execution
+ vm.prank(bob);
+ aliceIdentity.execute{ value: 10 }(carol, 10, hex"");
+
+ // alice approves with false
+ vm.prank(alice);
+ aliceIdentity.approve(0, false);
+
+ assertEq(carol.balance, carolBalanceBefore);
+
+ // Verify execution is finalized (not approved, but marked executed to prevent replay)
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(0);
+ assertFalse(exec.approved);
+ assertTrue(exec.executed);
+ }
+
+ function test_autoApprovalForAddClaimWithClaimSignerKey() public {
+ // Add bob as CLAIM_SIGNER
+ bytes32 bobKeyHash = keccak256(abi.encode(bob));
+ vm.prank(alice);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Build claim with claimIssuer as issuer
+ ClaimSignerHelper.Claim memory claim = ClaimSignerHelper.buildClaim(
+ claimIssuerOwnerPk, address(aliceIdentity), address(claimIssuer), 42, hex"0042", "https://example.com"
+ );
+
+ // Encode addClaim data
+ bytes memory addClaimData = abi.encodeCall(
+ Identity.addClaim, (claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)
+ );
+
+ // Bob (CLAIM_SIGNER) executes addClaim through execute — should auto-approve
+ vm.prank(bob);
+ aliceIdentity.execute(address(aliceIdentity), 0, addClaimData);
+
+ // Verify claim was added (auto-approved and executed)
+ bytes32 claimId = keccak256(abi.encode(claim.issuer, claim.topic));
+ bytes32[] memory claimIds = aliceIdentity.getClaimIdsByTopic(42);
+ assertEq(claimIds.length, 1);
+ assertEq(claimIds[0], claimId);
+ }
+
+ /// @notice CLAIM_ADDER key calling execute() with addClaim data should auto-approve
+ function test_autoApprovalForAddClaimWithClaimAdderKey() public {
+ // Add bob as CLAIM_ADDER (not CLAIM_SIGNER)
+ bytes32 bobKeyHash = keccak256(abi.encode(bob));
+ vm.prank(alice);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+
+ // Build claim with claimIssuer as issuer
+ ClaimSignerHelper.Claim memory claim = ClaimSignerHelper.buildClaim(
+ claimIssuerOwnerPk, address(aliceIdentity), address(claimIssuer), 42, hex"0042", "https://example.com"
+ );
+
+ // Encode addClaim data
+ bytes memory addClaimData = abi.encodeCall(
+ Identity.addClaim, (claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)
+ );
+
+ // Bob (CLAIM_ADDER) executes addClaim through execute — should auto-approve
+ vm.prank(bob);
+ aliceIdentity.execute(address(aliceIdentity), 0, addClaimData);
+
+ // Verify claim was added (auto-approved and executed)
+ bytes32 claimId = keccak256(abi.encode(claim.issuer, claim.topic));
+ bytes32[] memory claimIds = aliceIdentity.getClaimIdsByTopic(42);
+ assertEq(claimIds.length, 1);
+ assertEq(claimIds[0], claimId);
+ }
+
+ /// @notice CLAIM_ADDER key calling execute() with removeClaim data should NOT auto-approve
+ function test_claimAdderExecuteRemoveClaim_shouldNotAutoApprove() public {
+ // Add bob as CLAIM_ADDER
+ bytes32 bobKeyHash = keccak256(abi.encode(bob));
+ vm.prank(alice);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.CLAIM_ADDER, KeyTypes.ECDSA);
+
+ // Encode removeClaim call for the existing aliceClaim666
+ bytes memory removeClaimData = abi.encodeCall(Identity.removeClaim, (aliceClaim666.id));
+
+ // Bob (CLAIM_ADDER) executes removeClaim — should NOT auto-approve
+ vm.prank(bob);
+ aliceIdentity.execute(address(aliceIdentity), 0, removeClaimData);
+
+ // Verify execution is pending (not auto-approved)
+ Structs.Execution memory exec = aliceIdentity.getExecutionData(0);
+ assertFalse(exec.approved);
+ assertFalse(exec.executed);
+
+ // Verify claim still exists
+ (uint256 retTopic,,,,,) = aliceIdentity.getClaim(aliceClaim666.id);
+ assertEq(retTopic, aliceClaim666.topic, "Claim should still exist");
+ }
+
+ function test_multicallWithMixedApproveReject() public {
+ // Add bob as ACTION key
+ bytes32 bobKeyHash = keccak256(abi.encode(bob));
+ vm.prank(alice);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ // Get current nonce to derive execution IDs
+ uint256 startNonce = aliceIdentity.getCurrentNonce();
+
+ // Create 3 execute calls (each adding a different key)
+ bytes32 key1 = keccak256(abi.encode(makeAddr("key1")));
+ bytes32 key2 = keccak256(abi.encode(makeAddr("key2")));
+ bytes32 key3 = keccak256(abi.encode(makeAddr("key3")));
+
+ bytes memory addKey1Data = abi.encodeCall(KeyManager.addKey, (key1, KeyPurposes.ACTION, KeyTypes.ECDSA));
+ bytes memory addKey2Data = abi.encodeCall(KeyManager.addKey, (key2, KeyPurposes.ACTION, KeyTypes.ECDSA));
+ bytes memory addKey3Data = abi.encodeCall(KeyManager.addKey, (key3, KeyPurposes.ACTION, KeyTypes.ECDSA));
+
+ bytes[] memory executeCalls = new bytes[](3);
+ executeCalls[0] = abi.encodeCall(KeyManager.execute, (address(aliceIdentity), 0, addKey1Data));
+ executeCalls[1] = abi.encodeCall(KeyManager.execute, (address(aliceIdentity), 0, addKey2Data));
+ executeCalls[2] = abi.encodeCall(KeyManager.execute, (address(aliceIdentity), 0, addKey3Data));
+
+ // bob multicalls to create 3 pending executions
+ vm.prank(bob);
+ aliceIdentity.multicall(executeCalls);
+
+ // Execution IDs will be startNonce, startNonce+1, startNonce+2
+ uint256 exec1 = startNonce;
+ uint256 exec2 = startNonce + 1;
+ uint256 exec3 = startNonce + 2;
+
+ // Encode 3 approve calls (true, false, true)
+ bytes[] memory approveCalls = new bytes[](3);
+ approveCalls[0] = abi.encodeCall(KeyManager.approve, (exec1, true));
+ approveCalls[1] = abi.encodeCall(KeyManager.approve, (exec2, false));
+ approveCalls[2] = abi.encodeCall(KeyManager.approve, (exec3, true));
+
+ // alice multicalls to approve
+ vm.prank(alice);
+ aliceIdentity.multicall(approveCalls);
+
+ // Verify exec1: approved and executed
+ Structs.Execution memory execData1 = aliceIdentity.getExecutionData(exec1);
+ assertTrue(execData1.approved);
+ assertTrue(execData1.executed);
+ assertTrue(aliceIdentity.keyHasPurpose(key1, KeyPurposes.ACTION));
+
+ // Verify exec2: not approved, but finalized (executed=true to prevent replay)
+ Structs.Execution memory execData2 = aliceIdentity.getExecutionData(exec2);
+ assertFalse(execData2.approved);
+ assertTrue(execData2.executed);
+ assertFalse(aliceIdentity.keyHasPurpose(key2, KeyPurposes.ACTION));
+
+ // Verify exec3: approved and executed
+ Structs.Execution memory execData3 = aliceIdentity.getExecutionData(exec3);
+ assertTrue(execData3.approved);
+ assertTrue(execData3.executed);
+ assertTrue(aliceIdentity.keyHasPurpose(key3, KeyPurposes.ACTION));
+ }
+
+}
diff --git a/test/identities/Init.t.sol b/test/identities/Init.t.sol
new file mode 100644
index 00000000..747e3f3b
--- /dev/null
+++ b/test/identities/Init.t.sol
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { Identity } from "contracts/Identity.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { IdentityTypes } from "contracts/libraries/IdentityTypes.sol";
+
+contract InitTest is OnchainIDSetup {
+
+ function test_revert_whenReinitializingDeployedIdentity() public {
+ vm.prank(alice);
+ vm.expectRevert("Initializable: contract is already initialized");
+ aliceIdentity.initialize(alice, IdentityTypes.INDIVIDUAL);
+ }
+
+ function test_revert_whenInitializingWithZeroAddress() public {
+ Identity libraryImpl = new Identity(deployer, true);
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ libraryImpl.initialize(address(0), IdentityTypes.INDIVIDUAL);
+ }
+
+ function test_revert_whenCreatingIdentityWithInvalidInitialKey() public {
+ vm.expectRevert(Errors.ZeroAddress.selector);
+ new Identity(address(0), false);
+ }
+
+ function test_versionInitializedWhenDeployedAsRegularContract() public {
+ Identity identityImplementation = getIdentityImplementation();
+ assertEq(identityImplementation.version(), "3.0.0");
+ }
+
+ function test_revert_whenInitializingLibraryWithValidAddress() public {
+ Identity libraryImpl = new Identity(deployer, true);
+ vm.expectRevert(Errors.InitialKeyAlreadySetup.selector);
+ libraryImpl.initialize(deployer, IdentityTypes.INDIVIDUAL);
+ }
+
+ function test_revert_whenCallingLibraryImplementationDirectly() public {
+ Identity libraryImpl = new Identity(deployer, true);
+
+ vm.prank(deployer);
+ vm.expectRevert(Errors.InteractingWithLibraryContractForbidden.selector);
+ libraryImpl.addKey(keccak256(abi.encode(alice)), 1, 1);
+ }
+
+ function test_supportsERC165InterfaceDetection() public {
+ // ERC165 interface ID
+ assertTrue(aliceIdentity.supportsInterface(0x01ffc9a7));
+
+ // Invalid interface IDs
+ assertFalse(aliceIdentity.supportsInterface(0x12345678));
+ assertFalse(aliceIdentity.supportsInterface(0x00000000));
+ assertFalse(aliceIdentity.supportsInterface(0xffffffff));
+ }
+
+}
diff --git a/test/identities/Keys.t.sol b/test/identities/Keys.t.sol
new file mode 100644
index 00000000..10169f84
--- /dev/null
+++ b/test/identities/Keys.t.sol
@@ -0,0 +1,196 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { Errors } from "contracts/libraries/Errors.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+
+/// @notice Tests for Identity Key Management (ERC-734)
+contract KeysTest is OnchainIDSetup {
+
+ bytes32 public aliceKeyHash;
+ bytes32 public bobKeyHash;
+
+ function setUp() public override {
+ super.setUp();
+
+ aliceKeyHash = ClaimSignerHelper.addressToKey(alice);
+ bobKeyHash = ClaimSignerHelper.addressToKey(bob);
+ }
+
+ // ============ Read key methods ============
+
+ function test_RetrieveExistingKey() public view {
+ (uint256[] memory purposes, uint256 keyType, bytes32 key) = aliceIdentity.getKey(aliceKeyHash);
+
+ assertEq(key, aliceKeyHash);
+ assertEq(purposes.length, 1);
+ assertEq(purposes[0], KeyPurposes.MANAGEMENT);
+ assertEq(keyType, KeyTypes.ECDSA);
+ }
+
+ function test_RetrieveExistingKeyPurposes() public view {
+ uint256[] memory purposes = aliceIdentity.getKeyPurposes(aliceKeyHash);
+
+ assertEq(purposes.length, 1);
+ assertEq(purposes[0], KeyPurposes.MANAGEMENT);
+ }
+
+ function test_RetrieveExistingKeysWithGivenPurpose() public view {
+ bytes32[] memory keys = aliceIdentity.getKeysByPurpose(KeyPurposes.MANAGEMENT);
+
+ assertEq(keys.length, 1);
+ assertEq(keys[0], aliceKeyHash);
+ }
+
+ function test_ReturnTrueIfKeyHasGivenPurpose() public view {
+ bool hasPurpose = aliceIdentity.keyHasPurpose(aliceKeyHash, KeyPurposes.MANAGEMENT);
+
+ assertTrue(hasPurpose);
+ }
+
+ function test_ReturnTrueIfKeyIsManagementKeyButNotGivenPurpose() public view {
+ // MANAGEMENT keys have universal permissions, so they return true for any purpose
+ bool hasPurpose = aliceIdentity.keyHasPurpose(aliceKeyHash, KeyPurposes.ACTION);
+
+ assertTrue(hasPurpose);
+ }
+
+ function test_ReturnFalseIfKeyDoesNotHaveGivenPurpose() public view {
+ bool hasPurpose = aliceIdentity.keyHasPurpose(bobKeyHash, KeyPurposes.ACTION);
+
+ assertFalse(hasPurpose);
+ }
+
+ // ============ Add key methods - Non-Management key ============
+
+ function test_RevertAddKey_WhenCallerIsNotManagementKey() public {
+ vm.expectRevert(Errors.SenderDoesNotHaveManagementKey.selector);
+ vm.prank(bob);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+ }
+
+ // ============ Add key methods - Management key ============
+
+ function test_AddPurposeToExistingKey() public {
+ vm.prank(alice);
+ aliceIdentity.addKey(aliceKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ (uint256[] memory purposes, uint256 keyType, bytes32 key) = aliceIdentity.getKey(aliceKeyHash);
+
+ assertEq(key, aliceKeyHash);
+ assertEq(purposes.length, 2);
+ assertEq(purposes[0], KeyPurposes.MANAGEMENT);
+ assertEq(purposes[1], KeyPurposes.ACTION);
+ assertEq(keyType, KeyTypes.ECDSA);
+ }
+
+ function test_AddNewKeyWithPurpose() public {
+ vm.prank(alice);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+
+ (uint256[] memory purposes, uint256 keyType, bytes32 key) = aliceIdentity.getKey(bobKeyHash);
+
+ assertEq(key, bobKeyHash);
+ assertEq(purposes.length, 1);
+ assertEq(purposes[0], KeyPurposes.MANAGEMENT);
+ assertEq(keyType, KeyTypes.ECDSA);
+ }
+
+ function test_RevertAddKey_WhenKeyAlreadyHasPurpose() public {
+ vm.expectRevert(
+ abi.encodeWithSelector(Errors.KeyAlreadyHasPurpose.selector, aliceKeyHash, KeyPurposes.MANAGEMENT)
+ );
+ vm.prank(alice);
+ aliceIdentity.addKey(aliceKeyHash, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+ }
+
+ // ============ Remove key methods - Non-Management key ============
+
+ function test_RevertRemoveKey_WhenCallerIsNotManagementKey() public {
+ vm.expectRevert(Errors.SenderDoesNotHaveManagementKey.selector);
+ vm.prank(bob);
+ aliceIdentity.removeKey(aliceKeyHash, KeyPurposes.MANAGEMENT);
+ }
+
+ // ============ Remove key methods - Management key ============
+
+ function test_RemovePurposeFromExistingKey() public {
+ vm.prank(alice);
+ aliceIdentity.removeKey(aliceKeyHash, KeyPurposes.MANAGEMENT);
+
+ (uint256[] memory purposes, uint256 keyType, bytes32 key) = aliceIdentity.getKey(aliceKeyHash);
+
+ assertEq(key, bytes32(0));
+ assertEq(purposes.length, 0);
+ assertEq(keyType, 0);
+ }
+
+ function test_RevertRemoveKey_WhenKeyDoesNotExist() public {
+ vm.expectRevert(abi.encodeWithSelector(Errors.KeyNotRegistered.selector, bobKeyHash));
+ vm.prank(alice);
+ aliceIdentity.removeKey(bobKeyHash, KeyPurposes.ACTION);
+ }
+
+ function test_RevertRemoveKey_WhenKeyDoesNotHavePurpose() public {
+ vm.expectRevert(abi.encodeWithSelector(Errors.KeyDoesNotHavePurpose.selector, aliceKeyHash, KeyPurposes.ACTION));
+ vm.prank(alice);
+ aliceIdentity.removeKey(aliceKeyHash, KeyPurposes.ACTION);
+ }
+
+ function test_RemoveKeyFromPurposeArray() public {
+ // Add bob as MANAGEMENT + ACTION key
+ vm.startPrank(alice);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.MANAGEMENT, KeyTypes.ECDSA);
+ aliceIdentity.addKey(bobKeyHash, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ // Remove MANAGEMENT purpose
+ aliceIdentity.removeKey(bobKeyHash, KeyPurposes.MANAGEMENT);
+ vm.stopPrank();
+
+ // Verify the key still has ACTION purpose only
+ (uint256[] memory purposes, uint256 keyType, bytes32 key) = aliceIdentity.getKey(bobKeyHash);
+
+ assertEq(key, bobKeyHash);
+ assertEq(purposes.length, 1);
+ assertEq(purposes[0], KeyPurposes.ACTION);
+ assertEq(keyType, KeyTypes.ECDSA);
+ }
+
+ // ============ Remove key - edge cases ============
+
+ /// @notice Remove the only key for a given purpose
+ function test_RemoveOnlyKeyForPurpose() public {
+ // carol has CLAIM_SIGNER only on aliceIdentity (added in setUp)
+ bytes32 carolKeyHash = ClaimSignerHelper.addressToKey(carol);
+
+ // Remove carol's CLAIM_SIGNER purpose
+ vm.prank(alice);
+ aliceIdentity.removeKey(carolKeyHash, KeyPurposes.CLAIM_SIGNER);
+
+ // Verify carol no longer has CLAIM_SIGNER purpose
+ assertFalse(aliceIdentity.keyHasPurpose(carolKeyHash, KeyPurposes.CLAIM_SIGNER));
+ }
+
+ /// @notice Remove a key's only purpose — key should be fully deleted
+ function test_RemoveKeyWithSinglePurpose() public {
+ // david has ACTION only on aliceIdentity (added in setUp)
+ bytes32 davidKeyHash = ClaimSignerHelper.addressToKey(david);
+
+ // david has exactly one purpose (ACTION)
+ uint256[] memory purposes = aliceIdentity.getKeyPurposes(davidKeyHash);
+ assertEq(purposes.length, 1, "David should have exactly 1 purpose");
+
+ // Remove ACTION purpose
+ vm.prank(alice);
+ aliceIdentity.removeKey(davidKeyHash, KeyPurposes.ACTION);
+
+ // Key should be fully deleted
+ (, uint256 keyType2, bytes32 key2) = aliceIdentity.getKey(davidKeyHash);
+ assertEq(key2, bytes32(0), "Key should be deleted");
+ assertEq(keyType2, 0, "Key type should be 0");
+ }
+
+}
diff --git a/test/identities/ProxyPattern.t.sol b/test/identities/ProxyPattern.t.sol
new file mode 100644
index 00000000..b9d3e27f
--- /dev/null
+++ b/test/identities/ProxyPattern.t.sol
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { IdentityHelper } from "../helpers/IdentityHelper.sol";
+import { Identity } from "contracts/Identity.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+import { Test } from "forge-std/Test.sol";
+
+contract ProxyPatternTest is Test {
+
+ address internal deployer;
+ address internal alice;
+
+ function setUp() public {
+ deployer = makeAddr("proxyDeployer");
+ alice = makeAddr("proxyAlice");
+ }
+
+ function test_deployIdentityThroughProxyAndWorkCorrectly() public {
+ vm.prank(deployer);
+ Identity identityProxy = IdentityHelper.deployIdentityWithProxy(deployer);
+
+ assertEq(identityProxy.version(), "3.0.0");
+
+ bytes32 deployerKey = ClaimSignerHelper.addressToKey(deployer);
+ assertTrue(identityProxy.keyHasPurpose(deployerKey, KeyPurposes.MANAGEMENT));
+
+ bytes32 aliceKey = ClaimSignerHelper.addressToKey(alice);
+ vm.prank(deployer);
+ identityProxy.addKey(aliceKey, KeyPurposes.ACTION, KeyTypes.ECDSA);
+
+ assertTrue(identityProxy.keyHasPurpose(aliceKey, KeyPurposes.ACTION));
+ }
+
+}
diff --git a/test/identities/VersionUpgrade.t.sol b/test/identities/VersionUpgrade.t.sol
new file mode 100644
index 00000000..156ff16d
--- /dev/null
+++ b/test/identities/VersionUpgrade.t.sol
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { OnchainIDSetup } from "../helpers/OnchainIDSetup.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+
+contract VersionUpgradeTest is OnchainIDSetup {
+
+ function test_returnInitialVersion() public view {
+ assertEq(aliceIdentity.version(), "3.0.0");
+ }
+
+ function test_maintainVersionConstant() public view {
+ assertEq(aliceIdentity.version(), "3.0.0");
+ }
+
+ function test_demonstrateUpgradePattern() public {
+ assertEq(aliceIdentity.version(), "3.0.0");
+
+ uint256 claimTopic = uint256(keccak256(bytes("test")));
+ bytes memory claimData = bytes("test data");
+ string memory claimUri = "https://example.com";
+
+ // Add CLAIM_SIGNER key for alice on her identity
+ vm.prank(alice);
+ aliceIdentity.addKey(ClaimSignerHelper.addressToKey(alice), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Sign claim properly
+ bytes memory signature = ClaimSignerHelper.signClaim(alicePk, address(aliceIdentity), claimTopic, claimData);
+
+ // Add self-issued claim with valid signature
+ vm.prank(alice);
+ aliceIdentity.addClaim(claimTopic, 1, address(aliceIdentity), signature, claimData, claimUri);
+
+ // Verify claim
+ bytes32 claimId = keccak256(abi.encode(address(aliceIdentity), claimTopic));
+ (uint256 topic,, address returnedIssuer,, bytes memory data, string memory uri) =
+ aliceIdentity.getClaim(claimId);
+
+ assertEq(topic, claimTopic);
+ assertEq(returnedIssuer, address(aliceIdentity));
+ assertEq(data, claimData);
+ assertEq(uri, claimUri);
+ }
+
+}
diff --git a/test/identities/claims.test.ts b/test/identities/claims.test.ts
deleted file mode 100644
index 3e6d7473..00000000
--- a/test/identities/claims.test.ts
+++ /dev/null
@@ -1,354 +0,0 @@
-import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
-import { expect } from "chai";
-import {ethers} from "hardhat";
-
-import { deployIdentityFixture } from '../fixtures';
-
-describe('Identity', () => {
- describe('Claims', () => {
- describe('addClaim', () => {
- describe('when the claim is self-attested (issuer is identity address)', () => {
- describe('when the claim is not valid', () => {
- it('should add the claim anyway', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const claim = {
- identity: aliceIdentity.address,
- issuer: aliceIdentity.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- claim.signature = await aliceWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, '0x101010']))));
-
- const tx = await aliceIdentity.connect(aliceWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- await expect(tx).to.emit(aliceIdentity, 'ClaimAdded').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic])), claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- await expect(aliceIdentity.isClaimValid(claim.identity, claim.topic, claim.signature, claim.data)).to.eventually.equal(false);
- });
- });
-
- describe('when the claim is valid', () => {
- let claim = { identity: '', issuer: '', topic: 0, scheme: 1, data: '', uri: '', signature: '' };
- before(async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- claim = {
- identity: aliceIdentity.address,
- issuer: aliceIdentity.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- claim.signature = await aliceWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, claim.data]))));
- });
-
- describe('when caller is the identity itself (execute)', () => {
- it('should add the claim', async () => {
- const { aliceIdentity, aliceWallet, bobWallet } = await loadFixture(deployIdentityFixture);
-
- const action = {
- to: aliceIdentity.address,
- value: 0,
- data: new ethers.utils.Interface([
- 'function addClaim(uint256 topic, uint256 scheme, address issuer, bytes calldata signature, bytes calldata data, string calldata uri) external returns (bytes32 claimRequestId)'
- ]).encodeFunctionData('addClaim', [
- claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri
- ]),
- };
-
- await aliceIdentity.connect(bobWallet).execute(action.to, action.value, action.data);
- const tx = await aliceIdentity.connect(aliceWallet).approve(0, true);
- await expect(tx).to.emit(aliceIdentity, 'ClaimAdded').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic])), claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'Executed');
- await expect(aliceIdentity.isClaimValid(claim.identity, claim.topic, claim.signature, claim.data)).to.eventually.equal(true);
- });
- });
-
- describe('when caller is a CLAIM or MANAGEMENT key', () => {
- it('should add the claim', async () => {
- it('should add the claim anyway', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const tx = await aliceIdentity.connect(aliceWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- await expect(tx).to.emit(aliceIdentity, 'ClaimAdded').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic])), claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- });
- });
- });
-
- describe('when caller is not a CLAIM key', () => {
- it('should revert for missing permission', async () => {
- const { aliceIdentity, bobWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(aliceIdentity.connect(bobWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)).to.be.revertedWith('Permissions: Sender does not have claim signer key');
- });
- });
- });
- });
-
- describe('when the claim is from a claim issuer', () => {
- describe('when the claim is not valid', () => {
- it('should revert for invalid claim', async () => {
- const { aliceIdentity, aliceWallet, claimIssuerWallet, claimIssuer } = await loadFixture(deployIdentityFixture);
-
- const claim = {
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- claim.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, '0x10101010']))));
-
- await expect(aliceIdentity.connect(aliceWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)).to.be.revertedWith('invalid claim');
- });
- });
-
- describe('when the claim is valid', () => {
- let claim = { identity: '', issuer: '', topic: 0, scheme: 1, data: '', uri: '', signature: '' };
- before(async () => {
- const { aliceIdentity, claimIssuer, claimIssuerWallet } = await loadFixture(deployIdentityFixture);
-
- claim = {
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- claim.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, claim.data]))));
- });
-
- describe('when caller is the identity itself (execute)', () => {
- it('should add the claim', async () => {
- const { aliceIdentity, aliceWallet, bobWallet } = await loadFixture(deployIdentityFixture);
-
- const action = {
- to: aliceIdentity.address,
- value: 0,
- data: new ethers.utils.Interface([
- 'function addClaim(uint256 topic, uint256 scheme, address issuer, bytes calldata signature, bytes calldata data, string calldata uri) external returns (bytes32 claimRequestId)'
- ]).encodeFunctionData('addClaim', [
- claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri
- ]),
- };
-
- await aliceIdentity.connect(bobWallet).execute(action.to, action.value, action.data);
- const tx = await aliceIdentity.connect(aliceWallet).approve(0, true);
- await expect(tx).to.emit(aliceIdentity, 'ClaimAdded').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic])), claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'Executed');
- });
- });
-
- describe('when caller is a CLAIM or MANAGEMENT key', () => {
- it('should add the claim', async () => {
- it('should add the claim anyway', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const tx = await aliceIdentity.connect(aliceWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- await expect(tx).to.emit(aliceIdentity, 'ClaimAdded').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic])), claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- });
- });
- });
-
- describe('when caller is not a CLAIM key', () => {
- it('should revert for missing permission', async () => {
- const { aliceIdentity, bobWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(aliceIdentity.connect(bobWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri)).to.be.revertedWith('Permissions: Sender does not have claim signer key');
- });
- });
- });
- });
- });
-
- describe('updateClaim (addClaim)', () => {
- describe('when there is already a claim from this issuer and this topic', () => {
- let aliceIdentity: ethers.Contract;
- let aliceWallet: ethers.Wallet;
- let claimIssuer: ethers.Contract;
- let claimIssuerWallet: ethers.Wallet;
- before(async () => {
- const params = await loadFixture(deployIdentityFixture);
- aliceIdentity = params.aliceIdentity;
- aliceWallet = params.aliceWallet;
- claimIssuer = params.claimIssuer;
- claimIssuerWallet = params.claimIssuerWallet;
-
- const claim = {
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- claim.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, claim.data]))));
-
- await aliceIdentity.connect(aliceWallet).addClaim(
- claim.topic,
- claim.scheme,
- claim.issuer,
- claim.signature,
- claim.data,
- claim.uri,
- );
- });
-
- it('should replace the existing claim', async () => {
- const claim = {
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 42,
- scheme: 1,
- data: '0x004200101010',
- signature: '',
- uri: 'https://example.com',
- };
- claim.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, claim.data]))));
-
- const tx = await aliceIdentity.connect(aliceWallet).addClaim(
- claim.topic,
- claim.scheme,
- claim.issuer,
- claim.signature,
- claim.data,
- claim.uri,
- );
- await expect(tx).to.emit(aliceIdentity, 'ClaimChanged').withArgs(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic])), claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- });
- });
- });
-
- describe('removeClaim', () => {
- describe('When caller is the identity itself (execute)', () => {
- it('should remove an existing claim', async () => {
- const { aliceIdentity, aliceWallet, bobWallet, claimIssuer, claimIssuerWallet } = await loadFixture(deployIdentityFixture);
- const claim = {
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- const claimId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic]));
- claim.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, claim.data]))));
-
- await aliceIdentity.connect(aliceWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
-
- const action = {
- to: aliceIdentity.address,
- value: 0,
- data: new ethers.utils.Interface([
- 'function removeClaim(bytes32 claimId) external returns (bool success)'
- ]).encodeFunctionData('removeClaim', [
- claimId,
- ]),
- };
-
- await aliceIdentity.connect(bobWallet).execute(action.to, action.value, action.data);
- const tx = await aliceIdentity.connect(aliceWallet).approve(0, true);
- await expect(tx).to.emit(aliceIdentity, 'ClaimRemoved').withArgs(claimId, claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- });
- });
-
- describe('When caller is not a CLAIM key', () => {
- it('should revert for missing permission', async () => {
- const { aliceIdentity, bobWallet, claimIssuer } = await loadFixture(deployIdentityFixture);
-
- const claimId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claimIssuer.address, 42]));
-
- await expect(aliceIdentity.connect(bobWallet).removeClaim(claimId)).to.be.revertedWith('Permissions: Sender does not have claim signer key');
- });
- });
-
- describe('When claim does not exist', () => {
- it('should revert for non existing claim', async () => {
- const { aliceIdentity, carolWallet, claimIssuer } = await loadFixture(deployIdentityFixture);
-
- const claimId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claimIssuer.address, 42]));
-
- await expect(aliceIdentity.connect(carolWallet).removeClaim(claimId)).to.be.revertedWith('NonExisting: There is no claim with this ID');
- });
- });
-
- describe('When claim does exist', () => {
- it('should remove the claim', async () => {
- const { aliceIdentity, aliceWallet, claimIssuer, claimIssuerWallet } = await loadFixture(deployIdentityFixture);
- const claim = {
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 42,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- const claimId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claim.issuer, claim.topic]));
- claim.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [claim.identity, claim.topic, claim.data]))));
-
- await aliceIdentity.connect(aliceWallet).addClaim(claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
-
- const tx = await aliceIdentity.connect(aliceWallet).removeClaim(claimId);
- await expect(tx).to.emit(aliceIdentity, 'ClaimRemoved').withArgs(claimId, claim.topic, claim.scheme, claim.issuer, claim.signature, claim.data, claim.uri);
- });
- });
- });
-
- describe('getClaim', () => {
- describe('when claim does not exist', () => {
- it('should return an empty struct', async () => {
- const { aliceIdentity, claimIssuer } = await loadFixture(deployIdentityFixture);
- const claimId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256'], [claimIssuer.address, 42]));
- const found = await aliceIdentity.getClaim(claimId);
- expect(found.issuer).to.equal(ethers.constants.AddressZero);
- expect(found.topic).to.equal(0);
- expect(found.scheme).to.equal(0);
- expect(found.data).to.equal('0x');
- expect(found.signature).to.equal('0x');
- expect(found.uri).to.equal('');
- });
- });
-
- describe('when claim does exist', () => {
- it('should return the claim', async () => {
- const { aliceIdentity, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- const found = await aliceIdentity.getClaim(aliceClaim666.id);
- expect(found.issuer).to.equal(aliceClaim666.issuer);
- expect(found.topic).to.equal(aliceClaim666.topic);
- expect(found.scheme).to.equal(aliceClaim666.scheme);
- expect(found.data).to.equal(aliceClaim666.data);
- expect(found.signature).to.equal(aliceClaim666.signature);
- expect(found.uri).to.equal(aliceClaim666.uri);
- });
- });
- });
-
- describe('getClaimIdsByTopic', () => {
- it('should return an empty array when there are no claims for the topic', async () => {
- const { aliceIdentity } = await loadFixture(deployIdentityFixture);
-
- await expect(aliceIdentity.getClaimIdsByTopic(101010)).to.eventually.deep.equal([]);
- });
-
- it('should return an array of claim Id existing fo the topic', async () => {
- const { aliceIdentity, aliceClaim666 } = await loadFixture(deployIdentityFixture);
-
- await expect(aliceIdentity.getClaimIdsByTopic(aliceClaim666.topic)).to.eventually.deep.equal([aliceClaim666.id]);
- });
- });
- });
-});
diff --git a/test/identities/executions.test.ts b/test/identities/executions.test.ts
deleted file mode 100644
index f44c0c10..00000000
--- a/test/identities/executions.test.ts
+++ /dev/null
@@ -1,258 +0,0 @@
-import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
-import { expect } from "chai";
-import {ethers} from "hardhat";
-
-import { deployIdentityFixture } from '../fixtures';
-
-describe('Identity', () => {
- describe('Execute', () => {
- describe('when calling execute as a MANAGEMENT key', () => {
- describe('when execution is possible (transferring value with enough funds on the identity)', () => {
- it('should execute immediately the action', async () => {
- const { aliceIdentity, aliceWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- const previousBalance = await ethers.provider.getBalance(carolWallet.address);
- const action = {
- to: carolWallet.address,
- value: 10,
- data: '0x',
- };
-
- const tx = await aliceIdentity.connect(aliceWallet).execute(action.to, action.value, action.data, { value: action.value });
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'Executed');
- const newBalance = await ethers.provider.getBalance(carolWallet.address);
-
- expect(newBalance).to.equal(previousBalance.add(action.value));
- });
- });
-
- describe('when execution is possible (successfull call)', () => {
- it('should emit Executed', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
-
- const action = {
- to: aliceIdentity.address,
- value: 0,
- data: new ethers.utils.Interface(['function addKey(bytes32 key, uint256 purpose, uint256 keyType) returns (bool success)']).encodeFunctionData('addKey', [
- aliceKeyHash,
- 3,
- 1,
- ]),
- };
-
- const tx = await aliceIdentity.connect(aliceWallet).execute(action.to, action.value, action.data);
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'Executed');
-
- const purposes = await aliceIdentity.getKeyPurposes(aliceKeyHash);
- expect(purposes).to.deep.equal([1, 3]);
- });
- });
-
- describe('when execution is not possible (failing call)', () => {
- it('should emit an ExecutionFailed event', async () => {
- const { aliceIdentity, aliceWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- const previousBalance = await ethers.provider.getBalance(carolWallet.address);
- const action = {
- to: aliceIdentity.address,
- value: 0,
- data: new ethers.utils.Interface(['function addKey(bytes32 key, uint256 purpose, uint256 keyType) returns (bool success)']).encodeFunctionData('addKey', [
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- ),
- 1,
- 1,
- ]),
- };
-
- const tx = await aliceIdentity.connect(aliceWallet).execute(action.to, action.value, action.data);
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'ExecutionFailed');
- const newBalance = await ethers.provider.getBalance(carolWallet.address);
-
- expect(newBalance).to.equal(previousBalance.add(action.value));
- });
- });
- });
-
- describe('when calling execute as an ACTION key', () => {
- describe('when target is the identity contract', () => {
- it('should create an execution request', async () => {
- const { aliceIdentity, aliceWallet, bobWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- const carolKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [carolWallet.address])
- );
- await aliceIdentity.connect(aliceWallet).addKey(carolKeyHash, 2, 1);
-
- const action = {
- to: aliceIdentity.address,
- value: 0,
- data: new ethers.utils.Interface(['function addKey(bytes32 key, uint256 purpose, uint256 keyType) returns (bool success)']).encodeFunctionData('addKey', [
- aliceKeyHash,
- 2,
- 1,
- ]),
- };
-
- const tx = await aliceIdentity.connect(carolWallet).execute(action.to, action.value, action.data, { value: action.value });
- await expect(tx).to.emit(aliceIdentity, 'ExecutionRequested');
- });
- });
-
- describe('when target is another address', () => {
- it('should emit ExecutionFailed for a failed execution', async () => {
- const { aliceIdentity, aliceWallet, carolWallet, davidWallet, bobIdentity } = await loadFixture(deployIdentityFixture);
-
- const carolKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [carolWallet.address])
- );
- await aliceIdentity.connect(aliceWallet).addKey(carolKeyHash, 2, 1);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
-
- const action = {
- to: bobIdentity.address,
- value: 10,
- data: new ethers.utils.Interface(['function addKey(bytes32 key, uint256 purpose, uint256 keyType) returns (bool success)']).encodeFunctionData('addKey', [
- aliceKeyHash,
- 3,
- 1,
- ]),
- };
-
- const previousBalance = await ethers.provider.getBalance(bobIdentity.address);
-
- const tx = await aliceIdentity.connect(carolWallet).execute(action.to, action.value, action.data, { value: action.value });
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'ExecutionFailed');
- const newBalance = await ethers.provider.getBalance(bobIdentity.address);
-
- expect(newBalance).to.equal(previousBalance);
- });
-
- it('should execute immediately the action', async () => {
- const { aliceIdentity, aliceWallet, carolWallet, davidWallet } = await loadFixture(deployIdentityFixture);
-
- const carolKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [carolWallet.address])
- );
- await aliceIdentity.connect(aliceWallet).addKey(carolKeyHash, 2, 1);
-
- const previousBalance = await ethers.provider.getBalance(davidWallet.address);
- const action = {
- to: davidWallet.address,
- value: 10,
- data: '0x',
- };
-
- const tx = await aliceIdentity.connect(carolWallet).execute(action.to, action.value, action.data, { value: action.value });
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'Executed');
- const newBalance = await ethers.provider.getBalance(davidWallet.address);
-
- expect(newBalance).to.equal(previousBalance.add(action.value));
- });
- });
- });
-
- describe('when calling execute as a non-action key', () => {
- it('should create a pending execution request', async () => {
- const { aliceIdentity, bobWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- const previousBalance = await ethers.provider.getBalance(carolWallet.address);
- const action = {
- to: carolWallet.address,
- value: 10,
- data: '0x',
- };
-
- const tx = await aliceIdentity.connect(bobWallet).execute(action.to, action.value, action.data, { value: action.value });
- await expect(tx).to.emit(aliceIdentity, 'ExecutionRequested');
- const newBalance = await ethers.provider.getBalance(carolWallet.address);
-
- expect(newBalance).to.equal(previousBalance);
- });
- });
- });
-
- describe('Approve', () => {
- describe('when calling a non-existing execution request', () => {
- it('should revert for execution request not found', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- await expect(aliceIdentity.connect(aliceWallet).approve(2, true)).to.be.revertedWith('Cannot approve a non-existing execution');
- });
- });
-
- describe('when calling an already executed request', () => {
- it('should revert for execution request already executed', async () => {
- const { aliceIdentity, aliceWallet, bobWallet } = await loadFixture(deployIdentityFixture);
-
- await aliceIdentity.connect(aliceWallet).execute(bobWallet.address, 10, '0x', { value: 10 });
-
- await expect(aliceIdentity.connect(aliceWallet).approve(0, true)).to.be.revertedWith('Request already executed');
- });
- });
-
- describe('when calling approve for an execution targeting another address as a non-action key', () => {
- it('should revert for not authorized', async () => {
- const { aliceIdentity, bobWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- await aliceIdentity.connect(bobWallet).execute(carolWallet.address, 10, '0x', { value: 10 });
-
- await expect(aliceIdentity.connect(bobWallet).approve(0, true)).to.be.revertedWith('Sender does not have action key');
- });
- });
-
- describe('when calling approve for an execution targeting another address as a non-management key', () => {
- it('should revert for not authorized', async () => {
- const { aliceIdentity, davidWallet, bobWallet } = await loadFixture(deployIdentityFixture);
-
- await aliceIdentity.connect(bobWallet).execute(aliceIdentity.address, 10, '0x', { value: 10 });
-
- await expect(aliceIdentity.connect(davidWallet).approve(0, true)).to.be.revertedWith('Sender does not have management key');
- });
- });
-
- describe('when calling approve as a MANAGEMENT key', () => {
- it('should approve the execution request', async () => {
- const { aliceIdentity, aliceWallet, bobWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- const previousBalance = await ethers.provider.getBalance(carolWallet.address);
- await aliceIdentity.connect(bobWallet).execute(carolWallet.address, 10, '0x', { value: 10 });
-
- const tx = await aliceIdentity.connect(aliceWallet).approve(0, true);
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- await expect(tx).to.emit(aliceIdentity, 'Executed');
- const newBalance = await ethers.provider.getBalance(carolWallet.address);
-
- expect(newBalance).to.equal(previousBalance.add(10));
- });
-
- it('should leave approve to false', async () => {
- const { aliceIdentity, aliceWallet, bobWallet, carolWallet } = await loadFixture(deployIdentityFixture);
-
- const previousBalance = await ethers.provider.getBalance(carolWallet.address);
- await aliceIdentity.connect(bobWallet).execute(carolWallet.address, 10, '0x', { value: 10 });
-
- const tx = await aliceIdentity.connect(aliceWallet).approve(0, false);
- await expect(tx).to.emit(aliceIdentity, 'Approved');
- const newBalance = await ethers.provider.getBalance(carolWallet.address);
-
- expect(newBalance).to.equal(previousBalance);
- });
- });
- });
-});
diff --git a/test/identities/init.test.ts b/test/identities/init.test.ts
deleted file mode 100644
index 984eca0d..00000000
--- a/test/identities/init.test.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import {loadFixture} from '@nomicfoundation/hardhat-network-helpers';
-import {expect} from "chai";
-import {ethers} from "hardhat";
-
-import {deployIdentityFixture} from '../fixtures';
-
-describe('Identity', () => {
- it('should revert when attempting to initialize an already deployed identity', async () => {
- const {aliceIdentity, aliceWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(aliceIdentity.connect(aliceWallet).initialize(aliceWallet.address)).to.be.revertedWith('Initial key was already setup.');
- });
-
- it('should revert because interaction with library is forbidden', async () => {
- const {identityImplementation, aliceWallet, deployerWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(identityImplementation.connect(deployerWallet).addKey(
- ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- ),
- 3,
- 1,
- )).to.be.revertedWith('Interacting with the library contract is forbidden.');
-
- await expect(identityImplementation.connect(aliceWallet).initialize(deployerWallet.address))
- .to.be.revertedWith('Initial key was already setup.');
- });
-
- it('should prevent creating an identity with an invalid initial key', async () => {
- const [identityOwnerWallet] = await ethers.getSigners();
-
- const Identity = await ethers.getContractFactory('Identity');
- await expect(Identity.connect(identityOwnerWallet).deploy(ethers.constants.AddressZero, false)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should return the version of the implementation', async () => {
- const {identityImplementation} = await loadFixture(deployIdentityFixture);
-
- expect(await identityImplementation.version()).to.equal('2.2.1');
- });
-});
diff --git a/test/identities/keys.test.ts b/test/identities/keys.test.ts
deleted file mode 100644
index e9165777..00000000
--- a/test/identities/keys.test.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
-import { expect } from "chai";
-import {ethers} from "hardhat";
-
-import { deployIdentityFixture } from '../fixtures';
-
-describe('Identity', () => {
- describe('Key Management', () => {
- describe('Read key methods', () => {
- it('should retrieve an existing key', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- const aliceKey = await aliceIdentity.getKey(aliceKeyHash);
- expect(aliceKey.key).to.equal(aliceKeyHash);
- expect(aliceKey.purposes).to.deep.equal([1]);
- expect(aliceKey.keyType).to.equal(1);
- });
-
- it('should retrieve existing key purposes', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- const purposes = await aliceIdentity.getKeyPurposes(aliceKeyHash);
- expect(purposes).to.deep.equal([1]);
- });
-
- it('should retrieve existing keys with given purpose', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- const keys = await aliceIdentity.getKeysByPurpose(1);
- expect(keys).to.deep.equal([aliceKeyHash]);
- });
-
- it('should return true if a key has a given purpose', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- const hasPurpose = await aliceIdentity.keyHasPurpose(aliceKeyHash, 1);
- expect(hasPurpose).to.equal(true);
- });
-
- it('should return false if a key has not a given purpose but is a MANAGEMENT key', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- const hasPurpose = await aliceIdentity.keyHasPurpose(aliceKeyHash, 2);
- expect(hasPurpose).to.equal(true);
- });
-
- it('should return false if a key has not a given purpose', async () => {
- const { aliceIdentity, bobWallet } = await loadFixture(deployIdentityFixture);
-
- const bobKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])
- );
- const hasPurpose = await aliceIdentity.keyHasPurpose(bobKeyHash, 2);
- expect(hasPurpose).to.equal(false);
- });
- });
-
- describe('Add key methods', () => {
- describe('when calling as a non-MANAGEMENT key', () => {
- it('should revert because the signer is not a MANAGEMENT key', async () => {
- const { aliceIdentity, bobWallet } = await loadFixture(deployIdentityFixture);
-
- const bobKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])
- );
- await expect(
- aliceIdentity.connect(bobWallet).addKey(bobKeyHash, 1, 1)
- ).to.be.revertedWith('Permissions: Sender does not have management key');
- });
- });
-
- describe('when calling as a MANAGEMENT key', () => {
- it('should add the purpose to the existing key', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- await aliceIdentity.connect(aliceWallet).addKey(aliceKeyHash, 2, 1);
- const aliceKey = await aliceIdentity.getKey(aliceKeyHash);
- expect(aliceKey.key).to.equal(aliceKeyHash);
- expect(aliceKey.purposes).to.deep.equal([1, 2]);
- expect(aliceKey.keyType).to.equal(1);
- });
-
- it('should add a new key with a purpose', async () => {
- const { aliceIdentity, bobWallet, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const bobKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])
- );
- await aliceIdentity.connect(aliceWallet).addKey(bobKeyHash, 1, 1);
- const bobKey = await aliceIdentity.getKey(bobKeyHash);
- expect(bobKey.key).to.equal(bobKeyHash);
- expect(bobKey.purposes).to.deep.equal([1]);
- expect(bobKey.keyType).to.equal(1);
- });
-
- it('should revert because key already has the purpose', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- await expect(
- aliceIdentity.connect(aliceWallet).addKey(aliceKeyHash, 1, 1)
- ).to.be.revertedWith('Conflict: Key already has purpose');
- });
- });
- });
-
- describe('Remove key methods', () => {
- describe('when calling as a non-MANAGEMENT key', () => {
- it('should revert because the signer is not a MANAGEMENT key', async () => {
- const { aliceIdentity, aliceWallet, bobWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- await expect(
- aliceIdentity.connect(bobWallet).removeKey(aliceKeyHash, 1)
- ).to.be.revertedWith('Permissions: Sender does not have management key');
- });
- });
-
- describe('when calling as a MANAGEMENT key', () => {
- it('should remove the purpose from the existing key', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- await aliceIdentity.connect(aliceWallet).removeKey(aliceKeyHash, 1);
- const aliceKey = await aliceIdentity.getKey(aliceKeyHash);
- expect(aliceKey.key).to.equal('0x0000000000000000000000000000000000000000000000000000000000000000');
- expect(aliceKey.purposes).to.deep.equal([]);
- expect(aliceKey.keyType).to.equal(0);
- });
-
- it('should revert because key does not exists', async () => {
- const { aliceIdentity, aliceWallet, bobWallet } = await loadFixture(deployIdentityFixture);
-
- const bobKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [bobWallet.address])
- );
- await expect(
- aliceIdentity.connect(aliceWallet).removeKey(bobKeyHash, 2)
- ).to.be.revertedWith("NonExisting: Key isn't registered");
- });
-
- it('should revert because key does not have the purpose', async () => {
- const { aliceIdentity, aliceWallet } = await loadFixture(deployIdentityFixture);
-
- const aliceKeyHash = ethers.utils.keccak256(
- ethers.utils.defaultAbiCoder.encode(['address'], [aliceWallet.address])
- );
- await expect(
- aliceIdentity.connect(aliceWallet).removeKey(aliceKeyHash, 2)
- ).to.be.revertedWith("NonExisting: Key doesn't have such purpose");
- });
- });
- });
- });
-});
diff --git a/test/identity-utilities/IdentityUtilities.t.sol b/test/identity-utilities/IdentityUtilities.t.sol
new file mode 100644
index 00000000..0ea248fd
--- /dev/null
+++ b/test/identity-utilities/IdentityUtilities.t.sol
@@ -0,0 +1,1030 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+import { ClaimIssuerHelper } from "../helpers/ClaimIssuerHelper.sol";
+import { ClaimSignerHelper } from "../helpers/ClaimSignerHelper.sol";
+import { IdentityHelper } from "../helpers/IdentityHelper.sol";
+import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
+import { ClaimIssuer } from "contracts/ClaimIssuer.sol";
+import { Identity } from "contracts/Identity.sol";
+import { IdentityUtilities } from "contracts/IdentityUtilities.sol";
+import { IIdentityUtilities } from "contracts/interface/IIdentityUtilities.sol";
+import { KeyPurposes } from "contracts/libraries/KeyPurposes.sol";
+import { KeyTypes } from "contracts/libraries/KeyTypes.sol";
+import { IdentityUtilitiesProxy } from "contracts/proxy/IdentityUtilitiesProxy.sol";
+import { Test } from "forge-std/Test.sol";
+import { Test as TestContract } from "test/mocks/Test.sol";
+import { TestIdentityUtilities } from "test/mocks/TestIdentityUtilities.sol";
+
+/// @notice Test suite for IdentityUtilities topic schema registry
+contract IdentityUtilitiesTest is Test {
+
+ IdentityUtilities internal utilities;
+ address internal admin;
+ uint256 internal adminPk;
+ address internal user;
+
+ function setUp() public {
+ (admin, adminPk) = makeAddrAndKey("utilAdmin");
+ user = makeAddr("utilUser");
+
+ IdentityUtilities impl = new IdentityUtilities();
+ IdentityUtilitiesProxy proxy =
+ new IdentityUtilitiesProxy(address(impl), abi.encodeCall(IdentityUtilities.initialize, (admin)));
+ utilities = IdentityUtilities(address(proxy));
+ }
+
+ // ---- internal helpers ----
+
+ function _encodeNames(string[] memory names) internal pure returns (bytes memory) {
+ return abi.encode(names);
+ }
+
+ function _encodeTypes(string[] memory types) internal pure returns (bytes memory) {
+ return abi.encode(types);
+ }
+
+ function _singleStringArray(string memory s) internal pure returns (string[] memory arr) {
+ arr = new string[](1);
+ arr[0] = s;
+ }
+
+ function _addDefaultTopic(
+ uint256 topicId,
+ string memory name,
+ string[] memory fieldNames,
+ string[] memory fieldTypes
+ ) internal {
+ vm.prank(admin);
+ utilities.addTopic(topicId, name, _encodeNames(fieldNames), _encodeTypes(fieldTypes));
+ }
+
+ // =========================================================================
+ // Topic schema examples from AssetID spec
+ // =========================================================================
+
+ function test_addAndRetrieveNAVPerShare() public {
+ uint256 topicId = 1000003;
+ string[] memory fieldNames = new string[](3);
+ fieldNames[0] = "value";
+ fieldNames[1] = "decimals";
+ fieldNames[2] = "timestamp";
+ string[] memory fieldTypes = new string[](3);
+ fieldTypes[0] = "uint256";
+ fieldTypes[1] = "uint256";
+ fieldTypes[2] = "uint256";
+
+ bytes memory encodedNames = _encodeNames(fieldNames);
+ bytes memory encodedTypes = _encodeTypes(fieldTypes);
+
+ vm.prank(admin);
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicAdded(topicId, "NAV Per Share", encodedNames, encodedTypes);
+ utilities.addTopic(topicId, "NAV Per Share", encodedNames, encodedTypes);
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(topicId);
+ assertEq(retNames.length, 3);
+ assertEq(retNames[0], "value");
+ assertEq(retNames[1], "decimals");
+ assertEq(retNames[2], "timestamp");
+ assertEq(retTypes[0], "uint256");
+ assertEq(retTypes[1], "uint256");
+ assertEq(retTypes[2], "uint256");
+ }
+
+ function test_addISIN() public {
+ bytes memory encodedNames = _encodeNames(_singleStringArray("isin"));
+ bytes memory encodedTypes = _encodeTypes(_singleStringArray("string"));
+
+ vm.prank(admin);
+ utilities.addTopic(1000001, "ISIN", encodedNames, encodedTypes);
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1000001);
+ assertEq(retNames[0], "isin");
+ assertEq(retTypes[0], "string");
+ }
+
+ function test_addLEI() public {
+ _addDefaultTopic(1000002, "LEI", _singleStringArray("lei"), _singleStringArray("string"));
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1000002);
+ assertEq(retNames[0], "lei");
+ assertEq(retTypes[0], "string");
+ }
+
+ function test_addNAVGlobal() public {
+ string[] memory fieldNames = new string[](3);
+ fieldNames[0] = "value";
+ fieldNames[1] = "decimals";
+ fieldNames[2] = "timestamp";
+ string[] memory fieldTypes = new string[](3);
+ fieldTypes[0] = "uint256";
+ fieldTypes[1] = "uint256";
+ fieldTypes[2] = "uint256";
+
+ _addDefaultTopic(1000004, "NAV Global", fieldNames, fieldTypes);
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1000004);
+ assertEq(retNames.length, 3);
+ assertEq(retNames[0], "value");
+ assertEq(retTypes[2], "uint256");
+ }
+
+ function test_addBaseCurrency() public {
+ _addDefaultTopic(1000005, "Base Currency", _singleStringArray("currencyCode"), _singleStringArray("uint16"));
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1000005);
+ assertEq(retNames[0], "currencyCode");
+ assertEq(retTypes[0], "uint16");
+ }
+
+ function test_addQualificationURL() public {
+ _addDefaultTopic(1000006, "Qualification URL", _singleStringArray("urls"), _singleStringArray("string[]"));
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1000006);
+ assertEq(retNames[0], "urls");
+ assertEq(retTypes[0], "string[]");
+ }
+
+ function test_addERC3643Certificate() public {
+ _addDefaultTopic(1000007, "ERC3643 Certificate", _singleStringArray("issuer"), _singleStringArray("address"));
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1000007);
+ assertEq(retNames[0], "issuer");
+ assertEq(retTypes[0], "address");
+ }
+
+ // =========================================================================
+ // Validation and permissioning
+ // =========================================================================
+
+ function test_revertMismatchedNameTypes() public {
+ string[] memory names = _singleStringArray("field1");
+ string[] memory types = new string[](2);
+ types[0] = "uint256";
+ types[1] = "uint8";
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Field name/type count mismatch"));
+ utilities.addTopic(1234, "BrokenTopic", _encodeNames(names), _encodeTypes(types));
+ }
+
+ function test_revertNonTopicManagerCannotAdd() public {
+ vm.prank(user);
+ vm.expectRevert();
+ utilities.addTopic(
+ 1000002, "LEI", _encodeNames(_singleStringArray("lei")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ // =========================================================================
+ // addTopic - additional validation
+ // =========================================================================
+
+ function test_addTopic_revertEmptyName() public {
+ vm.prank(admin);
+ vm.expectRevert(bytes("Empty topic name"));
+ utilities.addTopic(
+ 1001, "", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ function test_addTopic_revertAlreadyExists() public {
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Topic already exists"));
+ utilities.addTopic(
+ 1001, "Test", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ function test_addTopic_revertEmptyFieldNamesArrayMismatch() public {
+ string[] memory names = new string[](0);
+ string[] memory types = _singleStringArray("string");
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Field name/type count mismatch"));
+ utilities.addTopic(1001, "Test", _encodeNames(names), _encodeTypes(types));
+ }
+
+ function test_addTopic_revertEmptyFieldName() public {
+ vm.prank(admin);
+ vm.expectRevert(bytes("Empty field name"));
+ utilities.addTopic(
+ 1001, "Test", _encodeNames(_singleStringArray("")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ function test_addTopic_revertEmptyFieldType() public {
+ vm.prank(admin);
+ vm.expectRevert(bytes("Empty field type"));
+ utilities.addTopic(
+ 1001, "Test", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray(""))
+ );
+ }
+
+ function test_addTopic_emptyArraysBothSides() public {
+ string[] memory names = new string[](0);
+ string[] memory types = new string[](0);
+
+ bytes memory encodedNames = _encodeNames(names);
+ bytes memory encodedTypes = _encodeTypes(types);
+
+ vm.prank(admin);
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicAdded(1001, "Empty Arrays Topic", encodedNames, encodedTypes);
+ utilities.addTopic(1001, "Empty Arrays Topic", encodedNames, encodedTypes);
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "Empty Arrays Topic");
+ assertEq(topic.encodedFieldNames, encodedNames);
+ assertEq(topic.encodedFieldTypes, encodedTypes);
+ }
+
+ function test_addTopic_complexFieldTypes() public {
+ string[] memory names = new string[](5);
+ names[0] = "address";
+ names[1] = "uint256";
+ names[2] = "bool";
+ names[3] = "string";
+ names[4] = "bytes";
+ string[] memory types = new string[](5);
+ types[0] = "address";
+ types[1] = "uint256";
+ types[2] = "bool";
+ types[3] = "string";
+ types[4] = "bytes";
+
+ bytes memory encodedNames = _encodeNames(names);
+ bytes memory encodedTypes = _encodeTypes(types);
+
+ vm.prank(admin);
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicAdded(1001, "Complex Topic", encodedNames, encodedTypes);
+ utilities.addTopic(1001, "Complex Topic", encodedNames, encodedTypes);
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "Complex Topic");
+ assertEq(topic.encodedFieldNames, encodedNames);
+ assertEq(topic.encodedFieldTypes, encodedTypes);
+ }
+
+ // =========================================================================
+ // updateTopic
+ // =========================================================================
+
+ function test_updateTopic_success() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ string[] memory newNames = new string[](2);
+ newNames[0] = "field1";
+ newNames[1] = "field2";
+ string[] memory newTypes = new string[](2);
+ newTypes[0] = "string";
+ newTypes[1] = "uint256";
+
+ bytes memory encodedNames = _encodeNames(newNames);
+ bytes memory encodedTypes = _encodeTypes(newTypes);
+
+ vm.prank(admin);
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicUpdated(1001, "Updated", encodedNames, encodedTypes);
+ utilities.updateTopic(1001, "Updated", encodedNames, encodedTypes);
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "Updated");
+ assertEq(topic.encodedFieldNames, encodedNames);
+ assertEq(topic.encodedFieldTypes, encodedTypes);
+ }
+
+ function test_updateTopic_revertNonExistent() public {
+ vm.prank(admin);
+ vm.expectRevert(bytes("Topic does not exist"));
+ utilities.updateTopic(
+ 9999, "Updated", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ function test_updateTopic_revertEmptyName() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Empty topic name"));
+ utilities.updateTopic(
+ 1001, "", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ function test_updateTopic_revertMismatch() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ string[] memory names = _singleStringArray("field1");
+ string[] memory types = new string[](2);
+ types[0] = "string";
+ types[1] = "uint256";
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Field name/type count mismatch"));
+ utilities.updateTopic(1001, "Updated", _encodeNames(names), _encodeTypes(types));
+ }
+
+ function test_updateTopic_revertEmptyFieldName() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Empty field name"));
+ utilities.updateTopic(
+ 1001, "Updated", _encodeNames(_singleStringArray("")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ function test_updateTopic_revertEmptyFieldType() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ vm.expectRevert(bytes("Empty field type"));
+ utilities.updateTopic(
+ 1001, "Updated", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray(""))
+ );
+ }
+
+ function test_updateTopic_revertNonManager() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(user);
+ vm.expectRevert();
+ utilities.updateTopic(
+ 1001, "Updated", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ }
+
+ // =========================================================================
+ // removeTopic
+ // =========================================================================
+
+ function test_removeTopic_success() public {
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicRemoved(1001);
+ utilities.removeTopic(1001);
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "");
+ assertEq(topic.encodedFieldNames, bytes(""));
+ assertEq(topic.encodedFieldTypes, bytes(""));
+ }
+
+ function test_removeTopic_revertNonExistent() public {
+ vm.prank(admin);
+ vm.expectRevert(bytes("Topic does not exist"));
+ utilities.removeTopic(9999);
+ }
+
+ function test_removeTopic_revertNonManager() public {
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(user);
+ vm.expectRevert();
+ utilities.removeTopic(1001);
+ }
+
+ function test_removeTopic_thenReadd() public {
+ bytes memory encodedNames = _encodeNames(_singleStringArray("field1"));
+ bytes memory encodedTypes = _encodeTypes(_singleStringArray("string"));
+
+ vm.startPrank(admin);
+ utilities.addTopic(1001, "Test", encodedNames, encodedTypes);
+ utilities.removeTopic(1001);
+
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicAdded(1001, "Test", encodedNames, encodedTypes);
+ utilities.addTopic(1001, "Test", encodedNames, encodedTypes);
+ vm.stopPrank();
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "Test");
+ assertEq(topic.encodedFieldNames, encodedNames);
+ assertEq(topic.encodedFieldTypes, encodedTypes);
+ }
+
+ // =========================================================================
+ // getTopic
+ // =========================================================================
+
+ function test_getTopic_nonExistent() public view {
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(9999);
+ assertEq(topic.name, "");
+ assertEq(topic.encodedFieldNames, bytes(""));
+ assertEq(topic.encodedFieldTypes, bytes(""));
+ }
+
+ function test_getTopic_existing() public {
+ string[] memory names = new string[](3);
+ names[0] = "field1";
+ names[1] = "field2";
+ names[2] = "field3";
+ string[] memory types = new string[](3);
+ types[0] = "string";
+ types[1] = "uint256";
+ types[2] = "bool";
+
+ bytes memory encodedNames = _encodeNames(names);
+ bytes memory encodedTypes = _encodeTypes(types);
+
+ _addDefaultTopic(1001, "Test", names, types);
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "Test");
+ assertEq(topic.encodedFieldNames, encodedNames);
+ assertEq(topic.encodedFieldTypes, encodedTypes);
+ }
+
+ function test_getTopic_afterUpdate() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ string[] memory newNames = new string[](2);
+ newNames[0] = "field1";
+ newNames[1] = "field2";
+ string[] memory newTypes = new string[](2);
+ newTypes[0] = "string";
+ newTypes[1] = "uint256";
+
+ bytes memory newEncodedNames = _encodeNames(newNames);
+ bytes memory newEncodedTypes = _encodeTypes(newTypes);
+
+ vm.prank(admin);
+ utilities.updateTopic(1001, "Updated", newEncodedNames, newEncodedTypes);
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "Updated");
+ assertEq(topic.encodedFieldNames, newEncodedNames);
+ assertEq(topic.encodedFieldTypes, newEncodedTypes);
+ }
+
+ // =========================================================================
+ // getFieldNames
+ // =========================================================================
+
+ function test_getFieldNames_nonExistent() public view {
+ string[] memory names = utilities.getFieldNames(9999);
+ assertEq(names.length, 0);
+ }
+
+ function test_getFieldNames_existing() public {
+ string[] memory names = new string[](3);
+ names[0] = "field1";
+ names[1] = "field2";
+ names[2] = "field3";
+ string[] memory types = new string[](3);
+ types[0] = "string";
+ types[1] = "uint256";
+ types[2] = "bool";
+
+ _addDefaultTopic(1001, "Test", names, types);
+
+ string[] memory retNames = utilities.getFieldNames(1001);
+ assertEq(retNames.length, 3);
+ assertEq(retNames[0], "field1");
+ assertEq(retNames[1], "field2");
+ assertEq(retNames[2], "field3");
+ }
+
+ function test_getFieldNames_afterUpdate() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ string[] memory newNames = new string[](2);
+ newNames[0] = "newField1";
+ newNames[1] = "newField2";
+ string[] memory newTypes = new string[](2);
+ newTypes[0] = "string";
+ newTypes[1] = "uint256";
+
+ vm.prank(admin);
+ utilities.updateTopic(1001, "Updated", _encodeNames(newNames), _encodeTypes(newTypes));
+
+ string[] memory retNames = utilities.getFieldNames(1001);
+ assertEq(retNames.length, 2);
+ assertEq(retNames[0], "newField1");
+ assertEq(retNames[1], "newField2");
+ }
+
+ function test_getFieldNames_afterRemove() public {
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ utilities.removeTopic(1001);
+
+ string[] memory retNames = utilities.getFieldNames(1001);
+ assertEq(retNames.length, 0);
+ }
+
+ // =========================================================================
+ // getFieldTypes
+ // =========================================================================
+
+ function test_getFieldTypes_nonExistent() public view {
+ string[] memory types = utilities.getFieldTypes(9999);
+ assertEq(types.length, 0);
+ }
+
+ function test_getFieldTypes_existing() public {
+ string[] memory names = new string[](3);
+ names[0] = "field1";
+ names[1] = "field2";
+ names[2] = "field3";
+ string[] memory types = new string[](3);
+ types[0] = "string";
+ types[1] = "uint256";
+ types[2] = "bool";
+
+ _addDefaultTopic(1001, "Test", names, types);
+
+ string[] memory retTypes = utilities.getFieldTypes(1001);
+ assertEq(retTypes.length, 3);
+ assertEq(retTypes[0], "string");
+ assertEq(retTypes[1], "uint256");
+ assertEq(retTypes[2], "bool");
+ }
+
+ function test_getFieldTypes_afterUpdate() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ string[] memory newNames = new string[](2);
+ newNames[0] = "newField1";
+ newNames[1] = "newField2";
+ string[] memory newTypes = new string[](2);
+ newTypes[0] = "string";
+ newTypes[1] = "uint256";
+
+ vm.prank(admin);
+ utilities.updateTopic(1001, "Updated", _encodeNames(newNames), _encodeTypes(newTypes));
+
+ string[] memory retTypes = utilities.getFieldTypes(1001);
+ assertEq(retTypes.length, 2);
+ assertEq(retTypes[0], "string");
+ assertEq(retTypes[1], "uint256");
+ }
+
+ function test_getFieldTypes_afterRemove() public {
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ utilities.removeTopic(1001);
+
+ string[] memory retTypes = utilities.getFieldTypes(1001);
+ assertEq(retTypes.length, 0);
+ }
+
+ // =========================================================================
+ // getSchema
+ // =========================================================================
+
+ function test_getSchema_nonExistent() public view {
+ (string[] memory names, string[] memory types) = utilities.getSchema(9999);
+ assertEq(names.length, 0);
+ assertEq(types.length, 0);
+ }
+
+ function test_getSchema_existing() public {
+ string[] memory names = new string[](3);
+ names[0] = "field1";
+ names[1] = "field2";
+ names[2] = "field3";
+ string[] memory types = new string[](3);
+ types[0] = "string";
+ types[1] = "uint256";
+ types[2] = "bool";
+
+ _addDefaultTopic(1001, "Test", names, types);
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1001);
+ assertEq(retNames.length, 3);
+ assertEq(retTypes.length, 3);
+ assertEq(retNames[0], "field1");
+ assertEq(retNames[1], "field2");
+ assertEq(retNames[2], "field3");
+ assertEq(retTypes[0], "string");
+ assertEq(retTypes[1], "uint256");
+ assertEq(retTypes[2], "bool");
+ }
+
+ function test_getSchema_afterUpdate() public {
+ _addDefaultTopic(1001, "Initial", _singleStringArray("field1"), _singleStringArray("string"));
+
+ string[] memory newNames = new string[](2);
+ newNames[0] = "newField1";
+ newNames[1] = "newField2";
+ string[] memory newTypes = new string[](2);
+ newTypes[0] = "string";
+ newTypes[1] = "uint256";
+
+ vm.prank(admin);
+ utilities.updateTopic(1001, "Updated", _encodeNames(newNames), _encodeTypes(newTypes));
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1001);
+ assertEq(retNames.length, 2);
+ assertEq(retTypes.length, 2);
+ assertEq(retNames[0], "newField1");
+ assertEq(retNames[1], "newField2");
+ assertEq(retTypes[0], "string");
+ assertEq(retTypes[1], "uint256");
+ }
+
+ function test_getSchema_afterRemove() public {
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ vm.prank(admin);
+ utilities.removeTopic(1001);
+
+ (string[] memory retNames, string[] memory retTypes) = utilities.getSchema(1001);
+ assertEq(retNames.length, 0);
+ assertEq(retTypes.length, 0);
+ }
+
+ // =========================================================================
+ // getTopicInfos
+ // =========================================================================
+
+ function test_getTopicInfos_emptyInput() public view {
+ uint256[] memory ids = new uint256[](0);
+ IIdentityUtilities.TopicInfo[] memory result = utilities.getTopicInfos(ids);
+ assertEq(result.length, 0);
+ }
+
+ function test_getTopicInfos_singleExisting() public {
+ bytes memory encodedNames = _encodeNames(_singleStringArray("field1"));
+ bytes memory encodedTypes = _encodeTypes(_singleStringArray("string"));
+
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ uint256[] memory ids = new uint256[](1);
+ ids[0] = 1001;
+ IIdentityUtilities.TopicInfo[] memory result = utilities.getTopicInfos(ids);
+ assertEq(result.length, 1);
+ assertEq(result[0].name, "Test");
+ assertEq(result[0].encodedFieldNames, encodedNames);
+ assertEq(result[0].encodedFieldTypes, encodedTypes);
+ }
+
+ function test_getTopicInfos_multiple() public {
+ vm.startPrank(admin);
+ utilities.addTopic(10, "A", _encodeNames(_singleStringArray("f1")), _encodeTypes(_singleStringArray("string")));
+ utilities.addTopic(20, "B", _encodeNames(_singleStringArray("f2")), _encodeTypes(_singleStringArray("uint256")));
+ vm.stopPrank();
+
+ uint256[] memory ids = new uint256[](2);
+ ids[0] = 10;
+ ids[1] = 20;
+ IIdentityUtilities.TopicInfo[] memory result = utilities.getTopicInfos(ids);
+ assertEq(result.length, 2);
+ assertEq(result[0].name, "A");
+ assertEq(result[1].name, "B");
+ assertEq(result[0].encodedFieldNames, _encodeNames(_singleStringArray("f1")));
+ assertEq(result[1].encodedFieldTypes, _encodeTypes(_singleStringArray("uint256")));
+ }
+
+ function test_getTopicInfos_multipleThreeTopics() public {
+ vm.startPrank(admin);
+ utilities.addTopic(
+ 1001, "Topic 1", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ utilities.addTopic(
+ 1002, "Topic 2", _encodeNames(_singleStringArray("field2")), _encodeTypes(_singleStringArray("uint256"))
+ );
+ utilities.addTopic(
+ 1003, "Topic 3", _encodeNames(_singleStringArray("field3")), _encodeTypes(_singleStringArray("bool"))
+ );
+ vm.stopPrank();
+
+ uint256[] memory ids = new uint256[](3);
+ ids[0] = 1001;
+ ids[1] = 1002;
+ ids[2] = 1003;
+ IIdentityUtilities.TopicInfo[] memory result = utilities.getTopicInfos(ids);
+ assertEq(result.length, 3);
+ assertEq(result[0].name, "Topic 1");
+ assertEq(result[1].name, "Topic 2");
+ assertEq(result[2].name, "Topic 3");
+ assertEq(result[0].encodedFieldNames, _encodeNames(_singleStringArray("field1")));
+ assertEq(result[1].encodedFieldTypes, _encodeTypes(_singleStringArray("uint256")));
+ assertEq(result[2].encodedFieldTypes, _encodeTypes(_singleStringArray("bool")));
+ }
+
+ function test_getTopicInfos_nonExistent() public view {
+ uint256[] memory ids = new uint256[](3);
+ ids[0] = 9999;
+ ids[1] = 8888;
+ ids[2] = 7777;
+ IIdentityUtilities.TopicInfo[] memory result = utilities.getTopicInfos(ids);
+ assertEq(result.length, 3);
+ assertEq(result[0].name, "");
+ assertEq(result[1].name, "");
+ assertEq(result[2].name, "");
+ assertEq(result[0].encodedFieldNames, bytes(""));
+ assertEq(result[1].encodedFieldNames, bytes(""));
+ assertEq(result[2].encodedFieldNames, bytes(""));
+ }
+
+ function test_getTopicInfos_mixed() public {
+ bytes memory encodedNames = _encodeNames(_singleStringArray("field1"));
+ bytes memory encodedTypes = _encodeTypes(_singleStringArray("string"));
+
+ _addDefaultTopic(1001, "Test", _singleStringArray("field1"), _singleStringArray("string"));
+
+ uint256[] memory ids = new uint256[](2);
+ ids[0] = 1001;
+ ids[1] = 9999;
+ IIdentityUtilities.TopicInfo[] memory result = utilities.getTopicInfos(ids);
+ assertEq(result.length, 2);
+ assertEq(result[0].name, "Test");
+ assertEq(result[0].encodedFieldNames, encodedNames);
+ assertEq(result[0].encodedFieldTypes, encodedTypes);
+ assertEq(result[1].name, "");
+ assertEq(result[1].encodedFieldNames, bytes(""));
+ assertEq(result[1].encodedFieldTypes, bytes(""));
+ }
+
+ // =========================================================================
+ // Access control - full CRUD by admin
+ // =========================================================================
+
+ function test_accessControl_fullCRUD() public {
+ bytes memory encodedNames = _encodeNames(_singleStringArray("field1"));
+ bytes memory encodedTypes = _encodeTypes(_singleStringArray("string"));
+
+ vm.startPrank(admin);
+
+ // Add
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicAdded(1001, "Test", encodedNames, encodedTypes);
+ utilities.addTopic(1001, "Test", encodedNames, encodedTypes);
+
+ // Update
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicUpdated(1001, "Updated", encodedNames, encodedTypes);
+ utilities.updateTopic(1001, "Updated", encodedNames, encodedTypes);
+
+ // Remove
+ vm.expectEmit(true, true, true, true, address(utilities));
+ emit IIdentityUtilities.TopicRemoved(1001);
+ utilities.removeTopic(1001);
+
+ vm.stopPrank();
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "");
+ }
+
+ // =========================================================================
+ // Edge cases and stress testing
+ // =========================================================================
+
+ function test_topicWithManyFields() public {
+ string[] memory names = new string[](10);
+ string[] memory types = new string[](10);
+ for (uint256 i = 0; i < 10; i++) {
+ names[i] = string(abi.encodePacked("field", vm.toString(i)));
+ types[i] = i % 2 == 0 ? "string" : "uint256";
+ }
+
+ _addDefaultTopic(1001, "Large Topic", names, types);
+
+ string[] memory retNames = utilities.getFieldNames(1001);
+ string[] memory retTypes = utilities.getFieldTypes(1001);
+ assertEq(retNames.length, 10);
+ assertEq(retTypes.length, 10);
+ assertEq(retNames[0], "field0");
+ assertEq(retNames[9], "field9");
+ assertEq(retTypes[0], "string");
+ assertEq(retTypes[1], "uint256");
+ }
+
+ function test_topicWithLongNames() public {
+ string memory longName = "this_is_a_very_long_field_name_that_might_be_used_in_real_world_scenarios";
+ string memory longType = "this_is_a_very_long_field_type_that_might_be_used_in_real_world_scenarios";
+
+ _addDefaultTopic(1001, "Long Names Topic", _singleStringArray(longName), _singleStringArray(longType));
+
+ string[] memory retNames = utilities.getFieldNames(1001);
+ string[] memory retTypes = utilities.getFieldTypes(1001);
+ assertEq(retNames[0], longName);
+ assertEq(retTypes[0], longType);
+ }
+
+ function test_rapidAddUpdateRemove() public {
+ bytes memory encodedNames = _encodeNames(_singleStringArray("field1"));
+ bytes memory encodedTypes = _encodeTypes(_singleStringArray("string"));
+
+ vm.startPrank(admin);
+ utilities.addTopic(1001, "Test", encodedNames, encodedTypes);
+ utilities.updateTopic(1001, "Updated", encodedNames, encodedTypes);
+ utilities.removeTopic(1001);
+ vm.stopPrank();
+
+ IIdentityUtilities.TopicInfo memory topic = utilities.getTopic(1001);
+ assertEq(topic.name, "");
+ assertEq(topic.encodedFieldNames, bytes(""));
+ assertEq(topic.encodedFieldTypes, bytes(""));
+ }
+
+ function test_multipleTopicsSameFieldNamesDifferentTypes() public {
+ vm.startPrank(admin);
+ utilities.addTopic(
+ 1001, "Topic 1", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("string"))
+ );
+ utilities.addTopic(
+ 1002, "Topic 2", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("uint256"))
+ );
+ utilities.addTopic(
+ 1003, "Topic 3", _encodeNames(_singleStringArray("field1")), _encodeTypes(_singleStringArray("bool"))
+ );
+ vm.stopPrank();
+
+ string[] memory types1 = utilities.getFieldTypes(1001);
+ string[] memory types2 = utilities.getFieldTypes(1002);
+ string[] memory types3 = utilities.getFieldTypes(1003);
+ assertEq(types1[0], "string");
+ assertEq(types2[0], "uint256");
+ assertEq(types3[0], "bool");
+
+ string[] memory names1 = utilities.getFieldNames(1001);
+ string[] memory names2 = utilities.getFieldNames(1002);
+ string[] memory names3 = utilities.getFieldNames(1003);
+ assertEq(names1[0], "field1");
+ assertEq(names2[0], "field1");
+ assertEq(names3[0], "field1");
+ }
+
+ // =========================================================================
+ // getClaimsWithTopicInfo
+ // =========================================================================
+
+ function test_getClaimsWithTopicInfo() public {
+ // Add topics
+ vm.startPrank(admin);
+ utilities.addTopic(
+ 1001, "KYC", _encodeNames(_singleStringArray("status")), _encodeTypes(_singleStringArray("string"))
+ );
+ utilities.addTopic(
+ 1002, "AML", _encodeNames(_singleStringArray("level")), _encodeTypes(_singleStringArray("uint8"))
+ );
+ vm.stopPrank();
+
+ // Deploy ClaimIssuer and Identity
+ (address claimIssuerOwner, uint256 claimIssuerOwnerPk) = makeAddrAndKey("ciOwner");
+ address identityOwner = makeAddr("idOwner");
+ (address claimSigner,) = makeAddrAndKey("claimSigner");
+
+ ClaimIssuer ci = ClaimIssuerHelper.deployWithProxy(claimIssuerOwner);
+ Identity identity = IdentityHelper.deployIdentityWithProxy(identityOwner);
+
+ // Add CLAIM_SIGNER key to claim issuer for the claimIssuerOwner
+ vm.prank(claimIssuerOwner);
+ ci.addKey(ClaimSignerHelper.addressToKey(claimIssuerOwner), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Add CLAIM_SIGNER key to identity for claimSigner
+ vm.prank(identityOwner);
+ identity.addKey(ClaimSignerHelper.addressToKey(claimSigner), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Build claims
+ bytes memory claimData1 = abi.encode("verified");
+ bytes memory claimData2 = abi.encode(uint8(2));
+
+ bytes memory sig1 = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(identity), 1001, claimData1);
+ bytes memory sig2 = ClaimSignerHelper.signClaim(claimIssuerOwnerPk, address(identity), 1002, claimData2);
+
+ // Add claims to identity via claimSigner (has CLAIM_SIGNER key)
+ vm.startPrank(claimSigner);
+ identity.addClaim(1001, 1, address(ci), sig1, claimData1, "https://example.com/kyc");
+ identity.addClaim(1002, 1, address(ci), sig2, claimData2, "https://example.com/aml");
+ vm.stopPrank();
+
+ // Query
+ uint256[] memory topicIds = new uint256[](2);
+ topicIds[0] = 1001;
+ topicIds[1] = 1002;
+ IIdentityUtilities.ClaimInfo[] memory result = utilities.getClaimsWithTopicInfo(address(identity), topicIds);
+
+ assertEq(result.length, 2);
+
+ // Verify KYC claim
+ assertEq(result[0].scheme, 1);
+ assertEq(result[0].issuer, address(ci));
+ assertTrue(result[0].isValid);
+ assertEq(result[0].data, claimData1);
+ assertEq(result[0].uri, "https://example.com/kyc");
+ assertEq(result[0].topic.name, "KYC");
+ assertEq(result[0].topic.encodedFieldNames, _encodeNames(_singleStringArray("status")));
+ assertEq(result[0].topic.encodedFieldTypes, _encodeTypes(_singleStringArray("string")));
+
+ // Verify AML claim
+ assertEq(result[1].scheme, 1);
+ assertEq(result[1].issuer, address(ci));
+ assertTrue(result[1].isValid);
+ assertEq(result[1].data, claimData2);
+ assertEq(result[1].uri, "https://example.com/aml");
+ assertEq(result[1].topic.name, "AML");
+ assertEq(result[1].topic.encodedFieldNames, _encodeNames(_singleStringArray("level")));
+ assertEq(result[1].topic.encodedFieldTypes, _encodeTypes(_singleStringArray("uint8")));
+
+ // Decode and verify claim data
+ string memory decodedKyc = abi.decode(result[0].data, (string));
+ assertEq(decodedKyc, "verified");
+ uint8 decodedAml = abi.decode(result[1].data, (uint8));
+ assertEq(decodedAml, 2);
+ }
+
+ function test_getClaimsWithTopicInfo_selfAttestedClaim() public {
+ // Add topic
+ _addDefaultTopic(3004, "Test Topic", _singleStringArray("name"), _singleStringArray("string"));
+
+ // Deploy Identity
+ Identity identity = IdentityHelper.deployIdentityWithProxy(admin);
+
+ // Add CLAIM_SIGNER key for admin on the identity
+ vm.prank(admin);
+ identity.addKey(ClaimSignerHelper.addressToKey(admin), KeyPurposes.CLAIM_SIGNER, KeyTypes.ECDSA);
+
+ // Sign claim properly for self-attested claim
+ bytes memory claimData = hex"";
+ bytes memory signature = ClaimSignerHelper.signClaim(adminPk, address(identity), 3004, claimData);
+
+ // Add a self-attested claim with valid signature
+ vm.prank(admin);
+ identity.addClaim(3004, 1, address(identity), signature, claimData, "https://example.com/claim");
+
+ // Query
+ uint256[] memory topicIds = new uint256[](1);
+ topicIds[0] = 3004;
+ IIdentityUtilities.ClaimInfo[] memory result = utilities.getClaimsWithTopicInfo(address(identity), topicIds);
+
+ assertGt(result.length, 0);
+ assertEq(result[0].issuer, address(identity));
+ }
+
+ // =========================================================================
+ // TestIdentityUtilities - _isClaimValid coverage
+ // =========================================================================
+
+ function test_isClaimValid_zeroAddressIssuer() public {
+ TestIdentityUtilities testUtil = new TestIdentityUtilities();
+ Identity identity = IdentityHelper.deployIdentityWithProxy(admin);
+
+ bool result = testUtil.checkIsClaimValid(address(identity), 3007, address(0), hex"", hex"");
+ assertFalse(result);
+ }
+
+ function test_isClaimValid_invalidContractIssuer() public {
+ TestIdentityUtilities testUtil = new TestIdentityUtilities();
+ Identity identity = IdentityHelper.deployIdentityWithProxy(admin);
+
+ // Deploy a contract that does not implement isClaimValid (catches and returns false)
+ TestContract invalidContract = new TestContract();
+
+ bool result = testUtil.checkIsClaimValid(address(identity), 3008, address(invalidContract), hex"", hex"");
+ assertFalse(result);
+ }
+
+ // =========================================================================
+ // UUPS upgrade
+ // =========================================================================
+
+ function test_upgrade_revertNonAdmin() public {
+ address nonAdmin = makeAddr("nonAdmin");
+ IdentityUtilities newImpl = new IdentityUtilities();
+
+ vm.prank(nonAdmin);
+ vm.expectRevert();
+ utilities.upgradeToAndCall(address(newImpl), bytes(""));
+ }
+
+ function test_upgrade_successAsAdmin() public {
+ IdentityUtilities newImpl = new IdentityUtilities();
+
+ vm.prank(admin);
+ utilities.upgradeToAndCall(address(newImpl), bytes(""));
+ }
+
+ // =========================================================================
+ // ERC1967 proxy deployment variant
+ // =========================================================================
+
+ function test_upgrade_viaERC1967Proxy_revertNonAdmin() public {
+ address deployer = makeAddr("erc1967deployer");
+ address nonAdmin = makeAddr("erc1967nonAdmin");
+
+ IdentityUtilities impl = new IdentityUtilities();
+ ERC1967Proxy proxy = new ERC1967Proxy(address(impl), abi.encodeCall(IdentityUtilities.initialize, (deployer)));
+ IdentityUtilities proxyUtil = IdentityUtilities(address(proxy));
+
+ IdentityUtilities newImpl = new IdentityUtilities();
+
+ vm.prank(nonAdmin);
+ vm.expectRevert();
+ proxyUtil.upgradeToAndCall(address(newImpl), bytes(""));
+ }
+
+}
diff --git a/test/mocks/RevertingIdentity.sol b/test/mocks/RevertingIdentity.sol
new file mode 100644
index 00000000..efb12bf3
--- /dev/null
+++ b/test/mocks/RevertingIdentity.sol
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity 0.8.27;
+
+/// @notice Mock identity whose initialize always reverts, causing IdentityProxy CREATE2 to fail
+contract RevertingIdentity {
+
+ function initialize(address) external pure {
+ revert("forced revert");
+ }
+
+}
diff --git a/test/mocks/Test.sol b/test/mocks/Test.sol
new file mode 100644
index 00000000..4f0318fb
--- /dev/null
+++ b/test/mocks/Test.sol
@@ -0,0 +1,4 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity 0.8.27;
+
+contract Test { } // solhint-disable-line
diff --git a/test/mocks/TestIdentityUtilities.sol b/test/mocks/TestIdentityUtilities.sol
new file mode 100644
index 00000000..65b53a43
--- /dev/null
+++ b/test/mocks/TestIdentityUtilities.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity 0.8.27;
+
+import { IdentityUtilities } from "contracts/IdentityUtilities.sol";
+import { IIdentity } from "contracts/interface/IIdentity.sol";
+
+contract TestIdentityUtilities is IdentityUtilities {
+
+ function checkIsClaimValid(
+ address identity,
+ uint256 topicId,
+ address issuer,
+ bytes memory signature,
+ bytes memory data
+ ) external view returns (bool) {
+ return _isClaimValid(identity, topicId, issuer, signature, data);
+ }
+
+}
diff --git a/test/proxy.test.ts b/test/proxy.test.ts
deleted file mode 100644
index b09daaa1..00000000
--- a/test/proxy.test.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import {expect} from "chai";
-import {ethers} from "hardhat";
-import {loadFixture} from "@nomicfoundation/hardhat-network-helpers";
-import {deployIdentityFixture} from "./fixtures";
-
-describe('Proxy', () => {
- it('should revert because implementation is Zero address', async () => {
- const [deployerWallet, identityOwnerWallet] = await ethers.getSigners();
-
- const IdentityProxy = await ethers.getContractFactory('IdentityProxy');
- await expect(IdentityProxy.connect(deployerWallet).deploy(ethers.constants.AddressZero, identityOwnerWallet.address)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should revert because implementation is not an identity', async () => {
- const [deployerWallet, identityOwnerWallet] = await ethers.getSigners();
-
- const claimIssuer = await ethers.deployContract('Test');
-
- const authority = await ethers.deployContract('ImplementationAuthority', [claimIssuer.address]);
-
- const IdentityProxy = await ethers.getContractFactory('IdentityProxy');
- await expect(IdentityProxy.connect(deployerWallet).deploy(authority.address, identityOwnerWallet.address)).to.be.revertedWith('Initialization failed.');
- });
-
- it('should revert because initial key is Zero address', async () => {
- const [deployerWallet] = await ethers.getSigners();
-
- const implementation = await ethers.deployContract('Identity', [deployerWallet.address, true]);
- const implementationAuthority = await ethers.deployContract('ImplementationAuthority', [implementation.address]);
-
- const IdentityProxy = await ethers.getContractFactory('IdentityProxy');
- await expect(IdentityProxy.connect(deployerWallet).deploy(implementationAuthority.address, ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should prevent creating an implementation authority with a zero address implementation', async () => {
- const [deployerWallet] = await ethers.getSigners();
-
- const ImplementationAuthority = await ethers.getContractFactory('ImplementationAuthority');
- await expect(ImplementationAuthority.connect(deployerWallet).deploy(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should prevent updating to a Zero address implementation', async () => {
- const {implementationAuthority, deployerWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(implementationAuthority.connect(deployerWallet).updateImplementation(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
-
- it('should prevent updating when not owner', async () => {
- const {implementationAuthority, aliceWallet} = await loadFixture(deployIdentityFixture);
-
- await expect(implementationAuthority.connect(aliceWallet).updateImplementation(ethers.constants.AddressZero)).to.be.revertedWith('Ownable: caller is not the owner');
- });
-
- it('should update the implementation address', async () => {
- const [deployerWallet] = await ethers.getSigners();
-
- const implementation = await ethers.deployContract('Identity', [deployerWallet.address, true]);
- const implementationAuthority = await ethers.deployContract('ImplementationAuthority', [implementation.address]);
-
- const newImplementation = await ethers.deployContract('Identity', [deployerWallet.address, true]);
-
- const tx = await implementationAuthority.connect(deployerWallet).updateImplementation(newImplementation.address);
- await expect(tx).to.emit(implementationAuthority, 'UpdatedImplementation').withArgs(newImplementation.address);
- });
-});
diff --git a/test/utils/Constants.sol b/test/utils/Constants.sol
new file mode 100644
index 00000000..c3a84cc4
--- /dev/null
+++ b/test/utils/Constants.sol
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-3.0
+pragma solidity ^0.8.27;
+
+library Constants {
+
+ // Common test claim values
+ uint256 internal constant CLAIM_TOPIC_666 = 666;
+ uint256 internal constant CLAIM_TOPIC_42 = 42;
+ uint256 internal constant CLAIM_TOPIC_999 = 999;
+ uint256 internal constant CLAIM_SCHEME = 1;
+
+ // Token identity test address
+ address internal constant TOKEN_ADDRESS = 0xdEE019486810C7C620f6098EEcacA0244b0fa3fB;
+
+}
diff --git a/test/verifiers/verifier-user.test.ts b/test/verifiers/verifier-user.test.ts
deleted file mode 100644
index 0d13edeb..00000000
--- a/test/verifiers/verifier-user.test.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-import {ethers} from "hardhat";
-import {expect} from "chai";
-
-describe('VerifierUser', () => {
- describe('when calling a verified function not as an identity', () => {
- it('should revert', async () => {
- const verifierUser = await ethers.deployContract('VerifierUser', []);
-
- await verifierUser.addClaimTopic(666);
-
- await expect(verifierUser.doSomething()).to.be.reverted;
- });
- });
-
- describe('when identity is verified', () => {
- it('should return', async () => {
- const [deployer, aliceWallet, claimIssuerWallet] = await ethers.getSigners();
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [claimIssuerWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
- const verifierUser = await ethers.deployContract('VerifierUser', []);
-
- await verifierUser.addClaimTopic(666);
- await verifierUser.addTrustedIssuer(claimIssuer.address, [666]);
-
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666.topic,
- aliceClaim666.scheme,
- aliceClaim666.issuer,
- aliceClaim666.signature,
- aliceClaim666.data,
- aliceClaim666.uri,
- );
-
- const action = {
- to: verifierUser.address,
- value: 0,
- data: new ethers.utils.Interface(['function doSomething()']).encodeFunctionData('doSomething'),
- };
-
- const tx = await aliceIdentity.connect(aliceWallet).execute(
- action.to,
- action.value,
- action.data,
- );
- expect(tx).to.emit(aliceIdentity, 'Executed');
- });
- });
-
- describe('when identity is not verified', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet, claimIssuerWallet] = await ethers.getSigners();
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [claimIssuerWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
- const verifierUser = await ethers.deployContract('VerifierUser', []);
-
- await verifierUser.addClaimTopic(666);
- await verifierUser.addTrustedIssuer(claimIssuer.address, [666]);
-
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666.topic,
- aliceClaim666.scheme,
- aliceClaim666.issuer,
- aliceClaim666.signature,
- aliceClaim666.data,
- aliceClaim666.uri,
- );
-
- await claimIssuer.connect(claimIssuerWallet).revokeClaimBySignature(aliceClaim666.signature);
-
- const action = {
- to: verifierUser.address,
- value: 0,
- data: new ethers.utils.Interface(['function doSomething()']).encodeFunctionData('doSomething'),
- };
-
- const tx = await aliceIdentity.connect(aliceWallet).execute(
- action.to,
- action.value,
- action.data,
- );
- expect(tx).to.emit(aliceIdentity, 'ExecutionFailed');
- });
- });
-});
diff --git a/test/verifiers/verifier.test.ts b/test/verifiers/verifier.test.ts
deleted file mode 100644
index 2e96d592..00000000
--- a/test/verifiers/verifier.test.ts
+++ /dev/null
@@ -1,523 +0,0 @@
-import {ethers} from "hardhat";
-import {expect} from "chai";
-
-
-describe('Verifier', () => {
- describe('.verify()', () => {
- describe('when the Verifier does expect claim topics', () => {
- it('should return true', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.verify(aliceWallet.address)).to.eventually.be.true;
- });
- });
-
- describe('when the Verifier expect one claim topic but has no trusted issuers', () => {
- it('should return false', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- await verifier.addClaimTopic(ethers.utils.formatBytes32String('SOME_TOPIC'));
-
- await expect(verifier.verify(aliceWallet.address)).to.eventually.be.false;
- });
- });
-
- describe('when the Verifier expect one claim topic and a trusted issuer for another topic', () => {
- it('should return false', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- await verifier.addClaimTopic(ethers.utils.formatBytes32String('SOME_TOPIC'));
- await verifier.addTrustedIssuer(deployer.address, [ethers.utils.formatBytes32String('SOME_OTHER_TOPIC')]);
-
- await expect(verifier.verify(aliceWallet.address)).to.eventually.be.false;
- });
- });
-
- describe('when the Verifier expect one claim topic and a trusted issuer for the topic', () => {
- describe('when the identity does not have the claim', () => {
- it('should return false', async () => {
- const [deployer, aliceWallet, claimIssuerWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [claimIssuerWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
- await verifier.addClaimTopic(ethers.utils.formatBytes32String('SOME_TOPIC'));
- await verifier.addTrustedIssuer(claimIssuer.address, [ethers.utils.formatBytes32String('SOME_TOPIC')]);
-
- await expect(verifier.verify(aliceIdentity.address)).to.eventually.be.false;
- });
- });
-
- describe('when the identity does not have a valid expected claim', () => {
- it('should return false', async () => {
- const [deployer, aliceWallet, claimIssuerWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [claimIssuerWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
-
- await verifier.addClaimTopic(666);
- await verifier.addTrustedIssuer(claimIssuer.address, [666]);
-
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666.topic,
- aliceClaim666.scheme,
- aliceClaim666.issuer,
- aliceClaim666.signature,
- aliceClaim666.data,
- aliceClaim666.uri,
- );
- await claimIssuer.connect(claimIssuerWallet).revokeClaimBySignature(
- aliceClaim666.signature,
- );
-
- await expect(verifier.verify(aliceIdentity.address)).to.eventually.be.false;
- });
- });
-
- describe('when the identity has the valid expected claim', () => {
- it('should return true', async () => {
- const [deployer, aliceWallet, claimIssuerWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [claimIssuerWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
-
- await verifier.addClaimTopic(666);
- await verifier.addTrustedIssuer(claimIssuer.address, [666]);
-
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuer.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.signature = await claimIssuerWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666.topic,
- aliceClaim666.scheme,
- aliceClaim666.issuer,
- aliceClaim666.signature,
- aliceClaim666.data,
- aliceClaim666.uri,
- );
-
- await expect(verifier.verify(aliceIdentity.address)).to.eventually.be.true;
- });
- });
- });
-
- describe('when the Verifier expect multiple claim topics and allow multiple trusted issuers', () => {
- describe('when identity is compliant', () => {
- it('should return true', async () => {
- const [deployer, aliceWallet, claimIssuerAWallet, claimIssuerBWallet, claimIssuerCWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuerA = await ethers.deployContract('ClaimIssuer', [claimIssuerAWallet.address]);
- const claimIssuerB = await ethers.deployContract('ClaimIssuer', [claimIssuerBWallet.address]);
- const claimIssuerC = await ethers.deployContract('ClaimIssuer', [claimIssuerCWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
-
- await verifier.addClaimTopic(666);
- await verifier.addTrustedIssuer(claimIssuerA.address, [666]);
- await verifier.addClaimTopic(42);
- await verifier.addTrustedIssuer(claimIssuerB.address, [42, 666]);
-
- const aliceClaim666C = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerC.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666C.signature = await claimIssuerCWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666C.identity, aliceClaim666C.topic, aliceClaim666C.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666C.topic,
- aliceClaim666C.scheme,
- aliceClaim666C.issuer,
- aliceClaim666C.signature,
- aliceClaim666C.data,
- aliceClaim666C.uri,
- );
-
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerA.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.signature = await claimIssuerAWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666.topic,
- aliceClaim666.scheme,
- aliceClaim666.issuer,
- aliceClaim666.signature,
- aliceClaim666.data,
- aliceClaim666.uri,
- );
-
- const aliceClaim666B = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerB.address,
- topic: 666,
- scheme: 1,
- data: '0x0066',
- signature: '',
- uri: 'https://example.com/B/666',
- };
- aliceClaim666B.signature = await claimIssuerBWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666B.identity, aliceClaim666B.topic, aliceClaim666B.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666B.topic,
- aliceClaim666B.scheme,
- aliceClaim666B.issuer,
- aliceClaim666B.signature,
- aliceClaim666B.data,
- aliceClaim666B.uri,
- );
-
- const aliceClaim42 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerB.address,
- topic: 42,
- scheme: 1,
- data: '0x0010',
- signature: '',
- uri: 'https://example.com/42',
- };
- aliceClaim42.signature = await claimIssuerBWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim42.identity, aliceClaim42.topic, aliceClaim42.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim42.topic,
- aliceClaim42.scheme,
- aliceClaim42.issuer,
- aliceClaim42.signature,
- aliceClaim42.data,
- aliceClaim42.uri,
- );
-
- await claimIssuerB.connect(claimIssuerBWallet).revokeClaimBySignature(aliceClaim666B.signature);
-
- await expect(verifier.verify(aliceIdentity.address)).to.eventually.be.true;
- });
- });
-
- describe('when identity is not compliant', () => {
- it('should return false', async () => {
- const [deployer, aliceWallet, claimIssuerAWallet, claimIssuerBWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuerA = await ethers.deployContract('ClaimIssuer', [claimIssuerAWallet.address]);
- const claimIssuerB = await ethers.deployContract('ClaimIssuer', [claimIssuerBWallet.address]);
- const aliceIdentity = await ethers.deployContract('Identity', [aliceWallet.address, false]);
-
- await verifier.addClaimTopic(666);
- await verifier.addTrustedIssuer(claimIssuerA.address, [666]);
- await verifier.addClaimTopic(42);
- await verifier.addTrustedIssuer(claimIssuerB.address, [42, 666]);
-
- const aliceClaim666 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerA.address,
- topic: 666,
- scheme: 1,
- data: '0x0042',
- signature: '',
- uri: 'https://example.com',
- };
- aliceClaim666.signature = await claimIssuerAWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666.identity, aliceClaim666.topic, aliceClaim666.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666.topic,
- aliceClaim666.scheme,
- aliceClaim666.issuer,
- aliceClaim666.signature,
- aliceClaim666.data,
- aliceClaim666.uri,
- );
-
- const aliceClaim666B = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerB.address,
- topic: 666,
- scheme: 1,
- data: '0x0066',
- signature: '',
- uri: 'https://example.com/B/666',
- };
- aliceClaim666B.signature = await claimIssuerBWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim666B.identity, aliceClaim666B.topic, aliceClaim666B.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim666B.topic,
- aliceClaim666B.scheme,
- aliceClaim666B.issuer,
- aliceClaim666B.signature,
- aliceClaim666B.data,
- aliceClaim666B.uri,
- );
-
- const aliceClaim42 = {
- id: '',
- identity: aliceIdentity.address,
- issuer: claimIssuerB.address,
- topic: 42,
- scheme: 1,
- data: '0x0010',
- signature: '',
- uri: 'https://example.com/42',
- };
- aliceClaim42.signature = await claimIssuerBWallet.signMessage(ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes'], [aliceClaim42.identity, aliceClaim42.topic, aliceClaim42.data]))));
- await aliceIdentity.connect(aliceWallet).addClaim(
- aliceClaim42.topic,
- aliceClaim42.scheme,
- aliceClaim42.issuer,
- aliceClaim42.signature,
- aliceClaim42.data,
- aliceClaim42.uri,
- );
-
- await claimIssuerB.connect(claimIssuerBWallet).revokeClaimBySignature(aliceClaim42.signature);
-
- await expect(verifier.verify(aliceIdentity.address)).to.eventually.be.false;
- });
- });
- });
- });
-
- describe('.removeClaimTopic', () => {
- describe('when not called by the owner', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.connect(aliceWallet).removeClaimTopic(2)).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when called by the owner', () => {
- it('should remove the claim topic', async () => {
- const [deployer] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- await verifier.addClaimTopic(1);
- await verifier.addClaimTopic(2);
- await verifier.addClaimTopic(3);
-
- const tx = await verifier.removeClaimTopic(2);
- await expect(tx).to.emit(verifier, 'ClaimTopicRemoved').withArgs(2);
- expect(await verifier.isClaimTopicRequired(1)).to.be.true;
- expect(await verifier.isClaimTopicRequired(2)).to.be.false;
- expect(await verifier.isClaimTopicRequired(3)).to.be.true;
- });
- });
- });
-
- describe('.removeTrustedIssuer', () => {
- describe('when not called by the owner', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
-
- await expect(verifier.connect(aliceWallet).removeTrustedIssuer(claimIssuer.address)).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when called by the owner', () => {
- it('should remove the trusted issuer', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
- const claimIssuerB = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
- await verifier.addTrustedIssuer(claimIssuer.address, [1]);
- await verifier.addTrustedIssuer(claimIssuerB.address, [2]);
-
- const tx = await verifier.removeTrustedIssuer(claimIssuer.address);
- await expect(tx).to.emit(verifier, 'TrustedIssuerRemoved').withArgs(claimIssuer.address);
- expect(await verifier.isTrustedIssuer(claimIssuer.address)).to.be.false;
- expect(await verifier.getTrustedIssuers()).to.be.deep.equal([claimIssuerB.address]);
- });
- });
-
- describe('when issuer address is zero', () => {
- it('should revert', async () => {
- const [deployer] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.removeTrustedIssuer(ethers.constants.AddressZero)).to.be.revertedWith('invalid argument - zero address');
- });
- });
-
- describe('when issuer is not trusted', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
-
- await expect(verifier.removeTrustedIssuer(claimIssuer.address)).to.be.revertedWith('NOT a trusted issuer');
- });
- });
- });
-
- describe('.addTrustedIssuer', () => {
- describe('when not called by the owner', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
-
- await expect(verifier.connect(aliceWallet).addTrustedIssuer(claimIssuer.address, [1])).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when issuer address is the zero', () => {
- it('should revert', async () => {
- const [deployer] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.addTrustedIssuer(ethers.constants.AddressZero, [1])).to.be.revertedWith('invalid argument - zero address');
- });
- });
-
- describe('when issuer is already trusted', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
- await verifier.addTrustedIssuer(claimIssuer.address, [1]);
-
- await expect(verifier.addTrustedIssuer(claimIssuer.address, [2])).to.be.revertedWith('trusted Issuer already exists');
- });
- });
-
- describe('when claim topics array is empty', () => {
- it('should revert', async () => {
- const [deployer] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.addTrustedIssuer(deployer.address, [])).to.be.revertedWith('trusted claim topics cannot be empty');
- });
- });
-
- describe('when claim topics array contains more than 15 topics', () => {
- it('should revert', async () => {
- const [deployer] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.addTrustedIssuer(deployer.address, [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])).to.be.revertedWith('cannot have more than 15 claim topics');
- });
- });
-
- describe('when adding a 51th trusted issuer', () => {
- it('should revert', async () => {
- const [deployer] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- for (let i = 0; i < 50; i++) {
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [deployer.address]);
- await verifier.addTrustedIssuer(claimIssuer.address, [1]);
- }
-
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [deployer.address]);
- await expect(verifier.addTrustedIssuer(claimIssuer.address, [1])).to.be.revertedWith('cannot have more than 50 trusted issuers');
- });
- });
- });
-
- describe('.updateIssuerClaimTopics', () => {
- describe('when not called by the owner', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
-
- await expect(verifier.connect(aliceWallet).updateIssuerClaimTopics(claimIssuer.address, [1])).to.be.revertedWith('Ownable: caller is not the owner');
- });
- });
-
- describe('when called by the owner', () => {
- it('should update the issuer claim topics', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
- await verifier.addTrustedIssuer(claimIssuer.address, [1]);
-
- const tx = await verifier.updateIssuerClaimTopics(claimIssuer.address, [2, 3]);
- await expect(tx).to.emit(verifier, 'ClaimTopicsUpdated').withArgs(claimIssuer.address, [2, 3]);
- expect(await verifier.isTrustedIssuer(claimIssuer.address)).to.be.true;
- expect(await verifier.getTrustedIssuersForClaimTopic(1)).to.be.empty;
- expect(await verifier.getTrustedIssuerClaimTopics(claimIssuer.address)).to.be.deep.equal([2, 3]);
- expect(await verifier.hasClaimTopic(claimIssuer.address, 2)).to.be.true;
- expect(await verifier.hasClaimTopic(claimIssuer.address, 1)).to.be.false;
- });
- });
-
- describe('when issuer address is the zero address', () => {
- it('should revert', async () => {
- const verifier = await ethers.deployContract('Verifier');
-
- await expect(verifier.updateIssuerClaimTopics(ethers.constants.AddressZero, [1])).to.be.revertedWith('invalid argument - zero address');
- });
- });
-
- describe('when issuer is not trusted', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
-
- await expect(verifier.updateIssuerClaimTopics(claimIssuer.address, [1])).to.be.revertedWith('NOT a trusted issuer');
- });
- });
-
- describe('when list of topics contains more than 15 topics', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
- await verifier.addTrustedIssuer(claimIssuer.address, [1]);
-
- await expect(verifier.updateIssuerClaimTopics(claimIssuer.address, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])).to.be.revertedWith('cannot have more than 15 claim topics');
- });
- });
-
- describe('when list of topics is empty', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
- await verifier.addTrustedIssuer(claimIssuer.address, [1]);
-
- await expect(verifier.updateIssuerClaimTopics(claimIssuer.address, [])).to.be.revertedWith('claim topics cannot be empty');
- });
- });
- });
-
- describe('.getTrustedIssuerClaimTopic', () => {
- describe('when issuer is not trusted', () => {
- it('should revert', async () => {
- const [deployer, aliceWallet] = await ethers.getSigners();
- const verifier = await ethers.deployContract('Verifier');
- const claimIssuer = await ethers.deployContract('ClaimIssuer', [aliceWallet.address]);
-
- await expect(verifier.getTrustedIssuerClaimTopics(claimIssuer.address)).to.be.revertedWith('trusted Issuer doesn\'t exist');
- });
- });
- });
-});
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index e5f1a640..00000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "compilerOptions": {
- "target": "es2020",
- "module": "commonjs",
- "esModuleInterop": true,
- "forceConsistentCasingInFileNames": true,
- "strict": true,
- "skipLibCheck": true
- }
-}