├── .gitattributes ├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── build-test.yml │ ├── create-release-pr.yml │ ├── publish-release.yml │ └── security-code-scanner.yml ├── .gitignore ├── .nvmrc ├── .yarnrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── base-filter-history.js ├── base-filter.js ├── block-filter.js ├── getBlocksForRange.js ├── hexUtils.js ├── index.js ├── log-filter.js ├── package.json ├── subscriptionManager.js ├── test ├── data │ ├── logs0.json │ ├── logs1.json │ ├── logs2.json │ ├── logs3.json │ ├── logs4.json │ ├── logs5.json │ └── logs6.json ├── ganache.js ├── getBlocksForRange.js ├── index.js ├── logs.js ├── subscriptions.js └── util.js ├── tx-filter.js └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | 3 | yarn.lock linguist-generated=false 4 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | * @MetaMask/wallet-framework-engineers 5 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Please see the documentation for all configuration options: 2 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: 'npm' 7 | directory: '/' 8 | schedule: 9 | interval: 'daily' 10 | time: '06:00' 11 | allow: 12 | - dependency-name: '@metamask/*' 13 | target-branch: 'main' 14 | versioning-strategy: 'increase-if-necessary' 15 | open-pull-requests-limit: 10 16 | -------------------------------------------------------------------------------- /.github/workflows/build-test.yml: -------------------------------------------------------------------------------- 1 | name: Build, Lint, and Test 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | 8 | jobs: 9 | build-lint-test: 10 | name: Build, Lint, and Test 11 | runs-on: ubuntu-20.04 12 | strategy: 13 | matrix: 14 | node-version: [18.x, 20.x] 15 | steps: 16 | - name: Checkout and setup environment 17 | uses: MetaMask/action-checkout-and-setup@v1 18 | with: 19 | is-high-risk-environment: false 20 | node-version: ${{ matrix.node-version }} 21 | cache-node-modules: ${{ matrix.node-version == '20.x' }} 22 | - run: yarn allow-scripts 23 | - run: yarn build 24 | - run: yarn test 25 | - name: Validate RC changelog 26 | if: ${{ startsWith(github.head_ref, 'release/') }} 27 | run: yarn auto-changelog validate --rc 28 | - name: Validate changelog 29 | if: ${{ !startsWith(github.head_ref, 'release/') }} 30 | run: yarn auto-changelog validate 31 | - name: Require clean working directory 32 | shell: bash 33 | run: | 34 | if ! git diff --exit-code; then 35 | echo "Working tree dirty after building" 36 | exit 1 37 | fi 38 | all-jobs-pass: 39 | name: All jobs pass 40 | runs-on: ubuntu-20.04 41 | needs: 42 | - build-lint-test 43 | steps: 44 | - run: echo "Great success!" 45 | -------------------------------------------------------------------------------- /.github/workflows/create-release-pr.yml: -------------------------------------------------------------------------------- 1 | name: Create Release Pull Request 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | base-branch: 7 | description: 'The base branch for git operations and the pull request.' 8 | default: 'main' 9 | required: true 10 | release-type: 11 | description: 'A SemVer version diff, i.e. major, minor, or patch. Mutually exclusive with "release-version".' 12 | required: false 13 | release-version: 14 | description: 'A specific version to bump to. Mutually exclusive with "release-type".' 15 | required: false 16 | 17 | jobs: 18 | create-release-pr: 19 | runs-on: ubuntu-latest 20 | permissions: 21 | contents: write 22 | pull-requests: write 23 | steps: 24 | - name: Checkout and setup environment 25 | uses: MetaMask/action-checkout-and-setup@v1 26 | with: 27 | is-high-risk-environment: true 28 | 29 | # This is to guarantee that the most recent tag is fetched. This can 30 | # be configured to a more reasonable value by consumers. 31 | fetch-depth: 0 32 | 33 | # We check out the specified branch, which will be used as the base 34 | # branch for all git operations and the release PR. 35 | ref: ${{ github.event.inputs.base-branch }} 36 | 37 | - uses: MetaMask/action-create-release-pr@v4 38 | with: 39 | release-type: ${{ github.event.inputs.release-type }} 40 | release-version: ${{ github.event.inputs.release-version }} 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | -------------------------------------------------------------------------------- /.github/workflows/publish-release.yml: -------------------------------------------------------------------------------- 1 | name: Publish Release 2 | 3 | on: 4 | pull_request: 5 | types: [closed] 6 | 7 | jobs: 8 | publish-release: 9 | permissions: 10 | contents: write 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout and setup environment 14 | uses: MetaMask/action-checkout-and-setup@v1 15 | with: 16 | is-high-risk-environment: true 17 | ref: ${{ github.sha }} 18 | - uses: MetaMask/action-publish-release@v3 19 | env: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 21 | -------------------------------------------------------------------------------- /.github/workflows/security-code-scanner.yml: -------------------------------------------------------------------------------- 1 | name: MetaMask Security Code Scanner 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | workflow_call: 11 | secrets: 12 | SECURITY_SCAN_METRICS_TOKEN: 13 | required: false 14 | APPSEC_BOT_SLACK_WEBHOOK: 15 | required: false 16 | 17 | jobs: 18 | run-security-scan: 19 | name: Run security scan 20 | runs-on: ubuntu-latest 21 | permissions: 22 | actions: read 23 | contents: read 24 | security-events: write 25 | steps: 26 | - name: Analyse code 27 | uses: MetaMask/action-security-code-scanner@v1 28 | with: 29 | repo: ${{ github.repository }} 30 | paths_ignored: | 31 | .storybook/ 32 | '**/__snapshots__/' 33 | '**/*.snap' 34 | '**/*.stories.js' 35 | '**/*.stories.tsx' 36 | '**/*.test.browser.ts*' 37 | '**/*.test.js*' 38 | '**/*.test.ts*' 39 | '**/fixtures/' 40 | '**/jest.config.js' 41 | '**/jest.environment.js' 42 | '**/mocks/' 43 | '**/test*/' 44 | docs/ 45 | e2e/ 46 | merged-packages/ 47 | node_modules 48 | storybook/ 49 | test*/ 50 | rules_excluded: example 51 | project_metrics_token: ${{ secrets.SECURITY_SCAN_METRICS_TOKEN }} 52 | slack_webhook: ${{ secrets.APPSEC_BOT_SLACK_WEBHOOK }} 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | # Created by https://www.gitignore.io/api/osx,node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (http://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | 65 | ### OSX ### 66 | *.DS_Store 67 | .AppleDouble 68 | .LSOverride 69 | 70 | # Icon must end with two \r 71 | Icon 72 | 73 | # Thumbnails 74 | ._* 75 | 76 | # Files that might appear in the root of a volume 77 | .DocumentRevisions-V100 78 | .fseventsd 79 | .Spotlight-V100 80 | .TemporaryItems 81 | .Trashes 82 | .VolumeIcon.icns 83 | .com.apple.timemachine.donotpresent 84 | 85 | # Directories potentially created on remote AFP share 86 | .AppleDB 87 | .AppleDesktop 88 | Network Trash Folder 89 | Temporary Items 90 | .apdisk 91 | 92 | # End of https://www.gitignore.io/api/osx,node 93 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18 2 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | ignore-scripts true 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [Unreleased] 8 | 9 | ## [9.0.0] 10 | ### Changed 11 | - **BREAKING:** Adapt to EIP-1193 provider changes by replacing the deprecated `sendAsync` method with the `request` method ([#170](https://github.com/MetaMask/eth-json-rpc-filters/pull/170)) 12 | 13 | ### Fixed 14 | - Bump `@metamask/json-rpc-engine` from `^9.0.0` to `^10.0.0` ([#194](https://github.com/MetaMask/eth-json-rpc-filters/pull/194)) 15 | 16 | ## [8.0.0] 17 | ### Changed 18 | - BREAKING: Drop support for Node.js v16, v21 ([#164](https://github.com/MetaMask/eth-json-rpc-filters/pull/164)) 19 | - Update `@metamask/json-rpc-engine` from `^8.0.2` to `^9.0.0` ([#165](https://github.com/MetaMask/eth-json-rpc-filters/pull/165)) 20 | 21 | ## [7.0.1] 22 | ### Changed 23 | - yarn version 1.22.22 declared as packageManager in package.json ([#156](https://github.com/MetaMask/eth-json-rpc-filters/pull/156)) 24 | - Bump `@metamask/eth-query` from `^3.0.1` to `^4.0.0` ([#126](https://github.com/MetaMask/eth-json-rpc-filters/pull/126)) 25 | - Bump `@metamask/json-rpc-engine` from `^7.1.0` to `^8.0.2` ([#162](https://github.com/MetaMask/eth-json-rpc-filters/pull/162)) 26 | 27 | ### Fixed 28 | - Bump `async-mutex` from `^0.2.6` to `^0.5.0` ([#163](https://github.com/MetaMask/eth-json-rpc-filters/pull/163)) 29 | 30 | ## [7.0.0] 31 | ### Changed 32 | - **BREAKING:** Set minimum Node.js version to v16 ([#102](https://github.com/MetaMask/eth-json-rpc-filters/pull/102)) 33 | - **BREAKING:** Rename package from `eth-json-rpc-filters` to `@metamask/eth-json-rpc-filters` ([#103](https://github.com/MetaMask/eth-json-rpc-filters/pull/103)) 34 | - Bump `@metamask/json-rpc-engine` from `^6.0.0` to `^7.1.0` ([#104](https://github.com/MetaMask/eth-json-rpc-filters/pull/104)) 35 | - Replace `@metamask/eth-query`@`^2.1.2` with `@metamask/eth-query`@`^3.0.1` ([#107](https://github.com/MetaMask/eth-json-rpc-filters/pull/107)) 36 | 37 | ## [6.0.1] 38 | ### Changed 39 | - Bump `@metamask/safe-event-emitter` from `^2.0.0` to `^3.0.0` ([#94](https://github.com/MetaMask/eth-json-rpc-filters/pull/94)) 40 | 41 | ## [6.0.0] 42 | ### Changed 43 | - **BREAKING:** Block filter middleware will not throw an error if a block is not found ([#89](https://github.com/MetaMask/eth-json-rpc-filters/pull/89)) 44 | 45 | ## [5.1.0] 46 | ### Changed 47 | - Remove `eth-json-rpc-middleware` dependency ([#76](https://github.com/MetaMask/eth-json-rpc-filters/pull/76)) 48 | - This package is still used in tests as a `devDependency`, but it's not used in the published package anymore. 49 | 50 | ### Fixed 51 | - Fix `eth_getFilterLogs` ([#84](https://github.com/MetaMask/eth-json-rpc-filters/pull/84)) 52 | - Fix for null reference exception when normalizing the block ([#83](https://github.com/MetaMask/eth-json-rpc-filters/pull/83)) 53 | 54 | ## [5.0.0] - 2022-05-10 55 | ### Added 56 | - Add retry logic to `getBlocksForRange`, treating a null block number as failure ([#61](https://github.com/MetaMask/eth-json-rpc-filters/pull/61)) 57 | 58 | ### Changed 59 | - **BREAKING:** Set minimum Node.js version to v12 ([#50](https://github.com/MetaMask/eth-json-rpc-filters/pull/50)) 60 | - We officially support Node 12, 14, and 16, in alignment with our other packages. 61 | 62 | ## [4.2.2] - 2021-02-04 63 | ### Changed 64 | - Replace `await-semaphore` with `async-mutex` ([#33](https://github.com/MetaMask/eth-json-rpc-filters/pull/33)) 65 | - Move `pify` to production dependencies and update to v5 ([#39](https://github.com/MetaMask/eth-json-rpc-filters/pull/39) and [#40](https://github.com/MetaMask/eth-json-rpc-filters/pull/40)) 66 | - Cleanup manifest metadata ([#43](https://github.com/MetaMask/eth-json-rpc-filters/pull/43) and [#42](https://github.com/MetaMask/eth-json-rpc-filters/pull/42)) 67 | - Update `json-rpc-engine` from v5 to v6 ([#35](https://github.com/MetaMask/eth-json-rpc-filters/pull/35)) 68 | - Update to `@metamask/safe-event-emitter` v2 ([#37](https://github.com/MetaMask/eth-json-rpc-filters/pull/37)) 69 | - Remove `lodash.flatmap` dependency ([#36](https://github.com/MetaMask/eth-json-rpc-filters/pull/36)) 70 | 71 | ## [4.2.1] - 2020-09-22 72 | ### Changed 73 | - Specify publish files ([#30](https://github.com/MetaMask/eth-json-rpc-filters/pull/30)) 74 | 75 | ## [4.2.0] - 2020-09-22 76 | ### Changed 77 | - Update RPC packages ([#29](https://github.com/MetaMask/eth-json-rpc-filters/pull/29)) 78 | - `json-rpc-engine@5.3.0` 79 | - `eth-json-rpc-middleware@6.0.0` 80 | 81 | ## [3.0.1] - 2018-10-08 82 | ### Changed 83 | - **BREAKING**: `BaseFilter` now extends `SafeEventEmitter` (c583ba9d9410ca7c861282b0a122212b7c22ba47) 84 | 85 | ## [2.0.0] - 2018-05-22 86 | ### Changed 87 | - **BREAKING**: expect EthBlockTracker@4 (062fd0849631a9862780c0591a3987bcadfe880f) 88 | 89 | [Unreleased]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v9.0.0...HEAD 90 | [9.0.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v8.0.0...v9.0.0 91 | [8.0.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v7.0.1...v8.0.0 92 | [7.0.1]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v7.0.0...v7.0.1 93 | [7.0.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v6.0.1...v7.0.0 94 | [6.0.1]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v6.0.0...v6.0.1 95 | [6.0.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v5.1.0...v6.0.0 96 | [5.1.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v5.0.0...v5.1.0 97 | [5.0.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v4.2.2...v5.0.0 98 | [4.2.2]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v4.2.1...v4.2.2 99 | [4.2.1]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v4.2.0...v4.2.1 100 | [4.2.0]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v3.0.1...v4.2.0 101 | [3.0.1]: https://github.com/MetaMask/eth-json-rpc-filters/compare/v2.0.0...v3.0.1 102 | [2.0.0]: https://github.com/MetaMask/eth-json-rpc-filters/releases/tag/v2.0.0 103 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2020 MetaMask 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@metamask/eth-json-rpc-filters` 2 | 3 | [json-rpc-engine](https://github.com/MetaMask/json-rpc-engine) middleware implementing Ethereum filter methods. 4 | Backed by an [eth-block-tracker](https://github.com/MetaMask/eth-block-tracker) and web3 provider interface (`web3.currentProvider`). 5 | 6 | ### supported rpc methods 7 | - `eth_newFilter` 8 | - `eth_newBlockFilter` 9 | - `eth_newPendingTransactionFilter` 10 | - `eth_uninstallFilter` 11 | - `eth_getFilterChanges` 12 | - `eth_getFilterLogs` 13 | 14 | ### usage 15 | 16 | basic usage: 17 | ```js 18 | const filterMiddleware = createFilterMiddleware({ blockTracker, provider }) 19 | engine.push(filterMiddleware) 20 | ``` 21 | 22 | cleanup: 23 | ```js 24 | // remove blockTracker handler to free middleware for garbage collection 25 | filterMiddleware.destroy() 26 | ``` 27 | 28 | ## Running Tests 29 | 30 | ```bash 31 | yarn test 32 | ``` 33 | 34 | ## Changelog 35 | [`CHANGELOG.md`](./CHANGELOG.md) 36 | -------------------------------------------------------------------------------- /base-filter-history.js: -------------------------------------------------------------------------------- 1 | const BaseFilter = require('./base-filter') 2 | 3 | // tracks all results ever recorded 4 | class BaseFilterWithHistory extends BaseFilter { 5 | 6 | constructor () { 7 | super() 8 | this.allResults = [] 9 | } 10 | 11 | async update () { 12 | throw new Error('BaseFilterWithHistory - no update method specified') 13 | } 14 | 15 | addResults (newResults) { 16 | this.allResults = this.allResults.concat(newResults) 17 | super.addResults(newResults) 18 | } 19 | 20 | addInitialResults (newResults) { 21 | this.allResults = this.allResults.concat(newResults) 22 | super.addInitialResults(newResults) 23 | } 24 | 25 | getAllResults () { 26 | return this.allResults 27 | } 28 | 29 | } 30 | 31 | module.exports = BaseFilterWithHistory -------------------------------------------------------------------------------- /base-filter.js: -------------------------------------------------------------------------------- 1 | const SafeEventEmitter = require('@metamask/safe-event-emitter').default 2 | 3 | class BaseFilter extends SafeEventEmitter { 4 | 5 | constructor () { 6 | super() 7 | this.updates = [] 8 | } 9 | 10 | async initialize () {} 11 | 12 | async update () { 13 | throw new Error('BaseFilter - no update method specified') 14 | } 15 | 16 | addResults (newResults) { 17 | this.updates = this.updates.concat(newResults) 18 | newResults.forEach(result => this.emit('update', result)) 19 | } 20 | 21 | addInitialResults (newResults) {} 22 | 23 | getChangesAndClear () { 24 | const updates = this.updates 25 | this.updates = [] 26 | return updates 27 | } 28 | 29 | } 30 | 31 | module.exports = BaseFilter 32 | -------------------------------------------------------------------------------- /block-filter.js: -------------------------------------------------------------------------------- 1 | const BaseFilter = require('./base-filter') 2 | const getBlocksForRange = require('./getBlocksForRange') 3 | const { incrementHexInt } = require('./hexUtils') 4 | 5 | class BlockFilter extends BaseFilter { 6 | 7 | constructor ({ provider, params }) { 8 | super() 9 | this.type = 'block' 10 | this.provider = provider 11 | } 12 | 13 | async update ({ oldBlock, newBlock }) { 14 | const toBlock = newBlock 15 | const fromBlock = incrementHexInt(oldBlock) 16 | const blockBodies = await getBlocksForRange({ provider: this.provider, fromBlock, toBlock }) 17 | const blockHashes = blockBodies.map((block) => block.hash) 18 | this.addResults(blockHashes) 19 | } 20 | 21 | } 22 | 23 | module.exports = BlockFilter 24 | -------------------------------------------------------------------------------- /getBlocksForRange.js: -------------------------------------------------------------------------------- 1 | module.exports = getBlocksForRange 2 | 3 | async function getBlocksForRange({ provider, fromBlock, toBlock }) { 4 | if (!fromBlock) fromBlock = toBlock 5 | 6 | const fromBlockNumber = hexToInt(fromBlock) 7 | const toBlockNumber = hexToInt(toBlock) 8 | const blockCountToQuery = toBlockNumber - fromBlockNumber + 1 9 | // load all blocks from old to new (inclusive) 10 | const missingBlockNumbers = Array(blockCountToQuery).fill() 11 | .map((_,index) => fromBlockNumber + index) 12 | .map(intToHex) 13 | let blockBodies = await Promise.all( 14 | missingBlockNumbers.map(blockNum => query(provider, 'eth_getBlockByNumber', [blockNum, false])) 15 | ) 16 | blockBodies = blockBodies.filter(block => block !== null); 17 | return blockBodies 18 | } 19 | 20 | function hexToInt(hexString) { 21 | if (hexString === undefined || hexString === null) return hexString 22 | return Number.parseInt(hexString, 16) 23 | } 24 | 25 | function incrementHexInt(hexString){ 26 | if (hexString === undefined || hexString === null) return hexString 27 | const value = hexToInt(hexString) 28 | return intToHex(value + 1) 29 | } 30 | 31 | function intToHex(int) { 32 | if (int === undefined || int === null) return int 33 | const hexString = int.toString(16) 34 | return '0x' + hexString 35 | } 36 | 37 | async function query(provider, method, params) { 38 | for (let i = 0; i < 3; i++) { 39 | try { 40 | return provider.request({ 41 | id: 1, 42 | jsonrpc: "2.0", 43 | method, 44 | params, 45 | }); 46 | } catch (error) { 47 | console.error( 48 | `provider.request failed: ${error.stack || error.message || error}` 49 | ); 50 | } 51 | } 52 | return null; 53 | } 54 | -------------------------------------------------------------------------------- /hexUtils.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | minBlockRef, 4 | maxBlockRef, 5 | sortBlockRefs, 6 | bnToHex, 7 | blockRefIsNumber, 8 | hexToInt, 9 | incrementHexInt, 10 | intToHex, 11 | unsafeRandomBytes, 12 | } 13 | 14 | function minBlockRef(...refs) { 15 | const sortedRefs = sortBlockRefs(refs) 16 | return sortedRefs[0] 17 | } 18 | 19 | function maxBlockRef(...refs) { 20 | const sortedRefs = sortBlockRefs(refs) 21 | return sortedRefs[sortedRefs.length-1] 22 | } 23 | 24 | function sortBlockRefs(refs) { 25 | return refs.sort((refA, refB) => { 26 | if (refA === 'latest' || refB === 'earliest') return 1 27 | if (refB === 'latest' || refA === 'earliest') return -1 28 | return hexToInt(refA) - hexToInt(refB) 29 | }) 30 | } 31 | 32 | function bnToHex(bn) { 33 | return '0x' + bn.toString(16) 34 | } 35 | 36 | function blockRefIsNumber(blockRef){ 37 | return blockRef && !['earliest', 'latest', 'pending'].includes(blockRef) 38 | } 39 | 40 | function hexToInt(hexString) { 41 | if (hexString === undefined || hexString === null) return hexString 42 | return Number.parseInt(hexString, 16) 43 | } 44 | 45 | function incrementHexInt(hexString){ 46 | if (hexString === undefined || hexString === null) return hexString 47 | const value = hexToInt(hexString) 48 | return intToHex(value + 1) 49 | } 50 | 51 | function intToHex(int) { 52 | if (int === undefined || int === null) return int 53 | let hexString = int.toString(16) 54 | const needsLeftPad = hexString.length % 2 55 | if (needsLeftPad) hexString = '0' + hexString 56 | return '0x' + hexString 57 | } 58 | 59 | function unsafeRandomBytes(byteCount) { 60 | let result = '0x' 61 | for (let i = 0; i < byteCount; i++) { 62 | result += unsafeRandomNibble() 63 | result += unsafeRandomNibble() 64 | } 65 | return result 66 | } 67 | 68 | function unsafeRandomNibble() { 69 | return Math.floor(Math.random() * 16).toString(16) 70 | } 71 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Mutex = require('async-mutex').Mutex 2 | const { createAsyncMiddleware, createScaffoldMiddleware } = require('@metamask/json-rpc-engine') 3 | const LogFilter = require('./log-filter.js') 4 | const BlockFilter = require('./block-filter.js') 5 | const TxFilter = require('./tx-filter.js') 6 | const { intToHex, hexToInt } = require('./hexUtils') 7 | 8 | module.exports = createEthFilterMiddleware 9 | 10 | function createEthFilterMiddleware({ blockTracker, provider }) { 11 | 12 | // create filter collection 13 | let filterIndex = 0 14 | let filters = {} 15 | // create update mutex 16 | const mutex = new Mutex() 17 | const waitForFree = mutexMiddlewareWrapper({ mutex }) 18 | 19 | const middleware = createScaffoldMiddleware({ 20 | // install filters 21 | eth_newFilter: waitForFree(toFilterCreationMiddleware(newLogFilter)), 22 | eth_newBlockFilter: waitForFree(toFilterCreationMiddleware(newBlockFilter)), 23 | eth_newPendingTransactionFilter: waitForFree(toFilterCreationMiddleware(newPendingTransactionFilter)), 24 | // uninstall filters 25 | eth_uninstallFilter: waitForFree(toAsyncRpcMiddleware(uninstallFilterHandler)), 26 | // checking filter changes 27 | eth_getFilterChanges: waitForFree(toAsyncRpcMiddleware(getFilterChanges)), 28 | eth_getFilterLogs: waitForFree(toAsyncRpcMiddleware(getFilterLogs)), 29 | }) 30 | 31 | // setup filter updating and destroy handler 32 | const filterUpdater = async ({ oldBlock, newBlock }) => { 33 | if (filters.length === 0) return 34 | // lock update reads 35 | const releaseLock = await mutex.acquire() 36 | try { 37 | // process all filters in parallel 38 | await Promise.all(objValues(filters).map(async (filter) => { 39 | try { 40 | await filter.update({ oldBlock, newBlock }) 41 | } catch (err) { 42 | // handle each error individually so filter update errors don't affect other filters 43 | console.error(err) 44 | } 45 | })) 46 | } catch (err) { 47 | // log error so we don't skip the releaseLock 48 | console.error(err) 49 | } 50 | // unlock update reads 51 | releaseLock() 52 | } 53 | 54 | // expose filter methods directly 55 | middleware.newLogFilter = newLogFilter 56 | middleware.newBlockFilter = newBlockFilter 57 | middleware.newPendingTransactionFilter = newPendingTransactionFilter 58 | middleware.uninstallFilter = uninstallFilterHandler 59 | middleware.getFilterChanges = getFilterChanges 60 | middleware.getFilterLogs = getFilterLogs 61 | 62 | // expose destroy method for cleanup 63 | middleware.destroy = () => { 64 | uninstallAllFilters() 65 | } 66 | 67 | return middleware 68 | 69 | // 70 | // new filters 71 | // 72 | 73 | async function newLogFilter(params) { 74 | const filter = new LogFilter({ provider, params }) 75 | const filterIndex = await installFilter(filter) 76 | return filter 77 | } 78 | 79 | async function newBlockFilter() { 80 | const filter = new BlockFilter({ provider }) 81 | const filterIndex = await installFilter(filter) 82 | return filter 83 | } 84 | 85 | async function newPendingTransactionFilter() { 86 | const filter = new TxFilter({ provider }) 87 | const filterIndex = await installFilter(filter) 88 | return filter 89 | } 90 | 91 | // 92 | // get filter changes 93 | // 94 | 95 | async function getFilterChanges(filterIndexHex) { 96 | const filterIndex = hexToInt(filterIndexHex) 97 | const filter = filters[filterIndex] 98 | if (!filter) { 99 | throw new Error(`No filter for index "${filterIndex}"`) 100 | } 101 | const results = filter.getChangesAndClear() 102 | return results 103 | } 104 | 105 | async function getFilterLogs(filterIndexHex) { 106 | const filterIndex = hexToInt(filterIndexHex) 107 | const filter = filters[filterIndex] 108 | if (!filter) { 109 | throw new Error(`No filter for index "${filterIndex}"`) 110 | } 111 | // only return results for log filters 112 | let results = [] 113 | if (filter.type === 'log') { 114 | results = filter.getAllResults() 115 | } 116 | return results 117 | } 118 | 119 | 120 | // 121 | // remove filters 122 | // 123 | 124 | 125 | async function uninstallFilterHandler(filterIndexHex) { 126 | // check filter exists 127 | const filterIndex = hexToInt(filterIndexHex) 128 | const filter = filters[filterIndex] 129 | const result = Boolean(filter) 130 | // uninstall filter 131 | if (result) { 132 | await uninstallFilter(filterIndex) 133 | } 134 | return result 135 | } 136 | 137 | // 138 | // utils 139 | // 140 | 141 | async function installFilter(filter) { 142 | const prevFilterCount = objValues(filters).length 143 | // install filter 144 | const currentBlock = await blockTracker.getLatestBlock() 145 | await filter.initialize({ currentBlock }) 146 | filterIndex++ 147 | filters[filterIndex] = filter 148 | filter.id = filterIndex 149 | filter.idHex = intToHex(filterIndex) 150 | // update block tracker subs 151 | const newFilterCount = objValues(filters).length 152 | updateBlockTrackerSubs({ prevFilterCount, newFilterCount }) 153 | return filterIndex 154 | } 155 | 156 | async function uninstallFilter(filterIndex) { 157 | const prevFilterCount = objValues(filters).length 158 | delete filters[filterIndex] 159 | // update block tracker subs 160 | const newFilterCount = objValues(filters).length 161 | updateBlockTrackerSubs({ prevFilterCount, newFilterCount }) 162 | } 163 | 164 | async function uninstallAllFilters() { 165 | const prevFilterCount = objValues(filters).length 166 | filters = {} 167 | // update block tracker subs 168 | updateBlockTrackerSubs({ prevFilterCount, newFilterCount: 0 }) 169 | } 170 | 171 | function updateBlockTrackerSubs({ prevFilterCount, newFilterCount }) { 172 | // subscribe 173 | if (prevFilterCount === 0 && newFilterCount > 0) { 174 | blockTracker.on('sync', filterUpdater) 175 | return 176 | } 177 | // unsubscribe 178 | if (prevFilterCount > 0 && newFilterCount === 0) { 179 | blockTracker.removeListener('sync', filterUpdater) 180 | return 181 | } 182 | } 183 | 184 | } 185 | 186 | // helper for turning filter constructors into rpc middleware 187 | function toFilterCreationMiddleware(createFilterFn) { 188 | return toAsyncRpcMiddleware(async (...args) => { 189 | const filter = await createFilterFn(...args) 190 | const result = intToHex(filter.id) 191 | return result 192 | }) 193 | } 194 | 195 | // helper for pulling out req.params and setting res.result 196 | function toAsyncRpcMiddleware(asyncFn) { 197 | return createAsyncMiddleware(async (req, res) => { 198 | const result = await asyncFn.apply(null, req.params) 199 | res.result = result 200 | }) 201 | } 202 | 203 | function mutexMiddlewareWrapper({ mutex }) { 204 | return (middleware) => { 205 | return async (req, res, next, end) => { 206 | // wait for mutex available 207 | // we can release immediately because 208 | // we just need to make sure updates aren't active 209 | const releaseLock = await mutex.acquire() 210 | releaseLock() 211 | middleware(req, res, next, end) 212 | } 213 | } 214 | } 215 | 216 | function objValues(obj, fn){ 217 | const values = [] 218 | for (let key in obj) { 219 | values.push(obj[key]) 220 | } 221 | return values 222 | } 223 | -------------------------------------------------------------------------------- /log-filter.js: -------------------------------------------------------------------------------- 1 | const EthQuery = require('@metamask/eth-query') 2 | const pify = require('pify') 3 | const BaseFilterWithHistory = require('./base-filter-history') 4 | const { bnToHex, hexToInt, incrementHexInt, minBlockRef, blockRefIsNumber } = require('./hexUtils') 5 | 6 | class LogFilter extends BaseFilterWithHistory { 7 | 8 | constructor ({ provider, params }) { 9 | super() 10 | this.type = 'log' 11 | this.ethQuery = new EthQuery(provider) 12 | this.params = Object.assign({ 13 | fromBlock: 'latest', 14 | toBlock: 'latest', 15 | address: undefined, 16 | topics: [], 17 | }, params) 18 | // normalize address parameter 19 | if (this.params.address) { 20 | // ensure array 21 | if (!Array.isArray(this.params.address)) { 22 | this.params.address = [this.params.address] 23 | } 24 | // ensure lowercase 25 | this.params.address = this.params.address.map(address => address.toLowerCase()) 26 | } 27 | } 28 | 29 | async initialize({ currentBlock }) { 30 | // resolve params.fromBlock 31 | let fromBlock = this.params.fromBlock 32 | if (['latest', 'pending'].includes(fromBlock)) fromBlock = currentBlock 33 | if ('earliest' === fromBlock) fromBlock = '0x0' 34 | this.params.fromBlock = fromBlock 35 | // set toBlock for initial lookup 36 | const toBlock = minBlockRef(this.params.toBlock, currentBlock) 37 | const params = Object.assign({}, this.params, { toBlock }) 38 | // fetch logs and add to results 39 | const newLogs = await this._fetchLogs(params) 40 | this.addInitialResults(newLogs) 41 | } 42 | 43 | async update ({ oldBlock, newBlock }) { 44 | // configure params for this update 45 | const toBlock = newBlock 46 | let fromBlock 47 | // oldBlock is empty on first sync 48 | if (oldBlock) { 49 | fromBlock = incrementHexInt(oldBlock) 50 | } else { 51 | fromBlock = newBlock 52 | } 53 | // fetch logs 54 | const params = Object.assign({}, this.params, { fromBlock, toBlock }) 55 | const newLogs = await this._fetchLogs(params) 56 | const matchingLogs = newLogs.filter(log => this.matchLog(log)) 57 | 58 | // add to results 59 | this.addResults(matchingLogs) 60 | } 61 | 62 | async _fetchLogs (params) { 63 | const newLogs = await pify(cb => this.ethQuery.getLogs(params, cb))() 64 | // add to results 65 | return newLogs 66 | } 67 | 68 | matchLog(log) { 69 | // check if block number in bounds: 70 | if (hexToInt(this.params.fromBlock) >= hexToInt(log.blockNumber)) return false 71 | if (blockRefIsNumber(this.params.toBlock) && hexToInt(this.params.toBlock) <= hexToInt(log.blockNumber)) return false 72 | 73 | // address is correct: 74 | const normalizedLogAddress = log.address && log.address.toLowerCase() 75 | if (this.params.address && normalizedLogAddress && !this.params.address.includes(normalizedLogAddress)) return false 76 | 77 | // topics match: 78 | // topics are position-dependant 79 | // topics can be nested to represent `or` [[a || b], c] 80 | // topics can be null, representing a wild card for that position 81 | const topicsMatch = this.params.topics.every((topicPattern, index) => { 82 | // pattern is longer than actual topics 83 | let logTopic = log.topics[index] 84 | if (!logTopic) return false 85 | logTopic = logTopic.toLowerCase() 86 | // normalize subTopics 87 | let subtopicsToMatch = Array.isArray(topicPattern) ? topicPattern : [topicPattern] 88 | // check for wild card 89 | const subtopicsIncludeWildcard = subtopicsToMatch.includes(null) 90 | if (subtopicsIncludeWildcard) return true 91 | subtopicsToMatch = subtopicsToMatch.map(topic => topic.toLowerCase()) 92 | // check each possible matching topic 93 | const topicDoesMatch = subtopicsToMatch.includes(logTopic) 94 | return topicDoesMatch 95 | }) 96 | 97 | return topicsMatch 98 | } 99 | 100 | } 101 | 102 | module.exports = LogFilter 103 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@metamask/eth-json-rpc-filters", 3 | "version": "9.0.0", 4 | "description": "[json-rpc-engine](https://github.com/MetaMask/json-rpc-engine) middleware implementing ethereum filter methods. Backed by an [eth-block-tracker](https://github.com/MetaMask/eth-block-tracker) and web3 provider interface (`web3.currentProvider`).", 5 | "main": "index.js", 6 | "engines": { 7 | "node": "^18.16 || ^20 || >=22", 8 | "yarn": "^1.22.22" 9 | }, 10 | "scripts": { 11 | "build": "echo 'this does nothing'", 12 | "build:clean": "rimraf dist && yarn build", 13 | "lint": "printf '%s\\n' 'No lint command'", 14 | "setup": "yarn install && yarn allow-scripts", 15 | "test": "node test" 16 | }, 17 | "license": "ISC", 18 | "files": [ 19 | "*.js" 20 | ], 21 | "dependencies": { 22 | "@metamask/eth-query": "^4.0.0", 23 | "@metamask/json-rpc-engine": "^10.0.0", 24 | "@metamask/safe-event-emitter": "^3.0.0", 25 | "async-mutex": "^0.5.0", 26 | "pify": "^5.0.0" 27 | }, 28 | "devDependencies": { 29 | "@lavamoat/allow-scripts": "^2.5.1", 30 | "@metamask/auto-changelog": "^3.3.0", 31 | "@metamask/eth-json-rpc-middleware": "^15.0.0", 32 | "@metamask/eth-block-tracker": "^11.0.1", 33 | "ganache": "^7.9.2", 34 | "sinon": "^15.2.0", 35 | "tape": "^5.7.0" 36 | }, 37 | "repository": { 38 | "type": "git", 39 | "url": "https://github.com/MetaMask/eth-json-rpc-filters.git" 40 | }, 41 | "bugs": { 42 | "url": "https://github.com/MetaMask/eth-json-rpc-filters/issues" 43 | }, 44 | "homepage": "https://github.com/MetaMask/eth-json-rpc-filters#readme", 45 | "publishConfig": { 46 | "access": "public", 47 | "registry": "https://registry.npmjs.org/" 48 | }, 49 | "lavamoat": { 50 | "allowScripts": { 51 | "@lavamoat/preinstall-always-fail": false, 52 | "ethereumjs-util>ethereum-cryptography>keccak": false, 53 | "ethereumjs-util>ethereum-cryptography>secp256k1": false, 54 | "ethjs-query>babel-runtime>core-js": false, 55 | "ganache>keccak": false, 56 | "ganache>secp256k1": false, 57 | "ganache>@trufflesuite/bigint-buffer": false, 58 | "ganache>@trufflesuite/uws-js-unofficial>bufferutil": false, 59 | "ganache>@trufflesuite/uws-js-unofficial>utf-8-validate": false, 60 | "ganache>bufferutil": false, 61 | "ganache>leveldown": false, 62 | "ganache>utf-8-validate": false 63 | } 64 | }, 65 | "packageManager": "yarn@1.22.22" 66 | } 67 | -------------------------------------------------------------------------------- /subscriptionManager.js: -------------------------------------------------------------------------------- 1 | const SafeEventEmitter = require('@metamask/safe-event-emitter').default 2 | const { createAsyncMiddleware, createScaffoldMiddleware } = require('@metamask/json-rpc-engine') 3 | const createFilterMiddleware = require('./index.js') 4 | const { unsafeRandomBytes, incrementHexInt } = require('./hexUtils.js') 5 | const getBlocksForRange = require('./getBlocksForRange.js') 6 | 7 | module.exports = createSubscriptionMiddleware 8 | 9 | 10 | function createSubscriptionMiddleware({ blockTracker, provider }) { 11 | // state and utilities for handling subscriptions 12 | const subscriptions = {} 13 | const filterManager = createFilterMiddleware({ blockTracker, provider }) 14 | 15 | // internal flag 16 | let isDestroyed = false 17 | 18 | // create subscriptionManager api object 19 | const events = new SafeEventEmitter() 20 | const middleware = createScaffoldMiddleware({ 21 | eth_subscribe: createAsyncMiddleware(subscribe), 22 | eth_unsubscribe: createAsyncMiddleware(unsubscribe), 23 | }) 24 | middleware.destroy = destroy 25 | return { events, middleware } 26 | 27 | async function subscribe(req, res) { 28 | 29 | if (isDestroyed) throw new Error( 30 | 'SubscriptionManager - attempting to use after destroying' 31 | ) 32 | 33 | const subscriptionType = req.params[0] 34 | // subId is 16 byte hex string 35 | const subId = unsafeRandomBytes(16) 36 | 37 | // create sub 38 | let sub 39 | switch (subscriptionType) { 40 | case 'newHeads': 41 | sub = createSubNewHeads({ subId }) 42 | break 43 | case 'logs': 44 | const filterParams = req.params[1] 45 | const filter = await filterManager.newLogFilter(filterParams) 46 | sub = createSubFromFilter({ subId, filter }) 47 | break 48 | default: 49 | throw new Error(`SubscriptionManager - unsupported subscription type "${subscriptionType}"`) 50 | 51 | } 52 | subscriptions[subId] = sub 53 | 54 | res.result = subId 55 | return 56 | 57 | function createSubNewHeads({ subId }) { 58 | const sub = { 59 | type: subscriptionType, 60 | destroy: async () => { 61 | blockTracker.removeListener('sync', sub.update) 62 | }, 63 | update: async ({ oldBlock, newBlock }) => { 64 | // for newHeads 65 | const toBlock = newBlock 66 | const fromBlock = incrementHexInt(oldBlock) 67 | const rawBlocks = await getBlocksForRange({ provider, fromBlock, toBlock }) 68 | const results = rawBlocks.map(normalizeBlock).filter(block => block !== null) 69 | results.forEach((value) => { 70 | _emitSubscriptionResult(subId, value) 71 | }) 72 | } 73 | } 74 | // check for subscription updates on new block 75 | blockTracker.on('sync', sub.update) 76 | return sub 77 | } 78 | 79 | function createSubFromFilter({ subId, filter }) { 80 | filter.on('update', result => _emitSubscriptionResult(subId, result)) 81 | const sub = { 82 | type: subscriptionType, 83 | destroy: async () => { 84 | return await filterManager.uninstallFilter(filter.idHex) 85 | }, 86 | } 87 | return sub 88 | } 89 | } 90 | 91 | async function unsubscribe(req, res) { 92 | 93 | if (isDestroyed) throw new Error( 94 | 'SubscriptionManager - attempting to use after destroying' 95 | ) 96 | 97 | const id = req.params[0] 98 | const subscription = subscriptions[id] 99 | // if missing, return "false" to indicate it was not removed 100 | if (!subscription) { 101 | res.result = false 102 | return 103 | } 104 | // cleanup subscription 105 | delete subscriptions[id] 106 | await subscription.destroy() 107 | res.result = true 108 | } 109 | 110 | function _emitSubscriptionResult(filterIdHex, value) { 111 | events.emit('notification', { 112 | jsonrpc: '2.0', 113 | method: 'eth_subscription', 114 | params: { 115 | subscription: filterIdHex, 116 | result: value, 117 | }, 118 | }) 119 | } 120 | 121 | function destroy() { 122 | events.removeAllListeners() 123 | for (const id in subscriptions) { 124 | subscriptions[id].destroy() 125 | delete subscriptions[id] 126 | } 127 | isDestroyed = true 128 | } 129 | } 130 | 131 | function normalizeBlock(block) { 132 | if (block === null || block === undefined) { 133 | return null; 134 | } 135 | return { 136 | hash: block.hash, 137 | parentHash: block.parentHash, 138 | sha3Uncles: block.sha3Uncles, 139 | miner: block.miner, 140 | stateRoot: block.stateRoot, 141 | transactionsRoot: block.transactionsRoot, 142 | receiptsRoot: block.receiptsRoot, 143 | logsBloom: block.logsBloom, 144 | difficulty: block.difficulty, 145 | number: block.number, 146 | gasLimit: block.gasLimit, 147 | gasUsed: block.gasUsed, 148 | nonce: block.nonce, 149 | mixHash: block.mixHash, 150 | timestamp: block.timestamp, 151 | extraData: block.extraData, 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /test/data/logs0.json: -------------------------------------------------------------------------------- 1 | { 2 | "eth_newFilter-req": { 3 | "jsonrpc": "2.0", 4 | "id": 7, 5 | "method": "eth_newFilter", 6 | "params": [ 7 | { 8 | "topics": [ 9 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 10 | null, 11 | null 12 | ], 13 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 14 | "fromBlock": "0x0", 15 | "toBlock": "latest" 16 | } 17 | ] 18 | }, 19 | "eth_getLogs-res": { 20 | "id": 2686236096630, 21 | "jsonrpc": "2.0", 22 | "result": [ 23 | { 24 | "logIndex": "0x00", 25 | "transactionIndex": "0x00", 26 | "transactionHash": "0x78f9fa3190998d67b5378ad31b65580ca59829a95937654615c37e40088059c1", 27 | "blockHash": "0x840fa30511d5722f163c36202f7182758c1e741cfc4ec6ecddd7a93e9c30f4a6", 28 | "blockNumber": "0x09", 29 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 30 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016500000000000000000000000000000000000000000000000000000000000000", 31 | "topics": [ 32 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 33 | "0x0000000000000000000000000000000000000000000000000000000000000005", 34 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 35 | ], 36 | "type": "mined" 37 | }, 38 | { 39 | "logIndex": "0x00", 40 | "transactionIndex": "0x00", 41 | "transactionHash": "0xf312da29c8dbb359323debc8c735a1cd19fc24a215d0f4eb8c99fbb25e001dcf", 42 | "blockHash": "0xbba0e567a47d81ef9c27a5bfb5e638a2595ef53ec5d84c5d5129f08915704537", 43 | "blockNumber": "0x0a", 44 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 45 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000000", 46 | "topics": [ 47 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 48 | "0x0000000000000000000000000000000000000000000000000000000000000006", 49 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 50 | ], 51 | "type": "mined" 52 | } 53 | ] 54 | } 55 | } -------------------------------------------------------------------------------- /test/data/logs1.json: -------------------------------------------------------------------------------- 1 | { 2 | "params": { 3 | "fromBlock": "0x0", 4 | "toBlock": "latest", 5 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 6 | "topics": [ 7 | "0x1022115f3a730bbc8daef9a08e80544240a1578ecba51270e55ab8e72d626e72", 8 | null, 9 | null, 10 | null 11 | ] 12 | }, 13 | "newLogs": [ 14 | { 15 | "logIndex": "0x0", 16 | "transactionIndex": "0x0", 17 | "transactionHash": "0x2d3ad14299447e3b5dbdf52cdca078b7a924c8cea6d5d99af1c4b9d470e3a844", 18 | "blockHash": "0x1133b8681c2941bd0db93d6db7d87587f634b6ae20b9bc80db4a70d1fa2c4e10", 19 | "blockNumber": "0xc", 20 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 21 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016800000000000000000000000000000000000000000000000000000000000000", 22 | "topics": [ 23 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 24 | "0x0000000000000000000000000000000000000000000000000000000000000008", 25 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 26 | ], 27 | "type": "mined" 28 | }, 29 | { 30 | "logIndex": "0x0", 31 | "transactionIndex": "0x0", 32 | "transactionHash": "0xc9cd35e8859a80288871071b26decffb7f3019106350fc973f329eeeb565b0ef", 33 | "blockHash": "0x36fe85af162c7a26901e37302317d9de790d95f33edfe67d763be416c3abb95b", 34 | "blockNumber": "0xd", 35 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 36 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016900000000000000000000000000000000000000000000000000000000000000", 37 | "topics": [ 38 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 39 | "0x0000000000000000000000000000000000000000000000000000000000000009", 40 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 41 | ], 42 | "type": "mined" 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /test/data/logs2.json: -------------------------------------------------------------------------------- 1 | { 2 | "eth_newFilter-req": { 3 | "jsonrpc": "2.0", 4 | "id": 7, 5 | "method": "eth_newFilter", 6 | "params": [ 7 | { 8 | "topics": [ 9 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 10 | null, 11 | null 12 | ], 13 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 14 | "fromBlock": "0x0", 15 | "toBlock": "latest" 16 | } 17 | ] 18 | }, 19 | "eth_getLogs-res": { 20 | "id": 2686236096630, 21 | "jsonrpc": "2.0", 22 | "result": [ 23 | { 24 | "logIndex": "0x00", 25 | "transactionIndex": "0x00", 26 | "transactionHash": "0x78f9fa3190998d67b5378ad31b65580ca59829a95937654615c37e40088059c1", 27 | "blockHash": "0x840fa30511d5722f163c36202f7182758c1e741cfc4ec6ecddd7a93e9c30f4a6", 28 | "blockNumber": "0x09", 29 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 30 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016500000000000000000000000000000000000000000000000000000000000000", 31 | "topics": [ 32 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 33 | "0x0000000000000000000000000000000000000000000000000000000000000005", 34 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 35 | ], 36 | "type": "mined" 37 | }, 38 | { 39 | "logIndex": "0x00", 40 | "transactionIndex": "0x00", 41 | "transactionHash": "0xf312da29c8dbb359323debc8c735a1cd19fc24a215d0f4eb8c99fbb25e001dcf", 42 | "blockHash": "0xbba0e567a47d81ef9c27a5bfb5e638a2595ef53ec5d84c5d5129f08915704537", 43 | "blockNumber": "0x0a", 44 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 45 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000000", 46 | "topics": [ 47 | "0xf7dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 48 | "0x0000000000000000000000000000000000000000000000000000000000000006", 49 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 50 | ], 51 | "type": "mined" 52 | } 53 | ] 54 | } 55 | } -------------------------------------------------------------------------------- /test/data/logs3.json: -------------------------------------------------------------------------------- 1 | { 2 | "eth_newFilter-req": { 3 | "jsonrpc": "2.0", 4 | "id": 7, 5 | "method": "eth_newFilter", 6 | "params": [ 7 | { 8 | "topics": [ 9 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 10 | null, 11 | null 12 | ], 13 | "address": "0xFB0a4e5bbc481ae30826742c325ac26442cf0253", 14 | "fromBlock": "0x0", 15 | "toBlock": "latest" 16 | } 17 | ] 18 | }, 19 | "eth_getLogs-res": { 20 | "id": 2686236096630, 21 | "jsonrpc": "2.0", 22 | "result": [ 23 | { 24 | "logIndex": "0x00", 25 | "transactionIndex": "0x00", 26 | "transactionHash": "0x78f9fa3190998d67b5378ad31b65580ca59829a95937654615c37e40088059c1", 27 | "blockHash": "0x840fa30511d5722f163c36202f7182758c1e741cfc4ec6ecddd7a93e9c30f4a6", 28 | "blockNumber": "0x09", 29 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 30 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016500000000000000000000000000000000000000000000000000000000000000", 31 | "topics": [ 32 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 33 | "0x0000000000000000000000000000000000000000000000000000000000000005", 34 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 35 | ], 36 | "type": "mined" 37 | }, 38 | { 39 | "logIndex": "0x00", 40 | "transactionIndex": "0x00", 41 | "transactionHash": "0xf312da29c8dbb359323debc8c735a1cd19fc24a215d0f4eb8c99fbb25e001dcf", 42 | "blockHash": "0xbba0e567a47d81ef9c27a5bfb5e638a2595ef53ec5d84c5d5129f08915704537", 43 | "blockNumber": "0x0a", 44 | "address": "0xfb0a4e5bbc481ae30826742c325ac26442cf0253", 45 | "data": "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000000", 46 | "topics": [ 47 | "0xe6dcabaf37bca305551877dc9bc2cb6019fbb7859c0f74c037077d948fb17c56", 48 | "0x0000000000000000000000000000000000000000000000000000000000000006", 49 | "0x0000000000000000000000001daa654cfbc28f375e0f08f329de219fff50c765" 50 | ], 51 | "type": "mined" 52 | } 53 | ] 54 | } 55 | } -------------------------------------------------------------------------------- /test/data/logs4.json: -------------------------------------------------------------------------------- 1 | { 2 | "inputLogs": [ 3 | { 4 | "topics": [ 5 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01", 6 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 7 | ] 8 | }, 9 | { 10 | "topics": [ 11 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02", 12 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01" 13 | ] 14 | } 15 | ], 16 | "filterParams": { 17 | "topics": [ 18 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01", 19 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 20 | ] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /test/data/logs5.json: -------------------------------------------------------------------------------- 1 | { 2 | "inputLogs": [ 3 | { 4 | "topics": [ 5 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01" 6 | ] 7 | }, 8 | { 9 | "topics": [ 10 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 11 | ] 12 | }, 13 | { 14 | "topics": [ 15 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe03" 16 | ] 17 | } 18 | ], 19 | "filterParams": { 20 | "topics": [ 21 | [ 22 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01", 23 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 24 | ] 25 | ] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /test/data/logs6.json: -------------------------------------------------------------------------------- 1 | { 2 | "inputLogs": [ 3 | { 4 | "topics": [ 5 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01", 6 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01" 7 | ] 8 | }, 9 | { 10 | "topics": [ 11 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02", 12 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 13 | ] 14 | }, 15 | { 16 | "topics": [ 17 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe01", 18 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 19 | ] 20 | } 21 | ], 22 | "filterParams": { 23 | "topics": [ 24 | null, 25 | "0x00000000000000000000000000000000000000000000000000deadbeefcafe02" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /test/ganache.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const { 3 | createTestSetup, 4 | asyncTest, 5 | deployLogEchoContract, 6 | } = require('./util') 7 | 8 | test('LogFilter - basic', asyncTest(async (t) => { 9 | 10 | const tools = createTestSetup() 11 | const { request } = tools 12 | 13 | // deploy log-echo contract 14 | const accounts = await request({ 15 | method: "eth_accounts", 16 | params: [] 17 | }); 18 | const fromAccount = accounts[0]; 19 | const { contractAddress } = await deployLogEchoContract({ tools, from: fromAccount }) 20 | t.ok(contractAddress, 'got deployed contract address') 21 | 22 | // create filter 23 | const blockNumber = await request({ method: 'eth_blockNumber' }) 24 | const targetTopic = '0xaabbcce106361d4f6cd9098051596d565c1dbf7bc20b4c3acb3aaa4204aabbcc' 25 | const filterId = await request({ 26 | method: 'eth_newFilter', 27 | params: { 28 | address: contractAddress, 29 | topics: [targetTopic], 30 | fromBlock: blockNumber, 31 | toBlock: 'latest' 32 | } 33 | }) 34 | t.ok(filterId, `got filter id: ${filterId} (${typeof filterId})`) 35 | 36 | // trigger filter 37 | const triggeringTxHash = await request({ 38 | method: 'eth_sendTransaction', 39 | params: [{ 40 | from: fromAccount, 41 | to: contractAddress, 42 | data: targetTopic 43 | }] 44 | }) 45 | await tools.trackNextBlock() 46 | // check filter 47 | const filterChanges = await request({ 48 | method: 'eth_getFilterChanges', 49 | params: [filterId] 50 | }) 51 | t.equal(filterChanges.length, 1, 'only one matched filter') 52 | const matchingFilter = filterChanges[0] 53 | t.equal(matchingFilter.transactionHash, triggeringTxHash, 'tx hash should match') 54 | t.equal(matchingFilter.topics.length, 1, 'emitted a single log topic') 55 | const matchedTopic = matchingFilter.topics[0] 56 | t.equal(matchedTopic, targetTopic, 'topic matches expected') 57 | 58 | await request({ method: 'eth_uninstallFilter', params: [filterId] }) 59 | })) 60 | 61 | test('LogFilter - multiple blocks', asyncTest(async (t) => { 62 | 63 | const tools = createTestSetup() 64 | const { request } = tools 65 | 66 | // deploy log-echo contract 67 | const accounts = await request({ 68 | method: "eth_accounts", 69 | params: [] 70 | }); 71 | const fromAcccount = accounts[0]; 72 | const { contractAddress } = await deployLogEchoContract({ tools, from: fromAcccount }) 73 | t.ok(contractAddress, 'got deployed contract address') 74 | 75 | // create filter 76 | const blockNumber = await request({ method: 'eth_blockNumber' }) 77 | const targetTopic = '0x112233e106361d4f6cd9098051596d565c1dbf7bc20b4c3acb3aaa4204112233' 78 | const filterId = await request({ 79 | method: 'eth_newFilter', 80 | params: [{ 81 | address: contractAddress, 82 | topics: [targetTopic], 83 | fromBlock: blockNumber, 84 | toBlock: 'latest' 85 | }] 86 | }) 87 | t.ok(filterId, `got filter id: ${filterId} (${typeof filterId})`) 88 | 89 | // await multiple blocks 90 | await tools.forceNextBlock() 91 | await tools.trackNextBlock() 92 | await tools.forceNextBlock() 93 | await tools.trackNextBlock() 94 | await tools.forceNextBlock() 95 | await tools.trackNextBlock() 96 | 97 | // trigger filter 98 | const triggeringTxHash = await request({ 99 | method: 'eth_sendTransaction', 100 | params: [{ 101 | from: fromAcccount, 102 | to: contractAddress, 103 | data: targetTopic 104 | }] 105 | }) 106 | await tools.trackNextBlock() 107 | 108 | // await multiple blocks 109 | await tools.forceNextBlock() 110 | await tools.trackNextBlock() 111 | await tools.forceNextBlock() 112 | await tools.trackNextBlock() 113 | 114 | // check filter 115 | const filterChanges = await request({ 116 | method: 'eth_getFilterChanges', 117 | params: [filterId] 118 | }) 119 | t.equal(filterChanges.length, 1, 'only one matched filter') 120 | const matchingFilter = filterChanges[0] 121 | t.equal(matchingFilter.transactionHash, triggeringTxHash, 'tx hash should match') 122 | t.equal(matchingFilter.topics.length, 1, 'emitted a single log topic') 123 | const matchedTopic = matchingFilter.topics[0] 124 | t.equal(matchedTopic, targetTopic, 'topic matches expected') 125 | 126 | await request({ method: 'eth_uninstallFilter', params: [filterId] }) 127 | })) 128 | 129 | test('BlockFilter - basic', asyncTest(async (t) => { 130 | 131 | const tools = createTestSetup() 132 | const { request } = tools 133 | 134 | // await first block 135 | await tools.trackNextBlock() 136 | 137 | // create filter 138 | const filterId = await request({ method: 'eth_newBlockFilter', }) 139 | t.ok(filterId, `got filter id: ${filterId} (${typeof filterId})`) 140 | 141 | // check filter 142 | const filterChanges1 = await request({ 143 | method: 'eth_getFilterChanges', 144 | params: [filterId] 145 | }) 146 | t.equal(filterChanges1.length, 0, 'no matched filters yet') 147 | 148 | // await one block 149 | await tools.forceNextBlock() 150 | await tools.trackNextBlock() 151 | // check filter 152 | const filterChanges2 = await request({ 153 | method: 'eth_getFilterChanges', 154 | params: [filterId] 155 | }) 156 | t.equal(filterChanges2.length, 1, 'only one matched filter') 157 | const matchingFilter1 = filterChanges2[0] 158 | t.equal(matchingFilter1.length, 2 + 32 * 2, 'result is correct length for block hash') 159 | // check filter 160 | const filterChanges3 = await request({ 161 | method: 'eth_getFilterChanges', 162 | params: [filterId] 163 | }) 164 | t.equal(filterChanges3.length, 0, 'matched filters reset') 165 | 166 | // await two blocks 167 | await tools.forceNextBlock() 168 | await tools.trackNextBlock() 169 | await tools.forceNextBlock() 170 | await tools.trackNextBlock() 171 | 172 | // check filter 173 | const filterChanges4 = await request({ 174 | method: 'eth_getFilterChanges', 175 | params: [filterId] 176 | }) 177 | t.equal(filterChanges4.length, 2, 'two matched filter') 178 | const matchingFilter2 = filterChanges4[0] 179 | const matchingFilter3 = filterChanges4[1] 180 | t.equal(matchingFilter2.length, 2 + 32 * 2, 'result is correct length for block hash') 181 | t.equal(matchingFilter3.length, 2 + 32 * 2, 'result is correct length for block hash') 182 | t.notEqual(matchingFilter2, matchingFilter3, 'hashes are different') 183 | 184 | await request({ 185 | method: 'eth_uninstallFilter', 186 | params: [filterId] 187 | }) 188 | })) 189 | -------------------------------------------------------------------------------- /test/getBlocksForRange.js: -------------------------------------------------------------------------------- 1 | const sinon = require("sinon"); 2 | const test = require("tape"); 3 | 4 | const getBlocksForRange = require("../getBlocksForRange"); 5 | 6 | test("return block number if there is no error", async (t) => { 7 | const request = sinon 8 | .stub() 9 | .withArgs({ 10 | id: 1, 11 | jsonrpc: "2.0", 12 | method: "eth_getBlockByNumber", 13 | params: ["0x1", false], 14 | }) 15 | .onCall(0) 16 | .returns("0x5c377193f05cb9aa0f44bcc77d05492f"); 17 | const provider = { request }; 18 | try { 19 | const result = await getBlocksForRange({ 20 | provider, 21 | fromBlock: "0x1", 22 | toBlock: "0x1", 23 | }); 24 | t.deepEquals(result, ["0x5c377193f05cb9aa0f44bcc77d05492f"]); 25 | } catch (error) { 26 | t.fail("Should not throw error if result is obtained"); 27 | } 28 | t.end(); 29 | }); 30 | 31 | test("not throw error even if it is not found and filter out null", async (t) => { 32 | const request = sinon 33 | .stub() 34 | .withArgs({ 35 | id: 1, 36 | jsonrpc: "2.0", 37 | method: "eth_getBlockByNumber", 38 | params: ["0x1", false], 39 | }) 40 | .onCall(0) 41 | .throws(new Error("some error")) 42 | .onCall(1) 43 | .returns(null); 44 | const provider = { request }; 45 | try { 46 | const result = await getBlocksForRange({ provider, fromBlock: "0x1", toBlock: "0x1" }); 47 | t.deepEquals(result, []); 48 | } catch (error) { 49 | t.fail("Should not throw error if result is obtained"); 50 | } 51 | t.end(); 52 | }); 53 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | process.on('unhandledRejection', function (err) { 2 | throw err 3 | }) 4 | 5 | require('./logs') 6 | require('./ganache') 7 | require('./subscriptions') 8 | require('./getBlocksForRange') 9 | -------------------------------------------------------------------------------- /test/logs.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const LogFilter = require('../log-filter') 3 | const testData0 = require('./data/logs0.json') 4 | const testData1 = require('./data/logs1.json') 5 | const testData2 = require('./data/logs2.json') 6 | const testData3 = require('./data/logs3.json') 7 | const testData4 = require('./data/logs4.json') 8 | const testData5 = require('./data/logs5.json') 9 | const testData6 = require('./data/logs6.json') 10 | 11 | test('log filter match 0', (t) => { 12 | 13 | const params = testData0['eth_newFilter-req'].params[0] 14 | const inputLogs = testData0['eth_getLogs-res'].result 15 | 16 | const filter = new LogFilter({ params }) 17 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 18 | t.equal(inputLogs.length, 2, 'start with two logs') 19 | t.equal(matchingLogs.length, 2, 'correct number of logs matched') 20 | t.end() 21 | 22 | }) 23 | 24 | test('log filter - match 1', (t) => { 25 | 26 | const params = testData1.params 27 | const inputLogs = testData1.newLogs 28 | 29 | const filter = new LogFilter({ params }) 30 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 31 | t.equal(inputLogs.length, 2, 'start with two logs') 32 | t.equal(matchingLogs.length, 0, 'correct number of logs matched') 33 | t.end() 34 | 35 | }) 36 | 37 | test('log filter - match 2', (t) => { 38 | 39 | const params = testData2['eth_newFilter-req'].params[0] 40 | const inputLogs = testData2['eth_getLogs-res'].result 41 | 42 | const filter = new LogFilter({ params }) 43 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 44 | t.equal(inputLogs.length, 2, 'start with two logs') 45 | t.equal(matchingLogs.length, 1, 'correct number of logs matched') 46 | t.end() 47 | 48 | }) 49 | 50 | test('log filter - match case-sensitive', (t) => { 51 | 52 | const params = testData3['eth_newFilter-req'].params[0] 53 | const inputLogs = testData3['eth_getLogs-res'].result 54 | 55 | const filter = new LogFilter({ params }) 56 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 57 | t.equal(inputLogs.length, 2, 'start with two logs') 58 | t.equal(matchingLogs.length, 2, 'correct number of logs matched') 59 | t.end() 60 | 61 | }) 62 | 63 | test('log filter - "and" logic', (t) => { 64 | 65 | const params = testData4.filterParams 66 | const inputLogs = testData4.inputLogs 67 | 68 | const filter = new LogFilter({ params }) 69 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 70 | t.equal(inputLogs.length, 2, 'start with two logs') 71 | t.equal(matchingLogs.length, 1, 'correct number of logs matched') 72 | t.end() 73 | 74 | }) 75 | 76 | test('log filter - "or" logic', (t) => { 77 | 78 | const params = testData5.filterParams 79 | const inputLogs = testData5.inputLogs 80 | 81 | const filter = new LogFilter({ params }) 82 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 83 | t.equal(inputLogs.length, 3, 'start with three logs') 84 | t.equal(matchingLogs.length, 2, 'correct number of logs matched') 85 | t.end() 86 | 87 | }) 88 | 89 | test('log filter - "wildcard" logic', (t) => { 90 | 91 | const params = testData6.filterParams 92 | const inputLogs = testData6.inputLogs 93 | 94 | const filter = new LogFilter({ params }) 95 | const matchingLogs = inputLogs.filter(log => filter.matchLog(log)) 96 | t.equal(inputLogs.length, 3, 'start with three logs') 97 | t.equal(matchingLogs.length, 2, 'correct number of logs matched') 98 | t.end() 99 | 100 | }) 101 | -------------------------------------------------------------------------------- /test/subscriptions.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const { 3 | createTestSetup, 4 | asyncTest, 5 | timeout, 6 | deployLogEchoContract, 7 | } = require('./util') 8 | 9 | test('subscriptions - newHeads', asyncTest(async (t) => { 10 | 11 | const tools = createTestSetup() 12 | const subs = tools.subs 13 | 14 | // await first block 15 | await tools.forceNextBlock() 16 | await tools.trackNextBlock() 17 | 18 | // create sub 19 | const subResults = [] 20 | const sub = await subs.newHeads() 21 | sub.events.on('notification', (value) => { 22 | subResults.push(value) 23 | }) 24 | const subId = sub.id 25 | t.ok(subId, `got sub id: ${subId} (${typeof subId})`) 26 | t.equal(typeof subId, 'string', `got sub id as hex string (${typeof subId})`) 27 | 28 | // check sub 29 | t.equal(subResults.length, 0, 'no sub results yet') 30 | 31 | // await one block 32 | await tools.forceNextBlock() 33 | await tools.trackNextBlock() 34 | 35 | // await for subscription results to be processed, then check recorded sub results 36 | await timeout(200) 37 | t.equal(subResults.length, 1, 'only one sub result') 38 | 39 | // await two blocks 40 | await tools.forceNextBlock() 41 | await tools.trackNextBlock() 42 | await tools.forceNextBlock() 43 | await tools.trackNextBlock() 44 | 45 | // await for subscription results to be processed, then check recorded sub results 46 | await timeout(200) 47 | t.equal(subResults.length, 3, 'three sub results') 48 | 49 | // uninstall subscription 50 | await sub.uninstall() 51 | })) 52 | 53 | test('subscriptions - log', asyncTest(async (t) => { 54 | 55 | const tools = createTestSetup() 56 | const { request, subs, blockTracker } = tools 57 | 58 | // deploy log-echo contract 59 | const accounts = await request({ 60 | method: "eth_accounts", 61 | params: [] 62 | }); 63 | const fromAcccount = accounts[0]; 64 | const { contractAddress } = await deployLogEchoContract({ tools, from: fromAcccount }) 65 | t.ok(contractAddress, 'got deployed contract address') 66 | // deploy secondary "wrong" log contract 67 | const wrongContractAddress = (await deployLogEchoContract({ tools, from: fromAcccount })).contractAddress 68 | 69 | // create subscription 70 | const subResults = [] 71 | const blockNumber = await blockTracker.getLatestBlock() 72 | const targetTopic = '0xaabbcce106361d4f6cd9098051596d565c1dbf7bc20b4c3acb3aaa4204aabbcc' 73 | const wrongTopic = '0xffffffe106361d4f6cd9098051596d565c1dbf7bc20b4c3acb3aaa4204ffffff' 74 | const filterParams = { address: contractAddress, topics: [targetTopic], fromBlock: blockNumber, toBlock: 'latest' } 75 | const sub = await subs.logs(filterParams) 76 | sub.events.on('notification', (value) => { 77 | subResults.push(value) 78 | }) 79 | 80 | // verify subId 81 | const subId = sub.id 82 | t.ok(subId, `got filter id: ${subId} (${typeof subId})`) 83 | t.equal(typeof subId, 'string', `got sub id as hex string (${typeof subId})`) 84 | 85 | // trigger matching log 86 | const triggeringTxHash = await request({ 87 | method: 'eth_sendTransaction', 88 | params: [{ from: fromAcccount, to: contractAddress, data: targetTopic }] 89 | }) 90 | await tools.trackNextBlock() 91 | 92 | // trigger non-matching log 93 | await request({ 94 | method: 'eth_sendTransaction', 95 | params: [{ 96 | from: fromAcccount, 97 | to: contractAddress, 98 | data: wrongTopic 99 | }] 100 | }) 101 | await tools.trackNextBlock() 102 | 103 | // trigger non-matching contract 104 | await request({ 105 | method: 'eth_sendTransaction', 106 | params: [{ from: fromAcccount, to: wrongContractAddress, data: targetTopic }] 107 | }) 108 | await tools.trackNextBlock() 109 | 110 | // wait for subscription results to update 111 | await timeout(200) 112 | 113 | // check subscription results 114 | t.equal(subResults.length, 1, 'only one matched filter') 115 | const matchingResults = subResults[0] 116 | t.equal(matchingResults.transactionHash, triggeringTxHash, 'tx hash should match') 117 | t.equal(matchingResults.topics.length, 1, 'emitted a single log topic') 118 | const matchedTopic = matchingResults.topics[0] 119 | t.equal(matchedTopic, targetTopic, 'topic matches expected') 120 | 121 | await sub.uninstall() 122 | })) 123 | -------------------------------------------------------------------------------- /test/util.js: -------------------------------------------------------------------------------- 1 | const EventEmitter = require('events') 2 | const { PollingBlockTracker } = require('@metamask/eth-block-tracker') 3 | const { JsonRpcEngine } = require('@metamask/json-rpc-engine') 4 | const { providerAsMiddleware } = require('@metamask/eth-json-rpc-middleware') 5 | const { providerFromEngine } = require('@metamask/eth-json-rpc-provider') 6 | const Ganache = require('ganache') 7 | const createFilterMiddleware = require('../index.js') 8 | const createSubscriptionMiddleware = require('../subscriptionManager.js') 9 | 10 | module.exports = { 11 | createPayload, 12 | createEngineFromGanache, 13 | createEngineFromTestBlockMiddleware, 14 | createTestSetup, 15 | asyncTest, 16 | timeout, 17 | deployLogEchoContract, 18 | } 19 | 20 | function createTestSetup() { 21 | // raw data source 22 | const { ganacheProvider, forceNextBlock } = createEngineFromGanache() 23 | // create block trackerfilterId 24 | const blockTracker = new PollingBlockTracker({ 25 | provider: ganacheProvider, 26 | pollingInterval: 200, 27 | }) 28 | // create higher level 29 | const engine = new JsonRpcEngine() 30 | const provider = providerFromEngine(engine) 31 | const request = provider.request.bind(provider); 32 | // add filter middleware 33 | engine.push(createFilterMiddleware({ blockTracker, provider })) 34 | // add subscription middleware 35 | const subscriptionManager = createSubscriptionMiddleware({ blockTracker, provider }) 36 | engine.push(subscriptionManager.middleware) 37 | subscriptionManager.events.on('notification', (message) => engine.emit('notification', message)) 38 | // add data source 39 | engine.push(providerAsMiddleware(ganacheProvider)) 40 | 41 | // subs helper 42 | const subs = createSubsHelper({ provider }) 43 | 44 | return { ganacheProvider, forceNextBlock, engine, provider, request, subs, blockTracker, trackNextBlock } 45 | 46 | async function trackNextBlock() { 47 | return new Promise((resolve) => blockTracker.once('latest', resolve)) 48 | } 49 | } 50 | 51 | function createSubsHelper({ provider }) { 52 | return { 53 | logs: createSubGenerator({ subType: 'logs', provider }), 54 | newPendingTransactions: createSubGenerator({ subType: 'newPendingTransactions', provider }), 55 | newHeads: createSubGenerator({ subType: 'newHeads', provider }), 56 | } 57 | } 58 | 59 | function createSubGenerator({ subType, provider }) { 60 | return async function () { 61 | const args = [].slice.call(arguments); 62 | args.unshift(subType); 63 | const id = await provider.request({ 64 | method: "eth_subscribe", 65 | params: args, 66 | }); 67 | return createNewSub({ id, provider }); 68 | }; 69 | } 70 | 71 | function createNewSub({ id, provider }) { 72 | // event emitter for emiting subscription hits 73 | const events = new EventEmitter() 74 | // filter rpc notifications for matching subscription 75 | provider.on('data', (_, message) => { 76 | if (message.method !== 'eth_subscription') return 77 | const subId = message.params.subscription 78 | if (subId !== id) return 79 | const value = message.params.result 80 | events.emit('notification', value) 81 | }) 82 | // subscription uninstall method 83 | async function uninstall() { 84 | return await provider.request({ method: 'eth_unsubscribe', params: [id] }); 85 | } 86 | // return custom "subscription" api object 87 | return { 88 | id, 89 | events, 90 | uninstall, 91 | } 92 | } 93 | 94 | function createEngineFromGanache () { 95 | const ganacheProvider = Ganache.provider() 96 | return { ganacheProvider, forceNextBlock } 97 | 98 | async function forceNextBlock() { 99 | // custom ganache method 100 | await ganacheProvider.request(createPayload({ method: 'evm_mine' })) 101 | } 102 | } 103 | 104 | function createEngineFromTestBlockMiddleware() { 105 | const engine = new JsonRpcEngine() 106 | const testBlockSource = new TestBlockMiddleware() 107 | engine.push(testBlockSource.createMiddleware()) 108 | return { engine, testBlockSource } 109 | } 110 | 111 | function createPayload(payload) { 112 | return Object.assign({ id: 1, jsonrpc: '2.0', params: [] }, payload) 113 | } 114 | 115 | function asyncTest(asyncTestFn) { 116 | return async function (t) { 117 | try { 118 | await asyncTestFn(t) 119 | t.end() 120 | } catch (err) { 121 | t.end(err) 122 | } 123 | } 124 | } 125 | 126 | function timeout(duration) { 127 | return new Promise(resolve => setTimeout(resolve, duration)) 128 | } 129 | 130 | 131 | async function deployLogEchoContract({ tools, from }) { 132 | // https://github.com/kumavis/eth-needlepoint/blob/master/examples/emit-log.js 133 | const { request } = tools; 134 | const deployTxHash = await request({ 135 | method: 'eth_sendTransaction', 136 | params: [{ 137 | from, 138 | data: '0x600e600c600039600e6000f336600060003760005160206000a1' 139 | }] 140 | }) 141 | 142 | await tools.trackNextBlock() 143 | const deployTxRx = await request({ 144 | method: 'eth_getTransactionReceipt', 145 | params: [deployTxHash] 146 | }) 147 | const contractAddress = deployTxRx.contractAddress 148 | return { 149 | deployTxHash, 150 | deployTxRx, 151 | contractAddress, 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /tx-filter.js: -------------------------------------------------------------------------------- 1 | const BaseFilter = require('./base-filter') 2 | const getBlocksForRange = require('./getBlocksForRange') 3 | const { incrementHexInt } = require('./hexUtils') 4 | 5 | class TxFilter extends BaseFilter { 6 | 7 | constructor ({ provider }) { 8 | super() 9 | this.type = 'tx' 10 | this.provider = provider 11 | } 12 | 13 | async update ({ oldBlock }) { 14 | const toBlock = oldBlock 15 | const fromBlock = incrementHexInt(oldBlock) 16 | const blocks = await getBlocksForRange({ provider: this.provider, fromBlock, toBlock }) 17 | const blockTxHashes = [] 18 | for (const block of blocks) { 19 | blockTxHashes.push(...block.transactions) 20 | } 21 | // add to results 22 | this.addResults(blockTxHashes) 23 | } 24 | 25 | } 26 | 27 | module.exports = TxFilter 28 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ethereumjs/common@^3.2.0": 6 | version "3.2.0" 7 | resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" 8 | integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== 9 | dependencies: 10 | "@ethereumjs/util" "^8.1.0" 11 | crc-32 "^1.2.0" 12 | 13 | "@ethereumjs/rlp@^4.0.1": 14 | version "4.0.1" 15 | resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" 16 | integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== 17 | 18 | "@ethereumjs/tx@^4.2.0": 19 | version "4.2.0" 20 | resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" 21 | integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== 22 | dependencies: 23 | "@ethereumjs/common" "^3.2.0" 24 | "@ethereumjs/rlp" "^4.0.1" 25 | "@ethereumjs/util" "^8.1.0" 26 | ethereum-cryptography "^2.0.0" 27 | 28 | "@ethereumjs/util@^8.1.0": 29 | version "8.1.0" 30 | resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" 31 | integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== 32 | dependencies: 33 | "@ethereumjs/rlp" "^4.0.1" 34 | ethereum-cryptography "^2.0.0" 35 | micro-ftch "^0.3.1" 36 | 37 | "@isaacs/cliui@^8.0.2": 38 | version "8.0.2" 39 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 40 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 41 | dependencies: 42 | string-width "^5.1.2" 43 | string-width-cjs "npm:string-width@^4.2.0" 44 | strip-ansi "^7.0.1" 45 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 46 | wrap-ansi "^8.1.0" 47 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 48 | 49 | "@lavamoat/aa@^3.1.5": 50 | version "3.1.5" 51 | resolved "https://registry.yarnpkg.com/@lavamoat/aa/-/aa-3.1.5.tgz#2cca45f6269184f39b170d46588df962c17f4083" 52 | integrity sha512-GZY+xq6eD9fmG+5vlFnFrZfIAgyky1SDdjvmgtMzTHoiwEHIiBxHg32L7x7jJjInI5Ejy52V9GmgM4QaErysbA== 53 | dependencies: 54 | resolve "^1.22.3" 55 | 56 | "@lavamoat/allow-scripts@^2.5.1": 57 | version "2.5.1" 58 | resolved "https://registry.yarnpkg.com/@lavamoat/allow-scripts/-/allow-scripts-2.5.1.tgz#003ed6655f37b083695982841bbe8962737bd055" 59 | integrity sha512-JxidVui7IggOmsIdDPHh71NltA1J5U76IvJwb34fClFCFa4ggt6SNfJi4/yPe/iVho4mNIB91HCKm4Pu6yo5HA== 60 | dependencies: 61 | "@lavamoat/aa" "^3.1.5" 62 | "@npmcli/run-script" "^6.0.0" 63 | bin-links "4.0.1" 64 | npm-normalize-package-bin "^3.0.0" 65 | yargs "^16.2.0" 66 | 67 | "@ljharb/resumer@^0.0.1": 68 | version "0.0.1" 69 | resolved "https://registry.yarnpkg.com/@ljharb/resumer/-/resumer-0.0.1.tgz#8a940a9192dd31f6a1df17564bbd26dc6ad3e68d" 70 | integrity sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw== 71 | dependencies: 72 | "@ljharb/through" "^2.3.9" 73 | 74 | "@ljharb/through@^2.3.9": 75 | version "2.3.9" 76 | resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.9.tgz#85f221eb82f9d555e180e87d6e50fb154af85408" 77 | integrity sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ== 78 | 79 | "@metamask/abi-utils@^2.0.4": 80 | version "2.0.4" 81 | resolved "https://registry.yarnpkg.com/@metamask/abi-utils/-/abi-utils-2.0.4.tgz#20908c1d910f7a17a89fdf5778a5c59d5cb8b8be" 82 | integrity sha512-StnIgUB75x7a7AgUhiaUZDpCsqGp7VkNnZh2XivXkJ6mPkE83U8ARGQj5MbRis7VJY8BC5V1AbB1fjdh0hupPQ== 83 | dependencies: 84 | "@metamask/superstruct" "^3.1.0" 85 | "@metamask/utils" "^9.0.0" 86 | 87 | "@metamask/auto-changelog@^3.3.0": 88 | version "3.4.4" 89 | resolved "https://registry.yarnpkg.com/@metamask/auto-changelog/-/auto-changelog-3.4.4.tgz#981c3bf07f8fd0dcec0170788abdc5792018c430" 90 | integrity sha512-bA2U6JXIQpbTbiURZ4X+c0OmkzQUOAggmG7x+NL37ELL8zI5NuiRyuR1dvlmhhlOUOdj8cCuqYFOxR478kz4Lg== 91 | dependencies: 92 | diff "^5.0.0" 93 | execa "^5.1.1" 94 | prettier "^2.8.8" 95 | semver "^7.3.5" 96 | yargs "^17.0.1" 97 | 98 | "@metamask/eth-block-tracker@^11.0.1": 99 | version "11.0.2" 100 | resolved "https://registry.yarnpkg.com/@metamask/eth-block-tracker/-/eth-block-tracker-11.0.2.tgz#7890a4430bd6a92577585a66d7958771bfd88ec8" 101 | integrity sha512-R1J3n2WY3PyEfYELc45MVFw7+6iKu7O3S/nBU0icmM3Q2mVqDMpctF5Z5pAZDYYEW35h7tTU2KJfUb1DrXzWcg== 102 | dependencies: 103 | "@metamask/eth-json-rpc-provider" "^4.1.5" 104 | "@metamask/safe-event-emitter" "^3.1.1" 105 | "@metamask/utils" "^9.1.0" 106 | json-rpc-random-id "^1.0.1" 107 | pify "^5.0.0" 108 | 109 | "@metamask/eth-json-rpc-middleware@^15.0.0": 110 | version "15.0.0" 111 | resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-middleware/-/eth-json-rpc-middleware-15.0.0.tgz#167288ad4618438af9d1bda75d238cb0facfde3f" 112 | integrity sha512-RkmaPQPWGH1qggaq0sStwVIeamiJOjf/2jBJfbX78r/nDCai8ddY/zHpATJr42SvtRYD0JrCPjo6v356IDzjQw== 113 | dependencies: 114 | "@metamask/eth-block-tracker" "^11.0.1" 115 | "@metamask/eth-json-rpc-provider" "^4.1.5" 116 | "@metamask/eth-sig-util" "^7.0.3" 117 | "@metamask/json-rpc-engine" "^10.0.0" 118 | "@metamask/rpc-errors" "^7.0.0" 119 | "@metamask/utils" "^9.1.0" 120 | "@types/bn.js" "^5.1.5" 121 | bn.js "^5.2.1" 122 | klona "^2.0.6" 123 | pify "^5.0.0" 124 | safe-stable-stringify "^2.4.3" 125 | 126 | "@metamask/eth-json-rpc-provider@^4.1.5": 127 | version "4.1.6" 128 | resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-4.1.6.tgz#5d86ee7db6ff94b0abe1f00ef02aeffa60536497" 129 | integrity sha512-32gz41C416E0P+b6YpG/2Ne1UoyqxHRGT9xBh1LTFaWvZXfGQxjSTdK+AEVG01pZ8Mf8Bgp8z2SpEsWcE9ZCng== 130 | dependencies: 131 | "@metamask/json-rpc-engine" "^10.0.1" 132 | "@metamask/rpc-errors" "^7.0.1" 133 | "@metamask/safe-event-emitter" "^3.0.0" 134 | "@metamask/utils" "^10.0.0" 135 | uuid "^8.3.2" 136 | 137 | "@metamask/eth-query@^4.0.0": 138 | version "4.0.0" 139 | resolved "https://registry.yarnpkg.com/@metamask/eth-query/-/eth-query-4.0.0.tgz#a8c1651b69e298da58628b1c09d31dd504a939b3" 140 | integrity sha512-j2yPO2axYGyxwdqXRRhk2zBijt1Nd/xKCIXQkzvfWac0sKP0L9mSt1ZxMOe/sOF1SwS2R+NSaq+gsQDsQvrC4Q== 141 | dependencies: 142 | json-rpc-random-id "^1.0.0" 143 | xtend "^4.0.1" 144 | 145 | "@metamask/eth-sig-util@^7.0.3": 146 | version "7.0.3" 147 | resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-7.0.3.tgz#be9e444fe0b8474c04e2ff42fd983173767f6ac0" 148 | integrity sha512-PAtGnOkYvh90k2lEZldq/FK7GTLF6WxE+2bV85PoA3pqlJnmJCAY62tuvxHSwnVngSKlc4mcNvjnUg2eYO6JGg== 149 | dependencies: 150 | "@ethereumjs/util" "^8.1.0" 151 | "@metamask/abi-utils" "^2.0.4" 152 | "@metamask/utils" "^9.0.0" 153 | "@scure/base" "~1.1.3" 154 | ethereum-cryptography "^2.1.2" 155 | tweetnacl "^1.0.3" 156 | 157 | "@metamask/json-rpc-engine@^10.0.0", "@metamask/json-rpc-engine@^10.0.1": 158 | version "10.0.1" 159 | resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-10.0.1.tgz#432e4b42770ecd4da8a89f94b52cdeac982bdca3" 160 | integrity sha512-RmoKubUhK7BtZrllJjqMiSkW0p5QIKiO8ohJoa7/pewJIgPWzPFid/5EahQ4f/sPtTH9O9ypDQF9r7DFCPFSVQ== 161 | dependencies: 162 | "@metamask/rpc-errors" "^7.0.1" 163 | "@metamask/safe-event-emitter" "^3.0.0" 164 | "@metamask/utils" "^10.0.0" 165 | 166 | "@metamask/rpc-errors@^7.0.0", "@metamask/rpc-errors@^7.0.1": 167 | version "7.0.1" 168 | resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-7.0.1.tgz#0eb2231a1d5e6bb102df5ac07f365c695bf70055" 169 | integrity sha512-EeQGYioq845w2iBmiR9LHYqHhYIaeDTmxprHpPE3BTlkLB74P0xLv/TivOn4snNLowiC5ekOXfcUzCQszTDmSg== 170 | dependencies: 171 | "@metamask/utils" "^10.0.0" 172 | fast-safe-stringify "^2.0.6" 173 | 174 | "@metamask/safe-event-emitter@^3.0.0", "@metamask/safe-event-emitter@^3.1.1": 175 | version "3.1.2" 176 | resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz#bfac8c7a1a149b5bbfe98f59fbfea512dfa3bad4" 177 | integrity sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA== 178 | 179 | "@metamask/superstruct@^3.1.0": 180 | version "3.1.0" 181 | resolved "https://registry.yarnpkg.com/@metamask/superstruct/-/superstruct-3.1.0.tgz#148f786a674fba3ac885c1093ab718515bf7f648" 182 | integrity sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA== 183 | 184 | "@metamask/utils@^10.0.0": 185 | version "10.0.0" 186 | resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-10.0.0.tgz#9285e6e195810e8b7c875147ac64981b4be51733" 187 | integrity sha512-EoNZJijLqBbir8ikuiHBHfhCqE1s8Odae3bhtRAd8itJB109xmfFF84djY/iaQI+EAp59Sy7iwengfRohaTK8A== 188 | dependencies: 189 | "@ethereumjs/tx" "^4.2.0" 190 | "@metamask/superstruct" "^3.1.0" 191 | "@noble/hashes" "^1.3.1" 192 | "@scure/base" "^1.1.3" 193 | "@types/debug" "^4.1.7" 194 | debug "^4.3.4" 195 | pony-cause "^2.1.10" 196 | semver "^7.5.4" 197 | uuid "^9.0.1" 198 | 199 | "@metamask/utils@^9.0.0", "@metamask/utils@^9.1.0": 200 | version "9.3.0" 201 | resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-9.3.0.tgz#4726bd7f5d6a43ea8425b6d663ab9207f617c2d1" 202 | integrity sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g== 203 | dependencies: 204 | "@ethereumjs/tx" "^4.2.0" 205 | "@metamask/superstruct" "^3.1.0" 206 | "@noble/hashes" "^1.3.1" 207 | "@scure/base" "^1.1.3" 208 | "@types/debug" "^4.1.7" 209 | debug "^4.3.4" 210 | pony-cause "^2.1.10" 211 | semver "^7.5.4" 212 | uuid "^9.0.1" 213 | 214 | "@noble/curves@1.1.0", "@noble/curves@~1.1.0": 215 | version "1.1.0" 216 | resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" 217 | integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== 218 | dependencies: 219 | "@noble/hashes" "1.3.1" 220 | 221 | "@noble/hashes@1.3.1": 222 | version "1.3.1" 223 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" 224 | integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== 225 | 226 | "@noble/hashes@^1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": 227 | version "1.3.2" 228 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" 229 | integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== 230 | 231 | "@npmcli/fs@^3.1.0": 232 | version "3.1.0" 233 | resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" 234 | integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== 235 | dependencies: 236 | semver "^7.3.5" 237 | 238 | "@npmcli/node-gyp@^3.0.0": 239 | version "3.0.0" 240 | resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" 241 | integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== 242 | 243 | "@npmcli/promise-spawn@^6.0.0": 244 | version "6.0.2" 245 | resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" 246 | integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== 247 | dependencies: 248 | which "^3.0.0" 249 | 250 | "@npmcli/run-script@^6.0.0": 251 | version "6.0.2" 252 | resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" 253 | integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== 254 | dependencies: 255 | "@npmcli/node-gyp" "^3.0.0" 256 | "@npmcli/promise-spawn" "^6.0.0" 257 | node-gyp "^9.0.0" 258 | read-package-json-fast "^3.0.0" 259 | which "^3.0.0" 260 | 261 | "@pkgjs/parseargs@^0.11.0": 262 | version "0.11.0" 263 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 264 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 265 | 266 | "@scure/base@^1.1.3", "@scure/base@~1.1.0", "@scure/base@~1.1.3": 267 | version "1.1.6" 268 | resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" 269 | integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== 270 | 271 | "@scure/bip32@1.3.1": 272 | version "1.3.1" 273 | resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" 274 | integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== 275 | dependencies: 276 | "@noble/curves" "~1.1.0" 277 | "@noble/hashes" "~1.3.1" 278 | "@scure/base" "~1.1.0" 279 | 280 | "@scure/bip39@1.2.1": 281 | version "1.2.1" 282 | resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" 283 | integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== 284 | dependencies: 285 | "@noble/hashes" "~1.3.0" 286 | "@scure/base" "~1.1.0" 287 | 288 | "@sinonjs/commons@^2.0.0": 289 | version "2.0.0" 290 | resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" 291 | integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== 292 | dependencies: 293 | type-detect "4.0.8" 294 | 295 | "@sinonjs/commons@^3.0.0": 296 | version "3.0.0" 297 | resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" 298 | integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== 299 | dependencies: 300 | type-detect "4.0.8" 301 | 302 | "@sinonjs/fake-timers@^10.0.2", "@sinonjs/fake-timers@^10.3.0": 303 | version "10.3.0" 304 | resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" 305 | integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== 306 | dependencies: 307 | "@sinonjs/commons" "^3.0.0" 308 | 309 | "@sinonjs/samsam@^8.0.0": 310 | version "8.0.0" 311 | resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" 312 | integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== 313 | dependencies: 314 | "@sinonjs/commons" "^2.0.0" 315 | lodash.get "^4.4.2" 316 | type-detect "^4.0.8" 317 | 318 | "@sinonjs/text-encoding@^0.7.1": 319 | version "0.7.1" 320 | resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" 321 | integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== 322 | 323 | "@tootallnate/once@2": 324 | version "2.0.0" 325 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" 326 | integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== 327 | 328 | "@trufflesuite/bigint-buffer@1.1.10": 329 | version "1.1.10" 330 | resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" 331 | integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== 332 | dependencies: 333 | node-gyp-build "4.4.0" 334 | 335 | "@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0": 336 | version "20.30.0-unofficial.0" 337 | resolved "https://registry.yarnpkg.com/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.30.0-unofficial.0.tgz#2fbc2f8ef7e82fbeea6abaf7e8a9d42a02b479d3" 338 | integrity sha512-r5X0aOQcuT6pLwTRLD+mPnAM/nlKtvIK4Z+My++A8tTOR0qTjNRx8UB8jzRj3D+p9PMAp5LnpCUUGmz7/TppwA== 339 | dependencies: 340 | ws "8.13.0" 341 | optionalDependencies: 342 | bufferutil "4.0.7" 343 | utf-8-validate "6.0.3" 344 | 345 | "@types/bn.js@^5.1.0", "@types/bn.js@^5.1.5": 346 | version "5.1.5" 347 | resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" 348 | integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== 349 | dependencies: 350 | "@types/node" "*" 351 | 352 | "@types/debug@^4.1.7": 353 | version "4.1.7" 354 | resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" 355 | integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== 356 | dependencies: 357 | "@types/ms" "*" 358 | 359 | "@types/lru-cache@5.1.1": 360 | version "5.1.1" 361 | resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" 362 | integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== 363 | 364 | "@types/ms@*": 365 | version "0.7.31" 366 | resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" 367 | integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== 368 | 369 | "@types/node@*": 370 | version "14.14.25" 371 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.25.tgz#15967a7b577ff81383f9b888aa6705d43fbbae93" 372 | integrity sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ== 373 | 374 | "@types/seedrandom@3.0.1": 375 | version "3.0.1" 376 | resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" 377 | integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== 378 | 379 | abbrev@^1.0.0: 380 | version "1.1.1" 381 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 382 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 383 | 384 | abstract-level@1.0.3: 385 | version "1.0.3" 386 | resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" 387 | integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== 388 | dependencies: 389 | buffer "^6.0.3" 390 | catering "^2.1.0" 391 | is-buffer "^2.0.5" 392 | level-supports "^4.0.0" 393 | level-transcoder "^1.0.1" 394 | module-error "^1.0.1" 395 | queue-microtask "^1.2.3" 396 | 397 | abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: 398 | version "7.2.0" 399 | resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" 400 | integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== 401 | dependencies: 402 | buffer "^6.0.3" 403 | catering "^2.0.0" 404 | is-buffer "^2.0.5" 405 | level-concat-iterator "^3.0.0" 406 | level-supports "^2.0.1" 407 | queue-microtask "^1.2.3" 408 | 409 | agent-base@6, agent-base@^6.0.2: 410 | version "6.0.2" 411 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 412 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 413 | dependencies: 414 | debug "4" 415 | 416 | agentkeepalive@^4.2.1: 417 | version "4.5.0" 418 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" 419 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== 420 | dependencies: 421 | humanize-ms "^1.2.1" 422 | 423 | aggregate-error@^3.0.0: 424 | version "3.1.0" 425 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 426 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 427 | dependencies: 428 | clean-stack "^2.0.0" 429 | indent-string "^4.0.0" 430 | 431 | ansi-regex@^5.0.1: 432 | version "5.0.1" 433 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 434 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 435 | 436 | ansi-regex@^6.0.1: 437 | version "6.0.1" 438 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 439 | integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== 440 | 441 | ansi-styles@^4.0.0: 442 | version "4.3.0" 443 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 444 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 445 | dependencies: 446 | color-convert "^2.0.1" 447 | 448 | ansi-styles@^6.1.0: 449 | version "6.2.1" 450 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 451 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 452 | 453 | "aproba@^1.0.3 || ^2.0.0": 454 | version "2.0.0" 455 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" 456 | integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== 457 | 458 | are-we-there-yet@^3.0.0: 459 | version "3.0.1" 460 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" 461 | integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== 462 | dependencies: 463 | delegates "^1.0.0" 464 | readable-stream "^3.6.0" 465 | 466 | array-buffer-byte-length@^1.0.0: 467 | version "1.0.0" 468 | resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" 469 | integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== 470 | dependencies: 471 | call-bind "^1.0.2" 472 | is-array-buffer "^3.0.1" 473 | 474 | array.prototype.every@^1.1.5: 475 | version "1.1.5" 476 | resolved "https://registry.yarnpkg.com/array.prototype.every/-/array.prototype.every-1.1.5.tgz#f8ca86a1a82a91eb5173187ef68935dc47215922" 477 | integrity sha512-FfMQJ+/joFGXpRCltbzV3znaP5QxIhLFySo0fEPn3GuoYlud9LhknMCIxdYKC2qsM/6VHoSp6YGwe3EZXrEcwQ== 478 | dependencies: 479 | call-bind "^1.0.2" 480 | define-properties "^1.2.0" 481 | es-abstract "^1.22.1" 482 | is-string "^1.0.7" 483 | 484 | arraybuffer.prototype.slice@^1.0.2: 485 | version "1.0.2" 486 | resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" 487 | integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== 488 | dependencies: 489 | array-buffer-byte-length "^1.0.0" 490 | call-bind "^1.0.2" 491 | define-properties "^1.2.0" 492 | es-abstract "^1.22.1" 493 | get-intrinsic "^1.2.1" 494 | is-array-buffer "^3.0.2" 495 | is-shared-array-buffer "^1.0.2" 496 | 497 | async-eventemitter@0.2.4: 498 | version "0.2.4" 499 | resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" 500 | integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== 501 | dependencies: 502 | async "^2.4.0" 503 | 504 | async-mutex@^0.5.0: 505 | version "0.5.0" 506 | resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" 507 | integrity sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA== 508 | dependencies: 509 | tslib "^2.4.0" 510 | 511 | async@^2.4.0: 512 | version "2.6.4" 513 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" 514 | integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== 515 | dependencies: 516 | lodash "^4.17.14" 517 | 518 | available-typed-arrays@^1.0.5: 519 | version "1.0.5" 520 | resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" 521 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== 522 | 523 | balanced-match@^1.0.0: 524 | version "1.0.2" 525 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 526 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 527 | 528 | base64-js@^1.3.1: 529 | version "1.5.1" 530 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 531 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 532 | 533 | bin-links@4.0.1: 534 | version "4.0.1" 535 | resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" 536 | integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== 537 | dependencies: 538 | cmd-shim "^6.0.0" 539 | npm-normalize-package-bin "^3.0.0" 540 | read-cmd-shim "^4.0.0" 541 | write-file-atomic "^5.0.0" 542 | 543 | bn.js@^4.11.9: 544 | version "4.12.0" 545 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 546 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 547 | 548 | bn.js@^5.2.1: 549 | version "5.2.1" 550 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" 551 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== 552 | 553 | brace-expansion@^1.1.7: 554 | version "1.1.11" 555 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 556 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 557 | dependencies: 558 | balanced-match "^1.0.0" 559 | concat-map "0.0.1" 560 | 561 | brace-expansion@^2.0.1: 562 | version "2.0.1" 563 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 564 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 565 | dependencies: 566 | balanced-match "^1.0.0" 567 | 568 | brorand@^1.1.0: 569 | version "1.1.0" 570 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 571 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 572 | 573 | buffer@^6.0.3: 574 | version "6.0.3" 575 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 576 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 577 | dependencies: 578 | base64-js "^1.3.1" 579 | ieee754 "^1.2.1" 580 | 581 | bufferutil@4.0.5: 582 | version "4.0.5" 583 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" 584 | integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== 585 | dependencies: 586 | node-gyp-build "^4.3.0" 587 | 588 | bufferutil@4.0.7: 589 | version "4.0.7" 590 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" 591 | integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== 592 | dependencies: 593 | node-gyp-build "^4.3.0" 594 | 595 | cacache@^17.0.0: 596 | version "17.1.4" 597 | resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" 598 | integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== 599 | dependencies: 600 | "@npmcli/fs" "^3.1.0" 601 | fs-minipass "^3.0.0" 602 | glob "^10.2.2" 603 | lru-cache "^7.7.1" 604 | minipass "^7.0.3" 605 | minipass-collect "^1.0.2" 606 | minipass-flush "^1.0.5" 607 | minipass-pipeline "^1.2.4" 608 | p-map "^4.0.0" 609 | ssri "^10.0.0" 610 | tar "^6.1.11" 611 | unique-filename "^3.0.0" 612 | 613 | call-bind@^1.0.0, call-bind@^1.0.2: 614 | version "1.0.2" 615 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 616 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 617 | dependencies: 618 | function-bind "^1.1.1" 619 | get-intrinsic "^1.0.2" 620 | 621 | catering@^2.0.0, catering@^2.1.0: 622 | version "2.1.1" 623 | resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" 624 | integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== 625 | 626 | chownr@^2.0.0: 627 | version "2.0.0" 628 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" 629 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 630 | 631 | clean-stack@^2.0.0: 632 | version "2.2.0" 633 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 634 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 635 | 636 | cliui@^7.0.2: 637 | version "7.0.4" 638 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 639 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 640 | dependencies: 641 | string-width "^4.2.0" 642 | strip-ansi "^6.0.0" 643 | wrap-ansi "^7.0.0" 644 | 645 | cmd-shim@^6.0.0: 646 | version "6.0.1" 647 | resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" 648 | integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== 649 | 650 | color-convert@^2.0.1: 651 | version "2.0.1" 652 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 653 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 654 | dependencies: 655 | color-name "~1.1.4" 656 | 657 | color-name@~1.1.4: 658 | version "1.1.4" 659 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 660 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 661 | 662 | color-support@^1.1.3: 663 | version "1.1.3" 664 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" 665 | integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== 666 | 667 | concat-map@0.0.1: 668 | version "0.0.1" 669 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 670 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 671 | 672 | console-control-strings@^1.1.0: 673 | version "1.1.0" 674 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 675 | integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== 676 | 677 | crc-32@^1.2.0: 678 | version "1.2.2" 679 | resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" 680 | integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== 681 | 682 | cross-spawn@^7.0.0, cross-spawn@^7.0.3: 683 | version "7.0.3" 684 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 685 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 686 | dependencies: 687 | path-key "^3.1.0" 688 | shebang-command "^2.0.0" 689 | which "^2.0.1" 690 | 691 | debug@4, debug@^4.3.3, debug@^4.3.4: 692 | version "4.3.4" 693 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 694 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 695 | dependencies: 696 | ms "2.1.2" 697 | 698 | deep-equal@^2.2.2: 699 | version "2.2.2" 700 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" 701 | integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== 702 | dependencies: 703 | array-buffer-byte-length "^1.0.0" 704 | call-bind "^1.0.2" 705 | es-get-iterator "^1.1.3" 706 | get-intrinsic "^1.2.1" 707 | is-arguments "^1.1.1" 708 | is-array-buffer "^3.0.2" 709 | is-date-object "^1.0.5" 710 | is-regex "^1.1.4" 711 | is-shared-array-buffer "^1.0.2" 712 | isarray "^2.0.5" 713 | object-is "^1.1.5" 714 | object-keys "^1.1.1" 715 | object.assign "^4.1.4" 716 | regexp.prototype.flags "^1.5.0" 717 | side-channel "^1.0.4" 718 | which-boxed-primitive "^1.0.2" 719 | which-collection "^1.0.1" 720 | which-typed-array "^1.1.9" 721 | 722 | define-data-property@^1.0.1: 723 | version "1.1.0" 724 | resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" 725 | integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== 726 | dependencies: 727 | get-intrinsic "^1.2.1" 728 | gopd "^1.0.1" 729 | has-property-descriptors "^1.0.0" 730 | 731 | define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: 732 | version "1.2.1" 733 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" 734 | integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== 735 | dependencies: 736 | define-data-property "^1.0.1" 737 | has-property-descriptors "^1.0.0" 738 | object-keys "^1.1.1" 739 | 740 | defined@^1.0.1: 741 | version "1.0.1" 742 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" 743 | integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== 744 | 745 | delegates@^1.0.0: 746 | version "1.0.0" 747 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 748 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 749 | 750 | diff@^5.0.0, diff@^5.1.0: 751 | version "5.1.0" 752 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" 753 | integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== 754 | 755 | dotignore@^0.1.2: 756 | version "0.1.2" 757 | resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" 758 | integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== 759 | dependencies: 760 | minimatch "^3.0.4" 761 | 762 | eastasianwidth@^0.2.0: 763 | version "0.2.0" 764 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 765 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 766 | 767 | elliptic@^6.5.4: 768 | version "6.5.4" 769 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 770 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 771 | dependencies: 772 | bn.js "^4.11.9" 773 | brorand "^1.1.0" 774 | hash.js "^1.0.0" 775 | hmac-drbg "^1.0.1" 776 | inherits "^2.0.4" 777 | minimalistic-assert "^1.0.1" 778 | minimalistic-crypto-utils "^1.0.1" 779 | 780 | emittery@0.10.0: 781 | version "0.10.0" 782 | resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" 783 | integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== 784 | 785 | emoji-regex@^8.0.0: 786 | version "8.0.0" 787 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 788 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 789 | 790 | emoji-regex@^9.2.2: 791 | version "9.2.2" 792 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 793 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 794 | 795 | encoding@^0.1.13: 796 | version "0.1.13" 797 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" 798 | integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== 799 | dependencies: 800 | iconv-lite "^0.6.2" 801 | 802 | env-paths@^2.2.0: 803 | version "2.2.1" 804 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" 805 | integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== 806 | 807 | err-code@^2.0.2: 808 | version "2.0.3" 809 | resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" 810 | integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== 811 | 812 | es-abstract@^1.22.1: 813 | version "1.22.2" 814 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" 815 | integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== 816 | dependencies: 817 | array-buffer-byte-length "^1.0.0" 818 | arraybuffer.prototype.slice "^1.0.2" 819 | available-typed-arrays "^1.0.5" 820 | call-bind "^1.0.2" 821 | es-set-tostringtag "^2.0.1" 822 | es-to-primitive "^1.2.1" 823 | function.prototype.name "^1.1.6" 824 | get-intrinsic "^1.2.1" 825 | get-symbol-description "^1.0.0" 826 | globalthis "^1.0.3" 827 | gopd "^1.0.1" 828 | has "^1.0.3" 829 | has-property-descriptors "^1.0.0" 830 | has-proto "^1.0.1" 831 | has-symbols "^1.0.3" 832 | internal-slot "^1.0.5" 833 | is-array-buffer "^3.0.2" 834 | is-callable "^1.2.7" 835 | is-negative-zero "^2.0.2" 836 | is-regex "^1.1.4" 837 | is-shared-array-buffer "^1.0.2" 838 | is-string "^1.0.7" 839 | is-typed-array "^1.1.12" 840 | is-weakref "^1.0.2" 841 | object-inspect "^1.12.3" 842 | object-keys "^1.1.1" 843 | object.assign "^4.1.4" 844 | regexp.prototype.flags "^1.5.1" 845 | safe-array-concat "^1.0.1" 846 | safe-regex-test "^1.0.0" 847 | string.prototype.trim "^1.2.8" 848 | string.prototype.trimend "^1.0.7" 849 | string.prototype.trimstart "^1.0.7" 850 | typed-array-buffer "^1.0.0" 851 | typed-array-byte-length "^1.0.0" 852 | typed-array-byte-offset "^1.0.0" 853 | typed-array-length "^1.0.4" 854 | unbox-primitive "^1.0.2" 855 | which-typed-array "^1.1.11" 856 | 857 | es-get-iterator@^1.1.3: 858 | version "1.1.3" 859 | resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" 860 | integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== 861 | dependencies: 862 | call-bind "^1.0.2" 863 | get-intrinsic "^1.1.3" 864 | has-symbols "^1.0.3" 865 | is-arguments "^1.1.1" 866 | is-map "^2.0.2" 867 | is-set "^2.0.2" 868 | is-string "^1.0.7" 869 | isarray "^2.0.5" 870 | stop-iteration-iterator "^1.0.0" 871 | 872 | es-set-tostringtag@^2.0.1: 873 | version "2.0.1" 874 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" 875 | integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== 876 | dependencies: 877 | get-intrinsic "^1.1.3" 878 | has "^1.0.3" 879 | has-tostringtag "^1.0.0" 880 | 881 | es-to-primitive@^1.2.1: 882 | version "1.2.1" 883 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 884 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 885 | dependencies: 886 | is-callable "^1.1.4" 887 | is-date-object "^1.0.1" 888 | is-symbol "^1.0.2" 889 | 890 | escalade@^3.1.1: 891 | version "3.1.1" 892 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 893 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 894 | 895 | ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: 896 | version "2.1.2" 897 | resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" 898 | integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== 899 | dependencies: 900 | "@noble/curves" "1.1.0" 901 | "@noble/hashes" "1.3.1" 902 | "@scure/bip32" "1.3.1" 903 | "@scure/bip39" "1.2.1" 904 | 905 | execa@^5.1.1: 906 | version "5.1.1" 907 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 908 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 909 | dependencies: 910 | cross-spawn "^7.0.3" 911 | get-stream "^6.0.0" 912 | human-signals "^2.1.0" 913 | is-stream "^2.0.0" 914 | merge-stream "^2.0.0" 915 | npm-run-path "^4.0.1" 916 | onetime "^5.1.2" 917 | signal-exit "^3.0.3" 918 | strip-final-newline "^2.0.0" 919 | 920 | exponential-backoff@^3.1.1: 921 | version "3.1.1" 922 | resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" 923 | integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== 924 | 925 | fast-safe-stringify@^2.0.6: 926 | version "2.0.7" 927 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" 928 | integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== 929 | 930 | for-each@^0.3.3: 931 | version "0.3.3" 932 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 933 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 934 | dependencies: 935 | is-callable "^1.1.3" 936 | 937 | foreground-child@^3.1.0: 938 | version "3.1.1" 939 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" 940 | integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== 941 | dependencies: 942 | cross-spawn "^7.0.0" 943 | signal-exit "^4.0.1" 944 | 945 | fs-minipass@^2.0.0: 946 | version "2.1.0" 947 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" 948 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 949 | dependencies: 950 | minipass "^3.0.0" 951 | 952 | fs-minipass@^3.0.0: 953 | version "3.0.3" 954 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" 955 | integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== 956 | dependencies: 957 | minipass "^7.0.3" 958 | 959 | fs.realpath@^1.0.0: 960 | version "1.0.0" 961 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 962 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 963 | 964 | function-bind@^1.1.1: 965 | version "1.1.1" 966 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 967 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 968 | 969 | function.prototype.name@^1.1.6: 970 | version "1.1.6" 971 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" 972 | integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== 973 | dependencies: 974 | call-bind "^1.0.2" 975 | define-properties "^1.2.0" 976 | es-abstract "^1.22.1" 977 | functions-have-names "^1.2.3" 978 | 979 | functions-have-names@^1.2.2, functions-have-names@^1.2.3: 980 | version "1.2.3" 981 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 982 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 983 | 984 | ganache@^7.9.2: 985 | version "7.9.2" 986 | resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.9.2.tgz#77f506ad2735dd9109696ffa1834a9dd2f806449" 987 | integrity sha512-7gsVVDpO9AhrFyDMWWl7SpMsPpqGcnAzjxz3k32LheIPNd64p2XsY9GYRdhWmKuryb60W1iaWPZWDkFKlbRWHA== 988 | dependencies: 989 | "@trufflesuite/bigint-buffer" "1.1.10" 990 | "@trufflesuite/uws-js-unofficial" "20.30.0-unofficial.0" 991 | "@types/bn.js" "^5.1.0" 992 | "@types/lru-cache" "5.1.1" 993 | "@types/seedrandom" "3.0.1" 994 | abstract-level "1.0.3" 995 | abstract-leveldown "7.2.0" 996 | async-eventemitter "0.2.4" 997 | emittery "0.10.0" 998 | keccak "3.0.2" 999 | leveldown "6.1.0" 1000 | secp256k1 "4.0.3" 1001 | optionalDependencies: 1002 | bufferutil "4.0.5" 1003 | utf-8-validate "5.0.7" 1004 | 1005 | gauge@^4.0.3: 1006 | version "4.0.4" 1007 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" 1008 | integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== 1009 | dependencies: 1010 | aproba "^1.0.3 || ^2.0.0" 1011 | color-support "^1.1.3" 1012 | console-control-strings "^1.1.0" 1013 | has-unicode "^2.0.1" 1014 | signal-exit "^3.0.7" 1015 | string-width "^4.2.3" 1016 | strip-ansi "^6.0.1" 1017 | wide-align "^1.1.5" 1018 | 1019 | get-caller-file@^2.0.5: 1020 | version "2.0.5" 1021 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1022 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1023 | 1024 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: 1025 | version "1.2.1" 1026 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" 1027 | integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== 1028 | dependencies: 1029 | function-bind "^1.1.1" 1030 | has "^1.0.3" 1031 | has-proto "^1.0.1" 1032 | has-symbols "^1.0.3" 1033 | 1034 | get-package-type@^0.1.0: 1035 | version "0.1.0" 1036 | resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" 1037 | integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== 1038 | 1039 | get-stream@^6.0.0: 1040 | version "6.0.1" 1041 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 1042 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 1043 | 1044 | get-symbol-description@^1.0.0: 1045 | version "1.0.0" 1046 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 1047 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 1048 | dependencies: 1049 | call-bind "^1.0.2" 1050 | get-intrinsic "^1.1.1" 1051 | 1052 | glob@^10.2.2: 1053 | version "10.3.4" 1054 | resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" 1055 | integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== 1056 | dependencies: 1057 | foreground-child "^3.1.0" 1058 | jackspeak "^2.0.3" 1059 | minimatch "^9.0.1" 1060 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 1061 | path-scurry "^1.10.1" 1062 | 1063 | glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: 1064 | version "7.2.3" 1065 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1066 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1067 | dependencies: 1068 | fs.realpath "^1.0.0" 1069 | inflight "^1.0.4" 1070 | inherits "2" 1071 | minimatch "^3.1.1" 1072 | once "^1.3.0" 1073 | path-is-absolute "^1.0.0" 1074 | 1075 | globalthis@^1.0.3: 1076 | version "1.0.3" 1077 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" 1078 | integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== 1079 | dependencies: 1080 | define-properties "^1.1.3" 1081 | 1082 | gopd@^1.0.1: 1083 | version "1.0.1" 1084 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 1085 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 1086 | dependencies: 1087 | get-intrinsic "^1.1.3" 1088 | 1089 | graceful-fs@^4.2.6: 1090 | version "4.2.11" 1091 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1092 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1093 | 1094 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1095 | version "1.0.2" 1096 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1097 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1098 | 1099 | has-dynamic-import@^2.0.1: 1100 | version "2.0.1" 1101 | resolved "https://registry.yarnpkg.com/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz#9bca87846aa264f2ad224fcd014946f5e5182f52" 1102 | integrity sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ== 1103 | dependencies: 1104 | call-bind "^1.0.2" 1105 | get-intrinsic "^1.1.1" 1106 | 1107 | has-flag@^4.0.0: 1108 | version "4.0.0" 1109 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1110 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1111 | 1112 | has-property-descriptors@^1.0.0: 1113 | version "1.0.0" 1114 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1115 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1116 | dependencies: 1117 | get-intrinsic "^1.1.1" 1118 | 1119 | has-proto@^1.0.1: 1120 | version "1.0.1" 1121 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" 1122 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 1123 | 1124 | has-symbols@^1.0.2, has-symbols@^1.0.3: 1125 | version "1.0.3" 1126 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1127 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1128 | 1129 | has-tostringtag@^1.0.0: 1130 | version "1.0.0" 1131 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1132 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1133 | dependencies: 1134 | has-symbols "^1.0.2" 1135 | 1136 | has-unicode@^2.0.1: 1137 | version "2.0.1" 1138 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1139 | integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== 1140 | 1141 | has@^1.0.3: 1142 | version "1.0.3" 1143 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1144 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1145 | dependencies: 1146 | function-bind "^1.1.1" 1147 | 1148 | hash.js@^1.0.0, hash.js@^1.0.3: 1149 | version "1.1.7" 1150 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 1151 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 1152 | dependencies: 1153 | inherits "^2.0.3" 1154 | minimalistic-assert "^1.0.1" 1155 | 1156 | hmac-drbg@^1.0.1: 1157 | version "1.0.1" 1158 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1159 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 1160 | dependencies: 1161 | hash.js "^1.0.3" 1162 | minimalistic-assert "^1.0.0" 1163 | minimalistic-crypto-utils "^1.0.1" 1164 | 1165 | http-cache-semantics@^4.1.1: 1166 | version "4.1.1" 1167 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" 1168 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 1169 | 1170 | http-proxy-agent@^5.0.0: 1171 | version "5.0.0" 1172 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" 1173 | integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== 1174 | dependencies: 1175 | "@tootallnate/once" "2" 1176 | agent-base "6" 1177 | debug "4" 1178 | 1179 | https-proxy-agent@^5.0.0: 1180 | version "5.0.1" 1181 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" 1182 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 1183 | dependencies: 1184 | agent-base "6" 1185 | debug "4" 1186 | 1187 | human-signals@^2.1.0: 1188 | version "2.1.0" 1189 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 1190 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 1191 | 1192 | humanize-ms@^1.2.1: 1193 | version "1.2.1" 1194 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 1195 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 1196 | dependencies: 1197 | ms "^2.0.0" 1198 | 1199 | iconv-lite@^0.6.2: 1200 | version "0.6.2" 1201 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" 1202 | integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== 1203 | dependencies: 1204 | safer-buffer ">= 2.1.2 < 3.0.0" 1205 | 1206 | ieee754@^1.2.1: 1207 | version "1.2.1" 1208 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1209 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1210 | 1211 | imurmurhash@^0.1.4: 1212 | version "0.1.4" 1213 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1214 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1215 | 1216 | indent-string@^4.0.0: 1217 | version "4.0.0" 1218 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1219 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 1220 | 1221 | inflight@^1.0.4: 1222 | version "1.0.6" 1223 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1224 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1225 | dependencies: 1226 | once "^1.3.0" 1227 | wrappy "1" 1228 | 1229 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 1230 | version "2.0.4" 1231 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1232 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1233 | 1234 | internal-slot@^1.0.4, internal-slot@^1.0.5: 1235 | version "1.0.5" 1236 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" 1237 | integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== 1238 | dependencies: 1239 | get-intrinsic "^1.2.0" 1240 | has "^1.0.3" 1241 | side-channel "^1.0.4" 1242 | 1243 | ip@^2.0.0: 1244 | version "2.0.0" 1245 | resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" 1246 | integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== 1247 | 1248 | is-arguments@^1.1.1: 1249 | version "1.1.1" 1250 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" 1251 | integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== 1252 | dependencies: 1253 | call-bind "^1.0.2" 1254 | has-tostringtag "^1.0.0" 1255 | 1256 | is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: 1257 | version "3.0.2" 1258 | resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" 1259 | integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== 1260 | dependencies: 1261 | call-bind "^1.0.2" 1262 | get-intrinsic "^1.2.0" 1263 | is-typed-array "^1.1.10" 1264 | 1265 | is-bigint@^1.0.1: 1266 | version "1.0.4" 1267 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1268 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1269 | dependencies: 1270 | has-bigints "^1.0.1" 1271 | 1272 | is-boolean-object@^1.1.0: 1273 | version "1.1.2" 1274 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1275 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1276 | dependencies: 1277 | call-bind "^1.0.2" 1278 | has-tostringtag "^1.0.0" 1279 | 1280 | is-buffer@^2.0.5: 1281 | version "2.0.5" 1282 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" 1283 | integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== 1284 | 1285 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: 1286 | version "1.2.7" 1287 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 1288 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 1289 | 1290 | is-core-module@^2.13.0, is-core-module@^2.9.0: 1291 | version "2.13.0" 1292 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" 1293 | integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== 1294 | dependencies: 1295 | has "^1.0.3" 1296 | 1297 | is-date-object@^1.0.1, is-date-object@^1.0.5: 1298 | version "1.0.5" 1299 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1300 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1301 | dependencies: 1302 | has-tostringtag "^1.0.0" 1303 | 1304 | is-fullwidth-code-point@^3.0.0: 1305 | version "3.0.0" 1306 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1307 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1308 | 1309 | is-lambda@^1.0.1: 1310 | version "1.0.1" 1311 | resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" 1312 | integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== 1313 | 1314 | is-map@^2.0.1, is-map@^2.0.2: 1315 | version "2.0.2" 1316 | resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" 1317 | integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== 1318 | 1319 | is-negative-zero@^2.0.2: 1320 | version "2.0.2" 1321 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1322 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1323 | 1324 | is-number-object@^1.0.4: 1325 | version "1.0.7" 1326 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 1327 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1328 | dependencies: 1329 | has-tostringtag "^1.0.0" 1330 | 1331 | is-regex@^1.1.4: 1332 | version "1.1.4" 1333 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1334 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1335 | dependencies: 1336 | call-bind "^1.0.2" 1337 | has-tostringtag "^1.0.0" 1338 | 1339 | is-set@^2.0.1, is-set@^2.0.2: 1340 | version "2.0.2" 1341 | resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" 1342 | integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== 1343 | 1344 | is-shared-array-buffer@^1.0.2: 1345 | version "1.0.2" 1346 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1347 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1348 | dependencies: 1349 | call-bind "^1.0.2" 1350 | 1351 | is-stream@^2.0.0: 1352 | version "2.0.1" 1353 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1354 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1355 | 1356 | is-string@^1.0.5, is-string@^1.0.7: 1357 | version "1.0.7" 1358 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1359 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1360 | dependencies: 1361 | has-tostringtag "^1.0.0" 1362 | 1363 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1364 | version "1.0.4" 1365 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1366 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1367 | dependencies: 1368 | has-symbols "^1.0.2" 1369 | 1370 | is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: 1371 | version "1.1.12" 1372 | resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" 1373 | integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== 1374 | dependencies: 1375 | which-typed-array "^1.1.11" 1376 | 1377 | is-weakmap@^2.0.1: 1378 | version "2.0.1" 1379 | resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" 1380 | integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== 1381 | 1382 | is-weakref@^1.0.2: 1383 | version "1.0.2" 1384 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1385 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1386 | dependencies: 1387 | call-bind "^1.0.2" 1388 | 1389 | is-weakset@^2.0.1: 1390 | version "2.0.2" 1391 | resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" 1392 | integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== 1393 | dependencies: 1394 | call-bind "^1.0.2" 1395 | get-intrinsic "^1.1.1" 1396 | 1397 | isarray@0.0.1: 1398 | version "0.0.1" 1399 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1400 | integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== 1401 | 1402 | isarray@^2.0.5: 1403 | version "2.0.5" 1404 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 1405 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 1406 | 1407 | isexe@^2.0.0: 1408 | version "2.0.0" 1409 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1410 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1411 | 1412 | jackspeak@^2.0.3: 1413 | version "2.3.1" 1414 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.1.tgz#ce2effa4c458e053640e61938865a5b5fae98456" 1415 | integrity sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A== 1416 | dependencies: 1417 | "@isaacs/cliui" "^8.0.2" 1418 | optionalDependencies: 1419 | "@pkgjs/parseargs" "^0.11.0" 1420 | 1421 | json-parse-even-better-errors@^3.0.0: 1422 | version "3.0.0" 1423 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" 1424 | integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== 1425 | 1426 | json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: 1427 | version "1.0.1" 1428 | resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" 1429 | integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= 1430 | 1431 | just-extend@^4.0.2: 1432 | version "4.2.1" 1433 | resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" 1434 | integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== 1435 | 1436 | keccak@3.0.2: 1437 | version "3.0.2" 1438 | resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" 1439 | integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== 1440 | dependencies: 1441 | node-addon-api "^2.0.0" 1442 | node-gyp-build "^4.2.0" 1443 | readable-stream "^3.6.0" 1444 | 1445 | klona@^2.0.6: 1446 | version "2.0.6" 1447 | resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" 1448 | integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== 1449 | 1450 | level-concat-iterator@^3.0.0: 1451 | version "3.1.0" 1452 | resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" 1453 | integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== 1454 | dependencies: 1455 | catering "^2.1.0" 1456 | 1457 | level-supports@^2.0.1: 1458 | version "2.1.0" 1459 | resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" 1460 | integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== 1461 | 1462 | level-supports@^4.0.0: 1463 | version "4.0.1" 1464 | resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" 1465 | integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== 1466 | 1467 | level-transcoder@^1.0.1: 1468 | version "1.0.1" 1469 | resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" 1470 | integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== 1471 | dependencies: 1472 | buffer "^6.0.3" 1473 | module-error "^1.0.1" 1474 | 1475 | leveldown@6.1.0: 1476 | version "6.1.0" 1477 | resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" 1478 | integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== 1479 | dependencies: 1480 | abstract-leveldown "^7.2.0" 1481 | napi-macros "~2.0.0" 1482 | node-gyp-build "^4.3.0" 1483 | 1484 | lodash.get@^4.4.2: 1485 | version "4.4.2" 1486 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1487 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 1488 | 1489 | lodash@^4.17.14: 1490 | version "4.17.21" 1491 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1492 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1493 | 1494 | lru-cache@^6.0.0: 1495 | version "6.0.0" 1496 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1497 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1498 | dependencies: 1499 | yallist "^4.0.0" 1500 | 1501 | lru-cache@^7.7.1: 1502 | version "7.18.3" 1503 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" 1504 | integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== 1505 | 1506 | "lru-cache@^9.1.1 || ^10.0.0": 1507 | version "10.0.1" 1508 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" 1509 | integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== 1510 | 1511 | make-fetch-happen@^11.0.3: 1512 | version "11.1.1" 1513 | resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" 1514 | integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== 1515 | dependencies: 1516 | agentkeepalive "^4.2.1" 1517 | cacache "^17.0.0" 1518 | http-cache-semantics "^4.1.1" 1519 | http-proxy-agent "^5.0.0" 1520 | https-proxy-agent "^5.0.0" 1521 | is-lambda "^1.0.1" 1522 | lru-cache "^7.7.1" 1523 | minipass "^5.0.0" 1524 | minipass-fetch "^3.0.0" 1525 | minipass-flush "^1.0.5" 1526 | minipass-pipeline "^1.2.4" 1527 | negotiator "^0.6.3" 1528 | promise-retry "^2.0.1" 1529 | socks-proxy-agent "^7.0.0" 1530 | ssri "^10.0.0" 1531 | 1532 | merge-stream@^2.0.0: 1533 | version "2.0.0" 1534 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1535 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1536 | 1537 | micro-ftch@^0.3.1: 1538 | version "0.3.1" 1539 | resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" 1540 | integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== 1541 | 1542 | mimic-fn@^2.1.0: 1543 | version "2.1.0" 1544 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1545 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1546 | 1547 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1548 | version "1.0.1" 1549 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1550 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1551 | 1552 | minimalistic-crypto-utils@^1.0.1: 1553 | version "1.0.1" 1554 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1555 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 1556 | 1557 | minimatch@^3.0.4, minimatch@^3.1.1: 1558 | version "3.1.2" 1559 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1560 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1561 | dependencies: 1562 | brace-expansion "^1.1.7" 1563 | 1564 | minimatch@^9.0.1: 1565 | version "9.0.3" 1566 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 1567 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 1568 | dependencies: 1569 | brace-expansion "^2.0.1" 1570 | 1571 | minimist@^1.2.8: 1572 | version "1.2.8" 1573 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 1574 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1575 | 1576 | minipass-collect@^1.0.2: 1577 | version "1.0.2" 1578 | resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" 1579 | integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== 1580 | dependencies: 1581 | minipass "^3.0.0" 1582 | 1583 | minipass-fetch@^3.0.0: 1584 | version "3.0.4" 1585 | resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" 1586 | integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== 1587 | dependencies: 1588 | minipass "^7.0.3" 1589 | minipass-sized "^1.0.3" 1590 | minizlib "^2.1.2" 1591 | optionalDependencies: 1592 | encoding "^0.1.13" 1593 | 1594 | minipass-flush@^1.0.5: 1595 | version "1.0.5" 1596 | resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" 1597 | integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== 1598 | dependencies: 1599 | minipass "^3.0.0" 1600 | 1601 | minipass-pipeline@^1.2.4: 1602 | version "1.2.4" 1603 | resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" 1604 | integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== 1605 | dependencies: 1606 | minipass "^3.0.0" 1607 | 1608 | minipass-sized@^1.0.3: 1609 | version "1.0.3" 1610 | resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" 1611 | integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== 1612 | dependencies: 1613 | minipass "^3.0.0" 1614 | 1615 | minipass@^3.0.0: 1616 | version "3.1.6" 1617 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" 1618 | integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== 1619 | dependencies: 1620 | yallist "^4.0.0" 1621 | 1622 | minipass@^5.0.0: 1623 | version "5.0.0" 1624 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" 1625 | integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== 1626 | 1627 | "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: 1628 | version "7.0.3" 1629 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" 1630 | integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== 1631 | 1632 | minizlib@^2.1.1, minizlib@^2.1.2: 1633 | version "2.1.2" 1634 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" 1635 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 1636 | dependencies: 1637 | minipass "^3.0.0" 1638 | yallist "^4.0.0" 1639 | 1640 | mkdirp@^1.0.3: 1641 | version "1.0.4" 1642 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1643 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1644 | 1645 | mock-property@^1.0.0: 1646 | version "1.0.0" 1647 | resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.0.0.tgz#301518a59fb545312a407c8d1a861aba0357b4a6" 1648 | integrity sha512-imC60k5A55GPUU43PqczbubOyyxCudIgneACKzL3PKfsBk08dc1HgNNU8siQbEIAPPjVUhc+gb0v0ypZ/iP9pw== 1649 | dependencies: 1650 | functions-have-names "^1.2.2" 1651 | has "^1.0.3" 1652 | has-property-descriptors "^1.0.0" 1653 | isarray "^2.0.5" 1654 | 1655 | module-error@^1.0.1: 1656 | version "1.0.2" 1657 | resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" 1658 | integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== 1659 | 1660 | ms@2.1.2: 1661 | version "2.1.2" 1662 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1663 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1664 | 1665 | ms@^2.0.0: 1666 | version "2.1.3" 1667 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1668 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1669 | 1670 | napi-macros@~2.0.0: 1671 | version "2.0.0" 1672 | resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" 1673 | integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== 1674 | 1675 | negotiator@^0.6.3: 1676 | version "0.6.3" 1677 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1678 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1679 | 1680 | nise@^5.1.4: 1681 | version "5.1.4" 1682 | resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" 1683 | integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== 1684 | dependencies: 1685 | "@sinonjs/commons" "^2.0.0" 1686 | "@sinonjs/fake-timers" "^10.0.2" 1687 | "@sinonjs/text-encoding" "^0.7.1" 1688 | just-extend "^4.0.2" 1689 | path-to-regexp "^1.7.0" 1690 | 1691 | node-addon-api@^2.0.0: 1692 | version "2.0.2" 1693 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" 1694 | integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== 1695 | 1696 | node-gyp-build@4.4.0: 1697 | version "4.4.0" 1698 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" 1699 | integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== 1700 | 1701 | node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: 1702 | version "4.8.1" 1703 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" 1704 | integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== 1705 | 1706 | node-gyp@^9.0.0: 1707 | version "9.4.0" 1708 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" 1709 | integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== 1710 | dependencies: 1711 | env-paths "^2.2.0" 1712 | exponential-backoff "^3.1.1" 1713 | glob "^7.1.4" 1714 | graceful-fs "^4.2.6" 1715 | make-fetch-happen "^11.0.3" 1716 | nopt "^6.0.0" 1717 | npmlog "^6.0.0" 1718 | rimraf "^3.0.2" 1719 | semver "^7.3.5" 1720 | tar "^6.1.2" 1721 | which "^2.0.2" 1722 | 1723 | nopt@^6.0.0: 1724 | version "6.0.0" 1725 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" 1726 | integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== 1727 | dependencies: 1728 | abbrev "^1.0.0" 1729 | 1730 | npm-normalize-package-bin@^3.0.0: 1731 | version "3.0.1" 1732 | resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" 1733 | integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== 1734 | 1735 | npm-run-path@^4.0.1: 1736 | version "4.0.1" 1737 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1738 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1739 | dependencies: 1740 | path-key "^3.0.0" 1741 | 1742 | npmlog@^6.0.0: 1743 | version "6.0.2" 1744 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" 1745 | integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== 1746 | dependencies: 1747 | are-we-there-yet "^3.0.0" 1748 | console-control-strings "^1.1.0" 1749 | gauge "^4.0.3" 1750 | set-blocking "^2.0.0" 1751 | 1752 | object-inspect@^1.12.3, object-inspect@^1.9.0: 1753 | version "1.12.3" 1754 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 1755 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 1756 | 1757 | object-is@^1.1.5: 1758 | version "1.1.5" 1759 | resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" 1760 | integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== 1761 | dependencies: 1762 | call-bind "^1.0.2" 1763 | define-properties "^1.1.3" 1764 | 1765 | object-keys@^1.1.1: 1766 | version "1.1.1" 1767 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1768 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1769 | 1770 | object.assign@^4.1.4: 1771 | version "4.1.4" 1772 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 1773 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 1774 | dependencies: 1775 | call-bind "^1.0.2" 1776 | define-properties "^1.1.4" 1777 | has-symbols "^1.0.3" 1778 | object-keys "^1.1.1" 1779 | 1780 | once@^1.3.0: 1781 | version "1.4.0" 1782 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1783 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1784 | dependencies: 1785 | wrappy "1" 1786 | 1787 | onetime@^5.1.2: 1788 | version "5.1.2" 1789 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1790 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1791 | dependencies: 1792 | mimic-fn "^2.1.0" 1793 | 1794 | p-map@^4.0.0: 1795 | version "4.0.0" 1796 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" 1797 | integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== 1798 | dependencies: 1799 | aggregate-error "^3.0.0" 1800 | 1801 | path-is-absolute@^1.0.0: 1802 | version "1.0.1" 1803 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1804 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1805 | 1806 | path-key@^3.0.0, path-key@^3.1.0: 1807 | version "3.1.1" 1808 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1809 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1810 | 1811 | path-parse@^1.0.7: 1812 | version "1.0.7" 1813 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1814 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1815 | 1816 | path-scurry@^1.10.1: 1817 | version "1.10.1" 1818 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" 1819 | integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== 1820 | dependencies: 1821 | lru-cache "^9.1.1 || ^10.0.0" 1822 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 1823 | 1824 | path-to-regexp@^1.7.0: 1825 | version "1.8.0" 1826 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" 1827 | integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== 1828 | dependencies: 1829 | isarray "0.0.1" 1830 | 1831 | pify@^5.0.0: 1832 | version "5.0.0" 1833 | resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" 1834 | integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== 1835 | 1836 | pony-cause@^2.1.10: 1837 | version "2.1.10" 1838 | resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" 1839 | integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== 1840 | 1841 | prettier@^2.8.8: 1842 | version "2.8.8" 1843 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" 1844 | integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== 1845 | 1846 | promise-retry@^2.0.1: 1847 | version "2.0.1" 1848 | resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" 1849 | integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== 1850 | dependencies: 1851 | err-code "^2.0.2" 1852 | retry "^0.12.0" 1853 | 1854 | queue-microtask@^1.2.3: 1855 | version "1.2.3" 1856 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1857 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1858 | 1859 | read-cmd-shim@^4.0.0: 1860 | version "4.0.0" 1861 | resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" 1862 | integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== 1863 | 1864 | read-package-json-fast@^3.0.0: 1865 | version "3.0.2" 1866 | resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" 1867 | integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== 1868 | dependencies: 1869 | json-parse-even-better-errors "^3.0.0" 1870 | npm-normalize-package-bin "^3.0.0" 1871 | 1872 | readable-stream@^3.6.0: 1873 | version "3.6.0" 1874 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1875 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1876 | dependencies: 1877 | inherits "^2.0.3" 1878 | string_decoder "^1.1.1" 1879 | util-deprecate "^1.0.1" 1880 | 1881 | regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: 1882 | version "1.5.1" 1883 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" 1884 | integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== 1885 | dependencies: 1886 | call-bind "^1.0.2" 1887 | define-properties "^1.2.0" 1888 | set-function-name "^2.0.0" 1889 | 1890 | require-directory@^2.1.1: 1891 | version "2.1.1" 1892 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1893 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1894 | 1895 | resolve@^1.22.3: 1896 | version "1.22.6" 1897 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" 1898 | integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== 1899 | dependencies: 1900 | is-core-module "^2.13.0" 1901 | path-parse "^1.0.7" 1902 | supports-preserve-symlinks-flag "^1.0.0" 1903 | 1904 | resolve@^2.0.0-next.4: 1905 | version "2.0.0-next.4" 1906 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" 1907 | integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== 1908 | dependencies: 1909 | is-core-module "^2.9.0" 1910 | path-parse "^1.0.7" 1911 | supports-preserve-symlinks-flag "^1.0.0" 1912 | 1913 | retry@^0.12.0: 1914 | version "0.12.0" 1915 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 1916 | integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== 1917 | 1918 | rimraf@^3.0.2: 1919 | version "3.0.2" 1920 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1921 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1922 | dependencies: 1923 | glob "^7.1.3" 1924 | 1925 | safe-array-concat@^1.0.1: 1926 | version "1.0.1" 1927 | resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" 1928 | integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== 1929 | dependencies: 1930 | call-bind "^1.0.2" 1931 | get-intrinsic "^1.2.1" 1932 | has-symbols "^1.0.3" 1933 | isarray "^2.0.5" 1934 | 1935 | safe-buffer@~5.2.0: 1936 | version "5.2.1" 1937 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1938 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1939 | 1940 | safe-regex-test@^1.0.0: 1941 | version "1.0.0" 1942 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" 1943 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== 1944 | dependencies: 1945 | call-bind "^1.0.2" 1946 | get-intrinsic "^1.1.3" 1947 | is-regex "^1.1.4" 1948 | 1949 | safe-stable-stringify@^2.4.3: 1950 | version "2.4.3" 1951 | resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" 1952 | integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== 1953 | 1954 | "safer-buffer@>= 2.1.2 < 3.0.0": 1955 | version "2.1.2" 1956 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1957 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1958 | 1959 | secp256k1@4.0.3: 1960 | version "4.0.3" 1961 | resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" 1962 | integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== 1963 | dependencies: 1964 | elliptic "^6.5.4" 1965 | node-addon-api "^2.0.0" 1966 | node-gyp-build "^4.2.0" 1967 | 1968 | semver@^7.3.5, semver@^7.5.4: 1969 | version "7.5.4" 1970 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 1971 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 1972 | dependencies: 1973 | lru-cache "^6.0.0" 1974 | 1975 | set-blocking@^2.0.0: 1976 | version "2.0.0" 1977 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1978 | integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== 1979 | 1980 | set-function-name@^2.0.0: 1981 | version "2.0.1" 1982 | resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" 1983 | integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== 1984 | dependencies: 1985 | define-data-property "^1.0.1" 1986 | functions-have-names "^1.2.3" 1987 | has-property-descriptors "^1.0.0" 1988 | 1989 | shebang-command@^2.0.0: 1990 | version "2.0.0" 1991 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1992 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1993 | dependencies: 1994 | shebang-regex "^3.0.0" 1995 | 1996 | shebang-regex@^3.0.0: 1997 | version "3.0.0" 1998 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1999 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2000 | 2001 | side-channel@^1.0.4: 2002 | version "1.0.4" 2003 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 2004 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 2005 | dependencies: 2006 | call-bind "^1.0.0" 2007 | get-intrinsic "^1.0.2" 2008 | object-inspect "^1.9.0" 2009 | 2010 | signal-exit@^3.0.3, signal-exit@^3.0.7: 2011 | version "3.0.7" 2012 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 2013 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2014 | 2015 | signal-exit@^4.0.1: 2016 | version "4.1.0" 2017 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 2018 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 2019 | 2020 | sinon@^15.2.0: 2021 | version "15.2.0" 2022 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-15.2.0.tgz#5e44d4bc5a9b5d993871137fd3560bebfac27565" 2023 | integrity sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw== 2024 | dependencies: 2025 | "@sinonjs/commons" "^3.0.0" 2026 | "@sinonjs/fake-timers" "^10.3.0" 2027 | "@sinonjs/samsam" "^8.0.0" 2028 | diff "^5.1.0" 2029 | nise "^5.1.4" 2030 | supports-color "^7.2.0" 2031 | 2032 | smart-buffer@^4.2.0: 2033 | version "4.2.0" 2034 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 2035 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 2036 | 2037 | socks-proxy-agent@^7.0.0: 2038 | version "7.0.0" 2039 | resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" 2040 | integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== 2041 | dependencies: 2042 | agent-base "^6.0.2" 2043 | debug "^4.3.3" 2044 | socks "^2.6.2" 2045 | 2046 | socks@^2.6.2: 2047 | version "2.7.1" 2048 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" 2049 | integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== 2050 | dependencies: 2051 | ip "^2.0.0" 2052 | smart-buffer "^4.2.0" 2053 | 2054 | ssri@^10.0.0: 2055 | version "10.0.5" 2056 | resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" 2057 | integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== 2058 | dependencies: 2059 | minipass "^7.0.3" 2060 | 2061 | stop-iteration-iterator@^1.0.0: 2062 | version "1.0.0" 2063 | resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" 2064 | integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== 2065 | dependencies: 2066 | internal-slot "^1.0.4" 2067 | 2068 | "string-width-cjs@npm:string-width@^4.2.0": 2069 | version "4.2.3" 2070 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2071 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2072 | dependencies: 2073 | emoji-regex "^8.0.0" 2074 | is-fullwidth-code-point "^3.0.0" 2075 | strip-ansi "^6.0.1" 2076 | 2077 | "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 2078 | version "4.2.3" 2079 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2080 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2081 | dependencies: 2082 | emoji-regex "^8.0.0" 2083 | is-fullwidth-code-point "^3.0.0" 2084 | strip-ansi "^6.0.1" 2085 | 2086 | string-width@^5.0.1, string-width@^5.1.2: 2087 | version "5.1.2" 2088 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 2089 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 2090 | dependencies: 2091 | eastasianwidth "^0.2.0" 2092 | emoji-regex "^9.2.2" 2093 | strip-ansi "^7.0.1" 2094 | 2095 | string.prototype.trim@^1.2.8: 2096 | version "1.2.8" 2097 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" 2098 | integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== 2099 | dependencies: 2100 | call-bind "^1.0.2" 2101 | define-properties "^1.2.0" 2102 | es-abstract "^1.22.1" 2103 | 2104 | string.prototype.trimend@^1.0.7: 2105 | version "1.0.7" 2106 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" 2107 | integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== 2108 | dependencies: 2109 | call-bind "^1.0.2" 2110 | define-properties "^1.2.0" 2111 | es-abstract "^1.22.1" 2112 | 2113 | string.prototype.trimstart@^1.0.7: 2114 | version "1.0.7" 2115 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" 2116 | integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== 2117 | dependencies: 2118 | call-bind "^1.0.2" 2119 | define-properties "^1.2.0" 2120 | es-abstract "^1.22.1" 2121 | 2122 | string_decoder@^1.1.1: 2123 | version "1.3.0" 2124 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2125 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2126 | dependencies: 2127 | safe-buffer "~5.2.0" 2128 | 2129 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 2130 | version "6.0.1" 2131 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2132 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2133 | dependencies: 2134 | ansi-regex "^5.0.1" 2135 | 2136 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2137 | version "6.0.1" 2138 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2139 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2140 | dependencies: 2141 | ansi-regex "^5.0.1" 2142 | 2143 | strip-ansi@^7.0.1: 2144 | version "7.1.0" 2145 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 2146 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 2147 | dependencies: 2148 | ansi-regex "^6.0.1" 2149 | 2150 | strip-final-newline@^2.0.0: 2151 | version "2.0.0" 2152 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2153 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 2154 | 2155 | supports-color@^7.2.0: 2156 | version "7.2.0" 2157 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2158 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2159 | dependencies: 2160 | has-flag "^4.0.0" 2161 | 2162 | supports-preserve-symlinks-flag@^1.0.0: 2163 | version "1.0.0" 2164 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2165 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2166 | 2167 | tape@^5.7.0: 2168 | version "5.7.0" 2169 | resolved "https://registry.yarnpkg.com/tape/-/tape-5.7.0.tgz#7f31bf116159d3cdbc6f65baa11aaa025d34ccfc" 2170 | integrity sha512-6EZoHjMDUUhet8+k32w/9onULL1U8idXKvBCnZxuZF2iFe+tMYOsKo4bpCtXbTSngZmYBnkU08TMhJwsKaHhaw== 2171 | dependencies: 2172 | "@ljharb/resumer" "^0.0.1" 2173 | "@ljharb/through" "^2.3.9" 2174 | array.prototype.every "^1.1.5" 2175 | call-bind "^1.0.2" 2176 | deep-equal "^2.2.2" 2177 | defined "^1.0.1" 2178 | dotignore "^0.1.2" 2179 | for-each "^0.3.3" 2180 | get-package-type "^0.1.0" 2181 | glob "^7.2.3" 2182 | has "^1.0.3" 2183 | has-dynamic-import "^2.0.1" 2184 | inherits "^2.0.4" 2185 | is-regex "^1.1.4" 2186 | minimist "^1.2.8" 2187 | mock-property "^1.0.0" 2188 | object-inspect "^1.12.3" 2189 | object-is "^1.1.5" 2190 | object-keys "^1.1.1" 2191 | object.assign "^4.1.4" 2192 | resolve "^2.0.0-next.4" 2193 | string.prototype.trim "^1.2.8" 2194 | 2195 | tar@^6.1.11, tar@^6.1.2: 2196 | version "6.1.15" 2197 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" 2198 | integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== 2199 | dependencies: 2200 | chownr "^2.0.0" 2201 | fs-minipass "^2.0.0" 2202 | minipass "^5.0.0" 2203 | minizlib "^2.1.1" 2204 | mkdirp "^1.0.3" 2205 | yallist "^4.0.0" 2206 | 2207 | tslib@^2.4.0: 2208 | version "2.6.3" 2209 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" 2210 | integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== 2211 | 2212 | tweetnacl@^1.0.3: 2213 | version "1.0.3" 2214 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" 2215 | integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 2216 | 2217 | type-detect@4.0.8, type-detect@^4.0.8: 2218 | version "4.0.8" 2219 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 2220 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 2221 | 2222 | typed-array-buffer@^1.0.0: 2223 | version "1.0.0" 2224 | resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" 2225 | integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== 2226 | dependencies: 2227 | call-bind "^1.0.2" 2228 | get-intrinsic "^1.2.1" 2229 | is-typed-array "^1.1.10" 2230 | 2231 | typed-array-byte-length@^1.0.0: 2232 | version "1.0.0" 2233 | resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" 2234 | integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== 2235 | dependencies: 2236 | call-bind "^1.0.2" 2237 | for-each "^0.3.3" 2238 | has-proto "^1.0.1" 2239 | is-typed-array "^1.1.10" 2240 | 2241 | typed-array-byte-offset@^1.0.0: 2242 | version "1.0.0" 2243 | resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" 2244 | integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== 2245 | dependencies: 2246 | available-typed-arrays "^1.0.5" 2247 | call-bind "^1.0.2" 2248 | for-each "^0.3.3" 2249 | has-proto "^1.0.1" 2250 | is-typed-array "^1.1.10" 2251 | 2252 | typed-array-length@^1.0.4: 2253 | version "1.0.4" 2254 | resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" 2255 | integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== 2256 | dependencies: 2257 | call-bind "^1.0.2" 2258 | for-each "^0.3.3" 2259 | is-typed-array "^1.1.9" 2260 | 2261 | unbox-primitive@^1.0.2: 2262 | version "1.0.2" 2263 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 2264 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2265 | dependencies: 2266 | call-bind "^1.0.2" 2267 | has-bigints "^1.0.2" 2268 | has-symbols "^1.0.3" 2269 | which-boxed-primitive "^1.0.2" 2270 | 2271 | unique-filename@^3.0.0: 2272 | version "3.0.0" 2273 | resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" 2274 | integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== 2275 | dependencies: 2276 | unique-slug "^4.0.0" 2277 | 2278 | unique-slug@^4.0.0: 2279 | version "4.0.0" 2280 | resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" 2281 | integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== 2282 | dependencies: 2283 | imurmurhash "^0.1.4" 2284 | 2285 | utf-8-validate@5.0.7: 2286 | version "5.0.7" 2287 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" 2288 | integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== 2289 | dependencies: 2290 | node-gyp-build "^4.3.0" 2291 | 2292 | utf-8-validate@6.0.3: 2293 | version "6.0.3" 2294 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" 2295 | integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== 2296 | dependencies: 2297 | node-gyp-build "^4.3.0" 2298 | 2299 | util-deprecate@^1.0.1: 2300 | version "1.0.2" 2301 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2302 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2303 | 2304 | uuid@^8.3.2: 2305 | version "8.3.2" 2306 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 2307 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 2308 | 2309 | uuid@^9.0.1: 2310 | version "9.0.1" 2311 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" 2312 | integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== 2313 | 2314 | which-boxed-primitive@^1.0.2: 2315 | version "1.0.2" 2316 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 2317 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 2318 | dependencies: 2319 | is-bigint "^1.0.1" 2320 | is-boolean-object "^1.1.0" 2321 | is-number-object "^1.0.4" 2322 | is-string "^1.0.5" 2323 | is-symbol "^1.0.3" 2324 | 2325 | which-collection@^1.0.1: 2326 | version "1.0.1" 2327 | resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" 2328 | integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== 2329 | dependencies: 2330 | is-map "^2.0.1" 2331 | is-set "^2.0.1" 2332 | is-weakmap "^2.0.1" 2333 | is-weakset "^2.0.1" 2334 | 2335 | which-typed-array@^1.1.11, which-typed-array@^1.1.9: 2336 | version "1.1.11" 2337 | resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" 2338 | integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== 2339 | dependencies: 2340 | available-typed-arrays "^1.0.5" 2341 | call-bind "^1.0.2" 2342 | for-each "^0.3.3" 2343 | gopd "^1.0.1" 2344 | has-tostringtag "^1.0.0" 2345 | 2346 | which@^2.0.1, which@^2.0.2: 2347 | version "2.0.2" 2348 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2349 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2350 | dependencies: 2351 | isexe "^2.0.0" 2352 | 2353 | which@^3.0.0: 2354 | version "3.0.1" 2355 | resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" 2356 | integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== 2357 | dependencies: 2358 | isexe "^2.0.0" 2359 | 2360 | wide-align@^1.1.5: 2361 | version "1.1.5" 2362 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" 2363 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 2364 | dependencies: 2365 | string-width "^1.0.2 || 2 || 3 || 4" 2366 | 2367 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2368 | version "7.0.0" 2369 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2370 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2371 | dependencies: 2372 | ansi-styles "^4.0.0" 2373 | string-width "^4.1.0" 2374 | strip-ansi "^6.0.0" 2375 | 2376 | wrap-ansi@^7.0.0: 2377 | version "7.0.0" 2378 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2379 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2380 | dependencies: 2381 | ansi-styles "^4.0.0" 2382 | string-width "^4.1.0" 2383 | strip-ansi "^6.0.0" 2384 | 2385 | wrap-ansi@^8.1.0: 2386 | version "8.1.0" 2387 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 2388 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 2389 | dependencies: 2390 | ansi-styles "^6.1.0" 2391 | string-width "^5.0.1" 2392 | strip-ansi "^7.0.1" 2393 | 2394 | wrappy@1: 2395 | version "1.0.2" 2396 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2397 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2398 | 2399 | write-file-atomic@^5.0.0: 2400 | version "5.0.1" 2401 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" 2402 | integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== 2403 | dependencies: 2404 | imurmurhash "^0.1.4" 2405 | signal-exit "^4.0.1" 2406 | 2407 | ws@8.13.0: 2408 | version "8.13.0" 2409 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" 2410 | integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== 2411 | 2412 | xtend@^4.0.1: 2413 | version "4.0.2" 2414 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2415 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2416 | 2417 | y18n@^5.0.5: 2418 | version "5.0.8" 2419 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2420 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2421 | 2422 | yallist@^4.0.0: 2423 | version "4.0.0" 2424 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2425 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2426 | 2427 | yargs-parser@^20.2.2: 2428 | version "20.2.9" 2429 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 2430 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 2431 | 2432 | yargs-parser@^21.0.0: 2433 | version "21.0.1" 2434 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" 2435 | integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== 2436 | 2437 | yargs@^16.2.0: 2438 | version "16.2.0" 2439 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 2440 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 2441 | dependencies: 2442 | cliui "^7.0.2" 2443 | escalade "^3.1.1" 2444 | get-caller-file "^2.0.5" 2445 | require-directory "^2.1.1" 2446 | string-width "^4.2.0" 2447 | y18n "^5.0.5" 2448 | yargs-parser "^20.2.2" 2449 | 2450 | yargs@^17.0.1: 2451 | version "17.4.1" 2452 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284" 2453 | integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== 2454 | dependencies: 2455 | cliui "^7.0.2" 2456 | escalade "^3.1.1" 2457 | get-caller-file "^2.0.5" 2458 | require-directory "^2.1.1" 2459 | string-width "^4.2.3" 2460 | y18n "^5.0.5" 2461 | yargs-parser "^21.0.0" 2462 | --------------------------------------------------------------------------------