diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index fc76d4e2..a5241d6c 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -22,10 +22,8 @@ jobs: - name: Run linter run: npm run lint + - name: Run tests + run: npm run test + - name: Build project run: npm run build - - # TODO: Separate the tests that can be run without a lattice - # and run those tests here. - # - name: Run tests - # run: npm run test diff --git a/.vscode/launch.json b/.vscode/launch.json index 068e4f86..c61f0c1f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,78 +1,99 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", "configurations": [ { - "name": "test-all", - "type": "node", + "args": ["run", "${relativeFile}"], + "autoAttachChildProcesses": true, + "console": "integratedTerminal", + "name": "Debug Current Test File", + "program": "${workspaceRoot}/node_modules/vitest/vitest.mjs", "request": "launch", + "skipFiles": ["/**", "**/node_modules/**"], + "smartStep": true, + "type": "pwa-node" + }, + { + "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test"], "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "Unit Tests - All", + "request": "launch", + "runtimeArgs": ["run-script", "test"], + "runtimeExecutable": "npm", + "type": "node" }, { - "name": "test-btc", - "type": "node", - "request": "launch", + "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test-btc"], "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "E2E Tests - All", + "request": "launch", + "runtimeArgs": ["run-script", "test-e2e"], + "runtimeExecutable": "npm", + "type": "node" }, { - "name": "test-eth-msg", - "type": "node", - "request": "launch", + "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test-eth-msg"], "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "E2E Tests - General", + "request": "launch", + "runtimeArgs": ["run-script", "test-gen"], + "runtimeExecutable": "npm", + "type": "node" }, { - "name": "test-kv", - "type": "node", - "request": "launch", + "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test-kv"], "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "E2E Tests - Bitcoin", + "request": "launch", + "runtimeArgs": ["run-script", "test-btc"], + "runtimeExecutable": "npm", + "type": "node" }, { - "name": "test-non-exportable", - "type": "node", - "request": "launch", + "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test-non-exportable"], "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "E2E Tests - Signing", + "request": "launch", + "runtimeArgs": ["run-script", "test-sign"], + "runtimeExecutable": "npm", + "type": "node" }, { - "name": "test-signing", - "type": "node", - "request": "launch", + "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test-signing"], "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "E2E Tests - Key-Value", + "request": "launch", + "runtimeArgs": ["run-script", "test-kv"], + "runtimeExecutable": "npm", + "type": "node" }, { - "name": "test-wallet-jobs", - "type": "node", - "request": "launch", + "console": "integratedTerminal", "cwd": "${workspaceFolder}", + "envFile": "${workspaceFolder}/.env", + "name": "E2E Tests - Non-Exportable Card", + "request": "launch", + "runtimeArgs": ["run-script", "test-ne"], "runtimeExecutable": "npm", - "runtimeArgs": ["run-script", "test-wallet-jobs"], + "type": "node" + }, + { + "console": "integratedTerminal", + "cwd": "${workspaceFolder}", "envFile": "${workspaceFolder}/.env", - "console": "integratedTerminal" + "name": "E2E Tests - Wallet Jobs", + "request": "launch", + "runtimeArgs": ["run-script", "test-wj"], + "runtimeExecutable": "npm", + "type": "node" } - ] + ], + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0" } diff --git a/docs/docs/testing.md b/docs/docs/testing.md index 5313f23c..e8481aaa 100644 --- a/docs/docs/testing.md +++ b/docs/docs/testing.md @@ -34,7 +34,7 @@ The following options can be used after `env` with any test. | `REUSE_KEY` | Must be `1` | Indicates we will be creating a new pairing with a Lattice and stashing that connection | | `DEVICE_ID` | A six character string | The device ID of the target Lattice | | `name` | Any 5-25 character string (default="SDK Test") | The name of the pairing you will create | -| `baseUrl` | Any URL (default="https://signing.gridplus.io") | URL describing where to send HTTP requests. Should be changed if your Lattice is on non-default message routing infrastructure. | +| `baseUrl` | Any URL (default="https://signing.gridpl.us") | URL describing where to send HTTP requests. Should be changed if your Lattice is on non-default message routing infrastructure. | ## Setting up the `.env` file diff --git a/package-lock.json b/package-lock.json index d11c28c9..716c8dbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3603 +1,7678 @@ { - "dependencies": { - "@babel/code-frame": { - "dev": true, - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" + "name": "gridplus-sdk", + "version": "2.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "gridplus-sdk", + "version": "2.1.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@ethereumjs/common": "2.4.0", + "@ethereumjs/tx": "3.3.0", + "aes-js": "^3.1.1", + "bech32": "^2.0.0", + "bignumber.js": "^9.0.1", + "bitwise": "^2.0.4", + "borc": "^2.1.2", + "bs58check": "^2.1.2", + "buffer": "^5.6.0", + "crc-32": "^1.2.0", + "elliptic": "^6.5.4", + "eth-eip712-util-browser": "^0.0.3", + "hash.js": "^1.1.7", + "js-sha3": "^0.8.0", + "rlp": "^3.0.0", + "secp256k1": "4.0.2", + "superagent": "^7.1.3" }, - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "version": "7.16.7" + "devDependencies": { + "@babel/core": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@babel/preset-typescript": "^7.17.12", + "@ethersproject/abi": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@solana/web3.js": "^1.34.0", + "@terra-money/terra.js": "^3.0.7", + "@types/elliptic": "^6.4.14", + "@types/expect": "^24.3.0", + "@types/random-words": "^1.1.2", + "@types/readline-sync": "^1.4.4", + "@types/seedrandom": "^3.0.2", + "@types/superagent": "^4.1.15", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "acorn": ">=6.4.1", + "bip32": "^1.0.4", + "bip39": "^3.0.2", + "bitcoinjs-lib": "4.0.3", + "chai": "^4.2.0", + "dotenv": "^16.0.0", + "ed25519-hd-key": "^1.2.0", + "enquirer": "^2.3.6", + "eslint": "^8.7.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.0.0", + "ethereumjs-util": "^7.1.4", + "jsonc": "^2.0.0", + "lodash": ">=4.17.21", + "minimist": ">=0.2.1", + "msw": "^0.42.0", + "patch-package": "^6.4.7", + "prettier": "^2.6.2", + "prettier-eslint": "^15.0.1", + "random-words": "^1.1.1", + "readline-sync": "^1.4.9", + "request-promise": "^4.2.6", + "seedrandom": "^3.0.5", + "ts-mocha": "^10.0.0", + "typescript": "^4.7.0", + "vitest": "^0.15.1" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "version": "7.16.7" - }, - "@babel/highlight": { "dependencies": { - "ansi-styles": { - "dev": true, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - }, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "version": "3.2.1" - }, - "chalk": { - "dev": true, - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "version": "2.4.2" - }, - "color-convert": { - "dev": true, - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - }, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "version": "1.9.3" - }, - "color-name": { - "dev": true, - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "version": "1.1.3" - }, - "escape-string-regexp": { - "dev": true, - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "version": "1.0.5" - }, - "has-flag": { - "dev": true, - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "version": "3.0.0" - }, - "supports-color": { - "dev": true, - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - }, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "version": "5.5.0" - } - }, - "dev": true, - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "version": "7.16.10" + "engines": { + "node": ">=6.0.0" + } }, - "@babel/runtime": { + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", - "requires": { - "regenerator-runtime": "^0.13.4" - }, - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "version": "7.17.2" - }, - "@eslint/eslintrc": { "dependencies": { - "ignore": { - "dev": true, - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "version": "4.0.6" - } - }, - "dev": true, - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@babel/highlight": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "version": "1.0.5" + "engines": { + "node": ">=6.9.0" + } }, - "@ethereumjs/common": { - "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==", - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.0" + "node_modules/@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" }, - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz", - "version": "2.4.0" - }, - "@ethereumjs/tx": { - "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==", - "requires": { - "@ethereumjs/common": "^2.4.0", - "ethereumjs-util": "^7.1.0" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz", - "version": "3.3.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } }, - "@ethersproject/abi": { + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", - "requires": { - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/hash": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "bin": { + "json5": "lib/cli.js" }, - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6" + } }, - "@ethersproject/abstract-provider": { + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", - "requires": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/networks": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/transactions": "^5.5.0", - "@ethersproject/web": "^5.5.0" - }, - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", - "version": "5.5.1" + "bin": { + "semver": "bin/semver.js" + } }, - "@ethersproject/abstract-signer": { + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, - "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", - "requires": { - "@ethersproject/abstract-provider": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0" + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" }, - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/address": { + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", "dev": true, - "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", - "requires": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/rlp": "^5.5.0" + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.0.0" + } }, - "@ethersproject/base64": { + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, - "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", - "requires": { - "@ethersproject/bytes": "^5.5.0" + "dependencies": { + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/bignumber": { + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, - "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", - "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "bn.js": "^4.11.9" + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/bytes": { + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, - "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", - "requires": { - "@ethersproject/logger": "^5.5.0" + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" }, - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "@ethersproject/constants": { + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", - "requires": { - "@ethersproject/bignumber": "^5.5.0" - }, - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", - "version": "5.5.0" + "bin": { + "semver": "bin/semver.js" + } }, - "@ethersproject/hash": { + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, - "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", - "requires": { - "@ethersproject/abstract-signer": "^5.5.0", - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "@ethersproject/keccak256": { + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dev": true, - "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", - "requires": { - "@ethersproject/bytes": "^5.5.0", - "js-sha3": "0.8.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" }, - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "@ethersproject/logger": { + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, - "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", - "version": "5.5.0" + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } }, - "@ethersproject/networks": { + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", - "requires": { - "@ethersproject/logger": "^5.5.0" - }, - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", - "version": "5.5.2" + "bin": { + "semver": "bin/semver.js" + } }, - "@ethersproject/properties": { + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", "dev": true, - "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", - "requires": { - "@ethersproject/logger": "^5.5.0" - }, - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/rlp": { + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, - "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", - "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0" + "dependencies": { + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/sha2": { + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, - "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", - "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "hash.js": "1.1.7" + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" }, - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/signing-key": { + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, - "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", - "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.7" + "dependencies": { + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/strings": { + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, - "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", - "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/logger": "^5.5.0" + "dependencies": { + "@babel/types": "^7.17.0" }, - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/transactions": { + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, - "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", - "requires": { - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/rlp": "^5.5.0", - "@ethersproject/signing-key": "^5.5.0" + "dependencies": { + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", - "version": "5.5.0" + "engines": { + "node": ">=6.9.0" + } }, - "@ethersproject/web": { + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dev": true, - "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", - "requires": { - "@ethersproject/base64": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" }, - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", - "version": "5.5.1" + "engines": { + "node": ">=6.9.0" + } }, - "@humanwhocodes/config-array": { + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "dependencies": { + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "version": "0.9.3" + "engines": { + "node": ">=6.9.0" + } }, - "@humanwhocodes/object-schema": { + "node_modules/@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "dev": true, - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "version": "1.2.1" + "engines": { + "node": ">=6.9.0" + } }, - "@jest/types": { + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" }, - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "version": "27.4.2" + "engines": { + "node": ">=6.9.0" + } }, - "@nodelib/fs.scandir": { + "node_modules/@babel/helper-replace-supers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", "dev": true, - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" }, - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "version": "2.1.5" + "engines": { + "node": ">=6.9.0" + } }, - "@nodelib/fs.stat": { + "node_modules/@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "version": "2.0.5" + "dependencies": { + "@babel/types": "^7.18.2" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@nodelib/fs.walk": { + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "dependencies": { + "@babel/types": "^7.16.0" }, - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "version": "1.2.8" + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/aspromise": { + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "version": "1.1.2" + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/base64": { + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true, - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "version": "1.1.2" + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/codegen": { + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true, - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "version": "2.0.4" + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/eventemitter": { + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "version": "1.1.0" + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/fetch": { + "node_modules/@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" }, - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "version": "1.1.0" + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/float": { + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "version": "1.0.2" + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "@protobufjs/inquire": { + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "version": "1.1.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "@protobufjs/path": { + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "version": "1.1.2" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "@protobufjs/pool": { + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "version": "1.1.0" + "dependencies": { + "color-name": "1.1.3" + } }, - "@protobufjs/utf8": { + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "version": "1.1.0" + "engines": { + "node": ">=0.8.0" + } }, - "@solana/buffer-layout": { + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "buffer": { - "dev": true, - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - }, - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "version": "6.0.3" - } + "has-flag": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", "dev": true, - "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", - "requires": { - "buffer": "~6.0.3" + "bin": { + "parser": "bin/babel-parser.js" }, - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", - "version": "3.0.0" + "engines": { + "node": ">=6.0.0" + } }, - "@solana/web3.js": { + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "dev": true, "dependencies": { - "bn.js": { - "dev": true, - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "version": "5.2.0" - }, - "buffer": { - "dev": true, - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - }, - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "version": "6.0.1" - } + "@babel/helper-plugin-utils": "^7.17.12" }, - "dev": true, - "integrity": "sha512-6QvqN2DqEELvuV+5yUQM8P9fRiSG+6SzQ58HjumJqODu14r7eu5HXVWEymvKAvMLGME+0TmAdJHjw9xD5NgUWA==", - "requires": { - "@babel/runtime": "^7.12.5", - "@ethersproject/sha2": "^5.5.0", - "@solana/buffer-layout": "^3.0.0", - "bn.js": "^5.0.0", - "borsh": "^0.4.0", - "bs58": "^4.0.1", - "buffer": "6.0.1", - "cross-fetch": "^3.1.4", - "jayson": "^3.4.4", - "js-sha3": "^0.8.0", - "rpc-websockets": "^7.4.2", - "secp256k1": "^4.0.2", - "superstruct": "^0.14.2", - "tweetnacl": "^1.0.0" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.34.0.tgz", - "version": "1.34.0" + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "@terra-money/terra.js": { + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "dev": true, "dependencies": { - "@types/node": { - "dev": true, - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "version": "10.12.18" - }, - "bip32": { - "dev": true, - "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", - "requires": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", - "version": "2.0.6" - } + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.17.12" }, - "dev": true, - "integrity": "sha512-moeVBWqIPZaV0HmCY127Y9H/MsuFtH1VgW0xEvDQWqu1jpKhK5CtPHMLKNje3mKSjU8A7vXZ8hlW3KobqP2poQ==", - "requires": { - "@terra-money/terra.proto": "^0.1.7", - "axios": "^0.24.0", - "bech32": "^2.0.0", - "bip32": "^2.0.6", - "bip39": "^3.0.3", - "bufferutil": "^4.0.3", - "decimal.js": "^10.2.1", - "jscrypto": "^1.0.1", - "readable-stream": "^3.6.0", - "secp256k1": "^4.0.2", - "tmp": "^0.2.1", - "utf-8-validate": "^5.0.5", - "ws": "^7.5.5" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.7.tgz", - "version": "3.0.7" + "peerDependencies": { + "@babel/core": "^7.13.0" + } }, - "@terra-money/terra.proto": { + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "dev": true, - "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", - "requires": { - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, - "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", - "version": "0.1.7" - }, - "@types/bn.js": { - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "requires": { - "@types/node": "*" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "version": "5.1.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/connect": { + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dev": true, - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "version": "3.4.35" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/cookiejar": { + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dev": true, - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "version": "2.1.2" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } }, - "@types/eslint-visitor-keys": { + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "version": "1.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/expect": { + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dev": true, - "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", - "requires": { - "expect": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", - "version": "24.3.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/express-serve-static-core": { + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dev": true, - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "version": "4.17.28" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/istanbul-lib-coverage": { + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dev": true, - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "version": "2.0.4" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/istanbul-lib-report": { + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dev": true, - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "version": "3.0.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/istanbul-reports": { + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "version": "3.0.1" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/json-schema": { + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "version": "7.0.9" + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/json5": { + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "optional": true, - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "version": "0.0.29" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/lodash": { + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dev": true, - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "version": "4.14.178" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/long": { + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dev": true, - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "version": "4.0.1" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/mocha": { + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "dev": true, - "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", - "version": "9.1.0" - }, - "@types/node": { - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "version": "11.11.6" - }, - "@types/pbkdf2": { - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "requires": { - "@types/node": "*" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "version": "3.1.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/qs": { + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dev": true, - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "version": "6.9.7" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/range-parser": { + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "version": "1.2.4" - }, - "@types/secp256k1": { - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "requires": { - "@types/node": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "version": "4.0.3" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/stack-utils": { + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "version": "2.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/superagent": { + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", - "requires": { - "@types/cookiejar": "*", - "@types/node": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", - "version": "4.1.15" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/ws": { + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "requires": { - "@types/node": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "version": "7.4.7" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/yargs": { + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "requires": { - "@types/yargs-parser": "*" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" }, - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "version": "16.0.4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@types/yargs-parser": { + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", "dev": true, - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "version": "20.2.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/eslint-plugin": { + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==", - "requires": { - "@typescript-eslint/scope-manager": "5.10.2", - "@typescript-eslint/type-utils": "5.10.2", - "@typescript-eslint/utils": "5.10.2", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", - "version": "5.10.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/experimental-utils": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "dependencies": { - "@typescript-eslint/types": { - "dev": true, - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "version": "3.10.1" - }, - "@typescript-eslint/typescript-estree": { - "dev": true, - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "requires": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "version": "3.10.1" - }, - "@typescript-eslint/visitor-keys": { - "dev": true, - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "version": "3.10.1" - }, - "eslint-utils": { - "dev": true, - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "version": "2.1.0" - }, - "eslint-visitor-keys": { - "dev": true, - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "version": "1.3.0" - } + "@babel/helper-plugin-utils": "^7.10.4" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "version": "3.10.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/parser": { + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==", - "requires": { - "@typescript-eslint/scope-manager": "5.10.2", - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/typescript-estree": "5.10.2", - "debug": "^4.3.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz", - "version": "5.10.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/scope-manager": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==", - "requires": { - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/visitor-keys": "5.10.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", - "version": "5.10.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/type-utils": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==", - "requires": { - "@typescript-eslint/utils": "5.10.2", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", - "version": "5.10.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/types": { + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz", - "version": "5.10.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/typescript-estree": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==", - "requires": { - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/visitor-keys": "5.10.2", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", - "version": "5.10.2" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/utils": { + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==", - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.2", - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/typescript-estree": "5.10.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz", - "version": "5.10.2" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@typescript-eslint/visitor-keys": { + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", "dev": true, - "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==", - "requires": { - "@typescript-eslint/types": "5.10.2", - "eslint-visitor-keys": "^3.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", - "version": "5.10.2" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "@ungap/promise-all-settled": { + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dev": true, - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "version": "1.1.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "JSONStream": { + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dev": true, - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8" }, - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "version": "1.3.5" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "acorn": { + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "version": "8.7.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "acorn-jsx": { + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", + "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", "dev": true, - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {}, - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "version": "5.3.2" - }, - "aes-js": { - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "version": "3.1.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "ajv": { + "node_modules/@babel/plugin-transform-classes": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", + "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", "dev": true, - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" }, - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "version": "6.12.6" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "ansi-colors": { + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "version": "4.1.1" + "engines": { + "node": ">=4" + } }, - "ansi-regex": { + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dev": true, - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "version": "5.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "ansi-styles": { + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "anymatch": { + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "version": "3.1.2" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "argparse": { + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dev": true, - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "version": "2.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "array-union": { + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "version": "2.1.0" + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "arrify": { + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "version": "1.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "asn1": { + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "peer": true, - "requires": { - "safer-buffer": "~2.1.0" + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "version": "0.2.6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "assert-plus": { + "node_modules/@babel/plugin-transform-literals": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dev": true, - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "peer": true, - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "version": "1.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "assertion-error": { + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "version": "1.1.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "astral-regex": { + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "version": "2.0.0" - }, - "asynckit": { - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "version": "0.4.0" + "dependencies": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "aws-sign2": { + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "peer": true, - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "version": "0.7.0" + "dependencies": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "aws4": { + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", + "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", "dev": true, - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "peer": true, - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "version": "1.11.0" + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "axios": { + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dev": true, - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "requires": { - "follow-redirects": "^1.14.4" + "dependencies": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "version": "0.24.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "balanced-match": { + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "dev": true, - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "version": "1.0.2" - }, - "base-x": { - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "version": "3.0.9" - }, - "base64-js": { - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "version": "1.5.1" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "bcrypt-pbkdf": { + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "dev": true, "dependencies": { - "tweetnacl": { - "dev": true, - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "peer": true, - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "version": "0.14.5" - } + "@babel/helper-plugin-utils": "^7.17.12" }, - "dev": true, - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "peer": true, - "requires": { - "tweetnacl": "^0.14.3" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "version": "1.0.2" - }, - "bech32": { - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "version": "2.0.0" - }, - "bignumber.js": { - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "version": "9.0.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "binary-extensions": { + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "version": "2.2.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bindings": { + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "dev": true, - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "version": "1.5.0" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bip32": { + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, - "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", - "requires": { - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.5", - "wif": "^2.0.6" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", - "version": "1.0.4" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bip39": { + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "regenerator-transform": "^0.15.0" }, - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "version": "3.0.4" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bip66": { + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "dev": true, - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" }, - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "version": "1.1.5" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bitcoin-ops": { + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "version": "1.4.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bitcoinjs-lib": { + "node_modules/@babel/plugin-transform-spread": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "dev": true, "dependencies": { - "bech32": { - "dev": true, - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "version": "1.1.4" - } + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, - "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", - "requires": { - "bech32": "^1.1.2", - "bip32": "^1.0.0", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.1", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", - "version": "4.0.3" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bitwise": { - "integrity": "sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ==", - "resolved": "https://registry.npmjs.org/bitwise/-/bitwise-2.1.0.tgz", - "version": "2.1.0" + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "blakejs": { - "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", - "version": "1.1.1" + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bluebird": { + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", + "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", "dev": true, - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "version": "3.7.2" + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "bn.js": { - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "version": "4.12.0" - }, - "borc": { - "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", - "requires": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", - "version": "2.1.2" - }, - "borsh": { - "dependencies": { - "@types/bn.js": { - "dev": true, - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - }, - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "version": "4.11.6" - }, - "bn.js": { - "dev": true, - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "version": "5.2.0" - } - }, - "dev": true, - "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", - "requires": { - "@types/bn.js": "^4.11.5", - "bn.js": "^5.0.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - }, - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", - "version": "0.4.0" - }, - "brace-expansion": { + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "version": "1.1.11" - }, - "braces": { - "dev": true, - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "version": "3.0.2" - }, - "brorand": { - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "version": "1.1.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "browser-stdout": { + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "version": "1.3.1" - }, - "browserify-aes": { - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "version": "1.2.0" - }, - "bs58": { - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { - "base-x": "^3.0.2" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "version": "4.0.1" - }, - "bs58check": { - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.2", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" }, - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "version": "2.1.2" - }, - "buffer": { - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "engines": { + "node": ">=6.9.0" }, - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "version": "5.7.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "buffer-from": { + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "version": "1.1.2" - }, - "buffer-xor": { - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "version": "1.0.3" + "bin": { + "semver": "bin/semver.js" + } }, - "bufferutil": { + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "requires": { - "node-gyp-build": "^4.3.0" - }, - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "version": "4.0.6" - }, - "call-bind": { - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "version": "1.0.2" - }, - "callsites": { - "dev": true, - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "version": "3.1.0" - }, - "camelcase": { - "dev": true, - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "version": "6.3.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "caseless": { + "node_modules/@babel/preset-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "dev": true, - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "peer": true, - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "version": "0.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.17.12" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "chai": { + "node_modules/@babel/runtime": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", + "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", "dev": true, - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "dependencies": { + "regenerator-runtime": "^0.13.4" }, - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "version": "4.3.6" + "engines": { + "node": ">=6.9.0" + } }, - "chalk": { + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" + "engines": { + "node": ">=6.9.0" + } }, - "check-error": { + "node_modules/@babel/traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dev": true, - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "version": "1.0.2" - }, - "chokidar": { "dependencies": { - "glob-parent": { - "dev": true, - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - }, - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "version": "5.1.2" - } + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", + "debug": "^4.1.0", + "globals": "^11.1.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "version": "3.5.3" + "engines": { + "node": ">=4" + } }, - "cipher-base": { - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "node_modules/@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "version": "1.0.4" + "engines": { + "node": ">=6.9.0" + } }, - "circular-json": { + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "version": "0.5.9" + "optional": true, + "peer": true }, - "cliui": { + "node_modules/@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "version": "7.0.4" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, - "color-convert": { + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - }, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" + "engines": { + "node": ">= 4" + } }, - "color-name": { - "dev": true, - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" + "node_modules/@ethereumjs/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz", + "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.0" + } }, - "combined-stream": { + "node_modules/@ethereumjs/tx": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz", + "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==", + "dependencies": { + "@ethereumjs/common": "^2.4.0", + "ethereumjs-util": "^7.1.0" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", + "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", + "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/networks": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/web": "^5.5.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", + "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", + "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/rlp": "^5.5.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", + "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", + "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "bn.js": "^4.11.9" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", + "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", + "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.5.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", + "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", + "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", + "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", + "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", + "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", + "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", + "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", + "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", + "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", + "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", + "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/expect-utils": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.1.tgz", + "integrity": "sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.23.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mswjs/cookies": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.1.tgz", + "integrity": "sha512-0tDfcPw5/s7QsNQqS3knAvAD5w5PF1nNPagRhKO/yECY+sMbJxoC2sLWnH7Lzmh52mTSVLKDhd1r92Q3kfljnQ==", + "dev": true, + "dependencies": { + "@types/set-cookie-parser": "^2.4.0", + "set-cookie-parser": "^2.4.6" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.16.4.tgz", + "integrity": "sha512-McPKUFlZNS/wo+OAor15k0fv2skK+EdWl9CEcdxAqsN4vKajlxCxDU4B5W/pn1y0TJPSAOmxR6LYFe/8esePrg==", + "dev": true, + "dependencies": { + "@open-draft/until": "^1.0.3", + "@xmldom/xmldom": "^0.7.5", + "debug": "^4.3.3", + "headers-polyfill": "^3.0.4", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.2.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/until": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", + "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==", + "dev": true + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dev": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true + }, + "node_modules/@solana/buffer-layout": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", + "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", + "dev": true, + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, + "node_modules/@solana/buffer-layout/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.34.0.tgz", + "integrity": "sha512-6QvqN2DqEELvuV+5yUQM8P9fRiSG+6SzQ58HjumJqODu14r7eu5HXVWEymvKAvMLGME+0TmAdJHjw9xD5NgUWA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@ethersproject/sha2": "^5.5.0", + "@solana/buffer-layout": "^3.0.0", + "bn.js": "^5.0.0", + "borsh": "^0.4.0", + "bs58": "^4.0.1", + "buffer": "6.0.1", + "cross-fetch": "^3.1.4", + "jayson": "^3.4.4", + "js-sha3": "^0.8.0", + "rpc-websockets": "^7.4.2", + "secp256k1": "^4.0.2", + "superstruct": "^0.14.2", + "tweetnacl": "^1.0.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@solana/web3.js/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/@solana/web3.js/node_modules/buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@terra-money/terra.js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.7.tgz", + "integrity": "sha512-moeVBWqIPZaV0HmCY127Y9H/MsuFtH1VgW0xEvDQWqu1jpKhK5CtPHMLKNje3mKSjU8A7vXZ8hlW3KobqP2poQ==", + "dev": true, + "dependencies": { + "@terra-money/terra.proto": "^0.1.7", + "axios": "^0.24.0", + "bech32": "^2.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.3", + "bufferutil": "^4.0.3", + "decimal.js": "^10.2.1", + "jscrypto": "^1.0.1", + "readable-stream": "^3.6.0", + "secp256k1": "^4.0.2", + "tmp": "^0.2.1", + "utf-8-validate": "^5.0.5", + "ws": "^7.5.5" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@terra-money/terra.js/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true + }, + "node_modules/@terra-money/terra.js/node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dev": true, + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@terra-money/terra.proto": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", + "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", + "dev": true, + "dependencies": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz", + "integrity": "sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, + "node_modules/@types/elliptic": { + "version": "6.4.14", + "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.14.tgz", + "integrity": "sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ==", + "dev": true, + "dependencies": { + "@types/bn.js": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", + "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/expect": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", + "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", + "deprecated": "This is a stub types definition. expect provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "expect": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/js-levenshtein": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", + "integrity": "sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/random-words": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/random-words/-/random-words-1.1.2.tgz", + "integrity": "sha512-gULpJ68bNovfBWPWNNhwJgd/GcKdfkPpXXQGgACQWffgy6LRiJB4+4s/IslhFJKQvb5wBlnlOwFJ6RawHU5z3A==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/readline-sync": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@types/readline-sync/-/readline-sync-1.4.4.tgz", + "integrity": "sha512-cFjVIoiamX7U6zkO2VPvXyTxbFDdiRo902IarJuPVxBhpDnXhwSaVE86ip+SCuyWBbEioKCkT4C88RNTxBM1Dw==", + "dev": true + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/seedrandom": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.2.tgz", + "integrity": "sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ==", + "dev": true + }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz", + "integrity": "sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/superagent": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", + "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", + "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/type-utils": "5.10.2", + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz", + "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", + "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", + "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz", + "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", + "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz", + "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", + "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.10.2", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true, + "peer": true + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", + "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "node_modules/bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip32": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", + "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", + "dev": true, + "dependencies": { + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.0.0", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dev": true, + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", + "dev": true + }, + "node_modules/bitcoinjs-lib": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", + "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", + "dev": true, + "dependencies": { + "bech32": "^1.1.2", + "bip32": "^1.0.0", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.1", + "tiny-secp256k1": "^1.0.0", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bitcoinjs-lib/node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true + }, + "node_modules/bitwise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bitwise/-/bitwise-2.1.0.tgz", + "integrity": "sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ==" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blakejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", + "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "dependencies": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/borsh": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", + "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", + "dev": true, + "dependencies": { + "@types/bn.js": "^4.11.5", + "bn.js": "^5.0.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/borsh/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/borsh/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "peer": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", + "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001349", + "electron-to-chromium": "^1.4.147", + "escalade": "^3.1.1", + "node-releases": "^2.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/c8": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.3.tgz", + "integrity": "sha512-6YBmsaNmqRm9OS3ZbIiL2EZgi1+Xc4O24jL3vMYGE6idixYuGdy76rIfIdltSKDj9DpLNrcXSonUTR1miBD0wA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/c8/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001349", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001349.tgz", + "integrity": "sha512-VFaWW3jeo6DLU5rwdiasosxhYSduJgSGil4cSyX3/85fbctlE58pXAkWyuRmVA0r2RxsOSVYUTZcySJ8WpbTxw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" }, - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "version": "1.0.8" + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "node_modules/core-js-compat": { + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", + "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "dev": true, + "dependencies": { + "browserslist": "^4.20.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/crc-32": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", + "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.3.1" + }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" + }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ed25519-hd-key": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.2.0.tgz", + "integrity": "sha512-pwES3tQ4Z8g3sfIBZEgtuTwFtHq5AlB9L8k9a48k7qPn74q2OmgrrgkdwyJ+P2GVTOBVCClAC7w21Wpksso3gw==", + "dev": true, + "dependencies": { + "bip39": "3.0.2", + "create-hmac": "1.1.7", + "tweetnacl": "1.0.3" + } + }, + "node_modules/ed25519-hd-key/node_modules/bip39": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "dev": true, + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.147", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.147.tgz", + "integrity": "sha512-czclPqxLMPqPMkahKcske4TaS5lcznsc26ByBlEFDU8grTBVK9C5W6K9I6oEEhm4Ai4jTihGnys90xY1yjXcRg==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/esbuild": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz", + "integrity": "sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.43", + "esbuild-android-arm64": "0.14.43", + "esbuild-darwin-64": "0.14.43", + "esbuild-darwin-arm64": "0.14.43", + "esbuild-freebsd-64": "0.14.43", + "esbuild-freebsd-arm64": "0.14.43", + "esbuild-linux-32": "0.14.43", + "esbuild-linux-64": "0.14.43", + "esbuild-linux-arm": "0.14.43", + "esbuild-linux-arm64": "0.14.43", + "esbuild-linux-mips64le": "0.14.43", + "esbuild-linux-ppc64le": "0.14.43", + "esbuild-linux-riscv64": "0.14.43", + "esbuild-linux-s390x": "0.14.43", + "esbuild-netbsd-64": "0.14.43", + "esbuild-openbsd-64": "0.14.43", + "esbuild-sunos-64": "0.14.43", + "esbuild-windows-32": "0.14.43", + "esbuild-windows-64": "0.14.43", + "esbuild-windows-arm64": "0.14.43" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz", + "integrity": "sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz", + "integrity": "sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz", + "integrity": "sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz", + "integrity": "sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz", + "integrity": "sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz", + "integrity": "sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz", + "integrity": "sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz", + "integrity": "sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz", + "integrity": "sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz", + "integrity": "sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz", + "integrity": "sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz", + "integrity": "sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz", + "integrity": "sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz", + "integrity": "sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz", + "integrity": "sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz", + "integrity": "sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz", + "integrity": "sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz", + "integrity": "sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz", + "integrity": "sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz", + "integrity": "sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "commander": { - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "version": "2.20.3" + "node_modules/eslint": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "common-tags": { - "dev": true, - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "version": "1.8.2" + "node_modules/eth-eip712-util-browser": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/eth-eip712-util-browser/-/eth-eip712-util-browser-0.0.3.tgz", + "integrity": "sha512-RUXQ6Hjl0wEjm/ObWgYKjzMfO1segqcPFGnMPtBkkwGaHGbXXh6WFAn5vZfReK9WWujs35uIW2+kgJmh3FXtww==", + "dependencies": { + "bn.js": ">4.0.0", + "buffer": "^6.0.3", + "js-sha3": "^0.8.0" + } }, - "component-emitter": { - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "version": "1.3.0" + "node_modules/eth-eip712-util-browser/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } }, - "concat-map": { - "dev": true, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "version": "0.0.1" + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } }, - "cookiejar": { - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "version": "2.1.3" + "node_modules/ethereumjs-util": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz", + "integrity": "sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } }, - "core-util-is": { - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "version": "1.0.3" + "node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, - "crc-32": { - "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.3.1" + "node_modules/ethereumjs-util/node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" }, - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", - "version": "1.2.1" + "bin": { + "rlp": "bin/rlp" + } }, - "create-hash": { - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - }, - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "version": "1.2.0" + "safe-buffer": "^5.1.1" + } }, - "create-hmac": { - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "version": "1.1.7" + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } }, - "cross-fetch": { + "node_modules/expect": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.1.tgz", + "integrity": "sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==", "dev": true, - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" + "dependencies": { + "@jest/expect-utils": "^28.1.1", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1" }, - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "version": "3.1.5" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "cross-spawn": { + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "version": "7.0.3" + "engines": { + "node": ">=4" + } }, - "dashdash": { + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "peer": true, - "requires": { - "assert-plus": "^1.0.0" + "dependencies": { + "os-tmpdir": "~1.0.2" }, - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "version": "1.14.1" + "engines": { + "node": ">=0.6.0" + } }, - "debug": { + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", "dev": true, - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "version": "4.3.3" + "engines": { + "node": ">=8.6.0" + } }, - "decamelize": { + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "version": "4.0.0" + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "decimal.js": { + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "version": "10.3.1" + "dependencies": { + "reusify": "^1.0.4" + } }, - "deep-eql": { + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "requires": { - "type-detect": "^4.0.0" + "dependencies": { + "escape-string-regexp": "^1.0.5" }, - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "version": "3.0.1" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "deep-is": { + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "version": "0.1.4" + "engines": { + "node": ">=0.8.0" + } }, - "delay": { + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "version": "5.0.0" + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } }, - "delayed-stream": { - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "version": "1.0.0" + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true }, - "delimit-stream": { - "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "version": "0.1.0" + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "diff": { + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "version": "5.0.0" + "dependencies": { + "micromatch": "^4.0.2" + } }, - "diff-sequences": { + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "version": "27.4.0" + "peer": true, + "bin": { + "flat": "cli.js" + } }, - "dir-glob": { + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "version": "3.0.1" + "engines": { + "node": "^10.12.0 || >=12.0.0" + } }, - "dlv": { - "dev": true, - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "version": "1.1.3" + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true }, - "doctrine": { + "node_modules/follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true, - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" }, - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "version": "3.0.0" - }, - "dotenv": { - "dev": true, - "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", - "version": "16.0.0" + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "ecc-jsbn": { + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, "peer": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "version": "0.1.2" + "engines": { + "node": ">=8.0.0" + } }, - "ed25519-hd-key": { + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "bip39": { - "dev": true, - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", - "requires": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "version": "3.0.2" - } - }, - "dev": true, - "integrity": "sha512-pwES3tQ4Z8g3sfIBZEgtuTwFtHq5AlB9L8k9a48k7qPn74q2OmgrrgkdwyJ+P2GVTOBVCClAC7w21Wpksso3gw==", - "requires": { - "bip39": "3.0.2", - "create-hmac": "1.1.7", - "tweetnacl": "1.0.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, - "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.2.0.tgz", - "version": "1.2.0" + "engines": { + "node": ">= 6" + } }, - "elliptic": { - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "node_modules/formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "dependencies": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" }, - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "version": "6.5.4" - }, - "emoji-regex": { - "dev": true, - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "version": "8.0.0" + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } }, - "enquirer": { - "dev": true, - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "requires": { - "ansi-colors": "^4.1.1" + "node_modules/formidable/node_modules/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "engines": { + "node": ">=0.6" }, - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "version": "2.3.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "error-ex": { + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "version": "1.3.2" + "engines": { + "node": ">=6 <7 || >=8" + } }, - "es6-promise": { + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "version": "4.2.8" + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "es6-promisify": { + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - }, - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "version": "5.0.0" + "engines": { + "node": ">=6.9.0" + } }, - "escalade": { + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "version": "3.1.1" + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "escape-string-regexp": { + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "dev": true, - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "version": "4.0.0" + "engines": { + "node": "*" + } }, - "eslint": { + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dependencies": { - "eslint-scope": { - "dev": true, - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "version": "7.1.0" - }, - "estraverse": { - "dev": true, - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "version": "5.3.0" - } + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, - "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", - "version": "8.8.0" - }, - "eslint-config-prettier": { - "dev": true, - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "requires": {}, - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "version": "8.5.0" + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "eslint-plugin-prettier": { + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "requires": { - "prettier-linter-helpers": "^1.0.0" + "dependencies": { + "is-glob": "^4.0.3" }, - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "version": "4.0.0" + "engines": { + "node": ">=10.13.0" + } }, - "eslint-scope": { + "node_modules/globals": { + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "dependencies": { + "type-fest": "^0.20.2" }, - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "version": "5.1.1" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "eslint-utils": { + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { - "eslint-visitor-keys": { - "dev": true, - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "version": "2.1.0" - } + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, - "dev": true, - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "requires": { - "eslint-visitor-keys": "^2.0.0" + "engines": { + "node": ">=10" }, - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "version": "3.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "eslint-visitor-keys": { - "dev": true, - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "version": "3.2.0" + "node_modules/google-protobuf": { + "version": "3.19.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.4.tgz", + "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==", + "dev": true }, - "espree": { - "dev": true, - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "version": "9.3.0" + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true }, - "esprima": { + "node_modules/graphql": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.5.0.tgz", + "integrity": "sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==", "dev": true, - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "version": "4.0.1" + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } }, - "esquery": { + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "estraverse": { - "dev": true, - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "version": "5.3.0" - } - }, - "dev": true, - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "requires": { - "estraverse": "^5.1.0" + "function-bind": "^1.1.1" }, - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "version": "1.4.0" + "engines": { + "node": ">= 0.4.0" + } }, - "esrecurse": { - "dependencies": { - "estraverse": { - "dev": true, - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "version": "5.3.0" - } - }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" + "dependencies": { + "ansi-regex": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "version": "4.3.0" + "engines": { + "node": ">=0.10.0" + } }, - "estraverse": { + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "version": "4.3.0" + "engines": { + "node": ">=0.10.0" + } }, - "esutils": { + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "version": "2.0.3" + "engines": { + "node": ">=8" + } }, - "eth-eip712-util-browser": { + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "dependencies": { - "buffer": { - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - }, - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "version": "6.0.3" - } - }, - "integrity": "sha512-RUXQ6Hjl0wEjm/ObWgYKjzMfO1segqcPFGnMPtBkkwGaHGbXXh6WFAn5vZfReK9WWujs35uIW2+kgJmh3FXtww==", - "requires": { - "bn.js": ">4.0.0", - "buffer": "^6.0.3", - "js-sha3": "^0.8.0" + "get-intrinsic": "^1.1.1" }, - "resolved": "https://registry.npmjs.org/eth-eip712-util-browser/-/eth-eip712-util-browser-0.0.3.tgz", - "version": "0.0.3" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ethereum-cryptography": { - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" }, - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "version": "0.1.3" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ethereumjs-util": { + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dependencies": { - "bn.js": { - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "version": "5.2.0" - }, - "rlp": { - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "requires": { - "bn.js": "^5.2.0" - }, - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "version": "2.2.7" - } - }, - "integrity": "sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==", - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz", - "version": "7.1.4" + "engines": { + "node": ">=4" + } }, - "eventemitter3": { - "dev": true, - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "version": "4.0.7" + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } }, - "evp_bytestokey": { - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - }, - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "version": "1.0.3" + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "peer": true, + "bin": { + "he": "bin/he" + } }, - "exit-on-epipe": { - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "version": "1.0.1" + "node_modules/headers-polyfill": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.0.7.tgz", + "integrity": "sha512-JoLCAdCEab58+2/yEmSnOlficyHFpIl0XJqwu3l+Unkm1gXpFUYsThz6Yha3D6tNhocWkCPfyW0YVIGWFqTi7w==", + "dev": true }, - "expect": { - "dev": true, - "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", - "requires": { - "@jest/types": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6" - }, - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", - "version": "27.4.6" + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } }, - "extend": { - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "version": "3.0.2" + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } }, - "extsprintf": { + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "peer": true, - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "version": "1.3.0" + "optional": true, + "peer": true }, - "eyes": { + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "version": "0.1.8" + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "fast-deep-equal": { + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "version": "3.1.3" + "engines": { + "node": ">= 4" + } }, - "fast-diff": { + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "version": "1.2.0" - }, - "fast-glob": { "dependencies": { - "glob-parent": { - "dev": true, - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - }, - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "version": "5.1.2" - } + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, - "dev": true, - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "engines": { + "node": ">=6" }, - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "version": "3.2.11" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "fast-json-stable-stringify": { + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "version": "2.1.0" + "engines": { + "node": ">=0.8.19" + } }, - "fast-levenshtein": { + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "version": "2.0.6" + "engines": { + "node": ">=8" + } }, - "fast-safe-stringify": { + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "version": "2.1.1" + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "fastq": { - "dev": true, - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "version": "1.13.0" + "engines": { + "node": ">=12.0.0" + } }, - "file-entry-cache": { + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" + "dependencies": { + "binary-extensions": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "version": "6.0.1" + "engines": { + "node": ">=8" + } }, - "file-uri-to-path": { + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "version": "1.0.0" + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } }, - "fill-range": { + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" + "dependencies": { + "has": "^1.0.3" }, - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "version": "7.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "find-up": { + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "bin": { + "is-docker": "cli.js" }, - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "version": "5.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "flat": { + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "version": "5.0.2" + "engines": { + "node": ">=0.10.0" + } }, - "flat-cache": { + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" }, - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "version": "3.0.4" + "engines": { + "node": ">=0.10.0" + } }, - "flatted": { + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "version": "3.2.5" + "engines": { + "node": ">=8" + } }, - "follow-redirects": { + "node_modules/is-node-process": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz", + "integrity": "sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "version": "1.14.8" + "engines": { + "node": ">=0.12.0" + } }, - "forever-agent": { + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "peer": true, - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "version": "0.6.1" + "engines": { + "node": ">=8" + } }, - "form-data": { - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" }, - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "version": "2.5.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "formidable": { - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "version": "1.2.6" + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, - "fs.realpath": { + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "engines": { + "node": ">=10" + } + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "dev": true, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "version": "1.0.0" + "peerDependencies": { + "ws": "*" + } }, - "fsevents": { + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true, - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "version": "2.3.2" - }, - "function-bind": { - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "version": "1.1.1" + "peer": true, + "engines": { + "node": ">=8" + } }, - "functional-red-black-tree": { + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "version": "1.0.1" + "optional": true, + "peer": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "get-caller-file": { + "node_modules/istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "version": "2.0.5" + "optional": true, + "peer": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "get-func-name": { + "node_modules/jayson": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz", + "integrity": "sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ==", "dev": true, - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "version": "2.0.0" - }, - "get-intrinsic": { - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "dependencies": { + "@types/connect": "^3.4.33", + "@types/express-serve-static-core": "^4.17.9", + "@types/lodash": "^4.14.159", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "lodash": "^4.17.20", + "uuid": "^8.3.2", + "ws": "^7.4.5" }, - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "version": "1.1.1" + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.45.tgz", + "integrity": "sha512-1Jg2Qv5tuxBqgQV04+wO5u+wmSHbHgpORCJdeCLM+E+YdPElpdHhgywU+M1V1InL8rfOtpqtOjswk+uXTKwx7w==", + "dev": true }, - "getpass": { + "node_modules/jest-diff": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.1.tgz", + "integrity": "sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==", "dev": true, - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "peer": true, - "requires": { - "assert-plus": "^1.0.0" + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" }, - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "version": "0.1.7" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "glob": { + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", "dev": true, - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "version": "7.2.0" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "glob-parent": { + "node_modules/jest-matcher-utils": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz", + "integrity": "sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==", "dev": true, - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" }, - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "version": "6.0.2" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "globals": { + "node_modules/jest-message-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", "dev": true, - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "requires": { - "type-fest": "^0.20.2" + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "version": "13.12.1" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "globby": { + "node_modules/jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", "dev": true, - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "dependencies": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "version": "11.1.0" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "google-protobuf": { + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true, - "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.4.tgz", - "version": "3.19.4" + "engines": { + "node": ">=0.10.0" + } }, - "graceful-fs": { - "dev": true, - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "version": "4.2.9" + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, - "growl": { + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "version": "1.10.5" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "har-schema": { + "node_modules/jscrypto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.3.tgz", + "integrity": "sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==", "dev": true, - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "peer": true, - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "version": "2.0.0" + "bin": { + "jscrypto": "bin/cli.js" + } }, - "har-validator": { + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "peer": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "bin": { + "jsesc": "bin/jsesc" }, - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "version": "5.1.5" + "engines": { + "node": ">=4" + } }, - "has": { - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - }, - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "version": "1.0.3" + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, - "has-ansi": { + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", "dependencies": { - "ansi-regex": { - "dev": true, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "version": "2.1.1" - } - }, + "delimit-stream": "0.1.0" + } + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" + "optional": true, + "dependencies": { + "minimist": "^1.2.0" }, - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "version": "2.0.0" + "bin": { + "json5": "lib/cli.js" + } }, - "has-flag": { + "node_modules/jsonc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", "dev": true, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" - }, - "has-symbols": { - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "version": "1.0.2" - }, - "hash-base": { - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "dependencies": { + "fast-safe-stringify": "^2.0.6", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "parse-json": "^4.0.0", + "strip-bom": "^4.0.0", + "strip-json-comments": "^3.0.1" }, - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "version": "3.1.0" + "engines": { + "node": ">=8" + } }, - "hash.js": { - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - }, - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "version": "1.1.7" + "node_modules/jsonc/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "he": { + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "version": "1.2.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "hmac-drbg": { - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - }, - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "version": "1.0.1" + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] }, - "http-signature": { + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" }, - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "version": "1.2.0" + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } }, - "ieee754": { - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "version": "1.2.1" + "node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } }, - "ignore": { + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", "dev": true, - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "version": "5.2.0" + "dependencies": { + "graceful-fs": "^4.1.11" + } }, - "import-fresh": { + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "version": "3.3.0" - }, - "imurmurhash": { - "dev": true, - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "version": "0.1.4" + "engines": { + "node": ">= 0.8.0" + } }, - "indent-string": { + "node_modules/local-pkg": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.1.tgz", + "integrity": "sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==", "dev": true, - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "version": "4.0.0" + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "inflight": { + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" }, - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "version": "1.0.6" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "inherits": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "version": "2.0.4" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, - "is-arrayish": { - "dev": true, - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "version": "0.2.1" + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, - "is-binary-path": { + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "version": "2.1.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-extglob": { + "node_modules/loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", "dev": true, - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "version": "2.1.1" + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } }, - "is-fullwidth-code-point": { + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", "dev": true, - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "version": "3.0.0" + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } }, - "is-glob": { + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - }, - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "version": "4.0.3" + "engines": { + "node": ">=0.10.0" + } }, - "is-number": { + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "version": "7.0.0" + "engines": { + "node": ">=0.10.0" + } }, - "is-plain-obj": { + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "version": "2.1.0" + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "is-typedarray": { + "node_modules/loglevel-colored-level-prefix/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "peer": true, - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "version": "1.0.0" + "engines": { + "node": ">=0.8.0" + } }, - "is-unicode-supported": { + "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "version": "0.1.0" - }, - "isarray": { - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "version": "1.0.0" + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "isexe": { + "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true, - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "version": "2.0.0" + "engines": { + "node": ">=0.8.0" + } }, - "iso-url": { - "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", - "version": "0.4.7" + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true }, - "isomorphic-ws": { + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", "dev": true, - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "requires": {}, - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "version": "4.0.1" + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "isstream": { + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true, "peer": true, - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "version": "0.1.2" - }, - "jayson": { "dependencies": { - "@types/node": { - "dev": true, - "integrity": "sha512-1Jg2Qv5tuxBqgQV04+wO5u+wmSHbHgpORCJdeCLM+E+YdPElpdHhgywU+M1V1InL8rfOtpqtOjswk+uXTKwx7w==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.45.tgz", - "version": "12.20.45" - } + "semver": "^6.0.0" }, - "dev": true, - "integrity": "sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ==", - "requires": { - "@types/connect": "^3.4.33", - "@types/express-serve-static-core": "^4.17.9", - "@types/lodash": "^4.14.159", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "JSONStream": "^1.3.5", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "uuid": "^8.3.2", - "ws": "^7.4.5" + "engines": { + "node": ">=8" }, - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz", - "version": "3.6.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "jest-diff": { + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" - }, - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", - "version": "27.4.6" + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } }, - "jest-get-type": { - "dev": true, - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "version": "27.4.0" + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, - "jest-matcher-utils": { - "dev": true, - "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.6", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" - }, - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", - "version": "27.4.6" + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "jest-message-util": { + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.6", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", - "version": "27.4.6" + "engines": { + "node": ">= 8" + } }, - "js-sha3": { - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "version": "0.8.0" + "node_modules/merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=", + "dev": true }, - "js-tokens": { - "dev": true, - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "version": "4.0.0" + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, - "js-yaml": { + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" }, - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "version": "4.1.0" + "engines": { + "node": ">=8.6" + } }, - "jsbn": { - "dev": true, - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "peer": true, - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "version": "0.1.1" + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } }, - "jscrypto": { - "dev": true, - "integrity": "sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==", - "resolved": "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.3.tgz", - "version": "1.0.3" + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } }, - "json-parse-better-errors": { - "dev": true, - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "version": "1.0.2" + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } }, - "json-schema": { + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "peer": true, - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "version": "0.4.0" + "engines": { + "node": ">=6" + } }, - "json-schema-traverse": { - "dev": true, - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "version": "0.4.1" + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "json-stable-stringify-without-jsonify": { - "dev": true, - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "version": "1.0.1" + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, - "json-stringify-safe": { + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "version": "5.0.1" - }, - "json-text-sequence": { - "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", - "requires": { - "delimit-stream": "0.1.0" + "dependencies": { + "brace-expansion": "^1.1.7" }, - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "version": "0.1.1" + "engines": { + "node": "*" + } }, - "json5": { - "dev": true, - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "optional": true, - "requires": { - "minimist": "^1.2.0" - }, - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "version": "1.0.1" + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, - "jsonc": { - "dependencies": { - "strip-bom": { - "dev": true, - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "version": "4.0.0" - } - }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", - "requires": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" + "dependencies": { + "minimist": "^1.2.5" }, - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "version": "2.0.0" - }, - "jsonparse": { - "dev": true, - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "version": "1.3.1" + "bin": { + "mkdirp": "bin/cmd.js" + } }, - "jsprim": { + "node_modules/mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "peer": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "version": "1.4.2" - }, - "keccak": { - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "version": "3.0.2" + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } }, - "levn": { + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "version": "0.4.1" + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "locate-path": { + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" }, - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "version": "6.0.0" + "engines": { + "node": ">=10" + } }, - "lodash": { + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "version": "4.17.21" + "peer": true }, - "lodash.merge": { + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "version": "4.6.2" + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "lodash.truncate": { - "dev": true, - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "version": "4.4.2" + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "log-symbols": { + "node_modules/msw": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-0.42.0.tgz", + "integrity": "sha512-vB9rzgiGHoQGfkKpp3QZHxobzfuuQOJk+0bff0wtbK8k3P3CaUSt8bCwvExours682AY4mUfTjIkCsxy0JoS3w==", "dev": true, - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "hasInstallScript": true, + "dependencies": { + "@mswjs/cookies": "^0.2.0", + "@mswjs/interceptors": "^0.16.3", + "@open-draft/until": "^1.0.3", + "@types/cookie": "^0.4.1", + "@types/js-levenshtein": "^1.1.1", + "chalk": "4.1.1", + "chokidar": "^3.4.2", + "cookie": "^0.4.2", + "graphql": "^16.3.0", + "headers-polyfill": "^3.0.4", + "inquirer": "^8.2.0", + "is-node-process": "^1.0.1", + "js-levenshtein": "^1.1.6", + "node-fetch": "^2.6.7", + "outvariant": "^1.3.0", + "path-to-regexp": "^6.2.0", + "statuses": "^2.0.0", + "strict-event-emitter": "^0.2.0", + "type-fest": "^1.2.2", + "yargs": "^17.3.1" }, - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "version": "4.1.0" + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.2.x <= 4.7.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "loglevel": { + "node_modules/msw/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "version": "1.8.0" - }, - "loglevel-colored-level-prefix": { "dependencies": { - "ansi-regex": { - "dev": true, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "version": "2.1.1" - }, - "ansi-styles": { - "dev": true, - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "version": "2.2.1" - }, - "chalk": { - "dev": true, - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "version": "1.1.3" - }, - "escape-string-regexp": { - "dev": true, - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "version": "1.0.5" - }, - "strip-ansi": { - "dev": true, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "version": "3.0.1" - }, - "supports-color": { - "dev": true, - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "version": "2.0.0" - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "dev": true, - "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", - "requires": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" + "engines": { + "node": ">=10" }, - "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", - "version": "1.0.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "long": { + "node_modules/msw/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "version": "4.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "loupe": { + "node_modules/msw/node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, - "integrity": "sha512-QgVamnvj0jX1LMPlCAq0MK6hATORFtGqHoUKXTkwNe13BqlN6aePQCKnnTcFvdDYEEITcJ+gBl4mTW7YJtJbyQ==", - "requires": { - "get-func-name": "^2.0.0" + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.2.tgz", - "version": "2.3.2" + "engines": { + "node": ">=12" + } }, - "lru-cache": { + "node_modules/msw/node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - }, - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "version": "6.0.0" + "engines": { + "node": ">=12" + } }, - "make-error": { - "dev": true, - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "version": "1.3.6" + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, - "md5.js": { - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "version": "1.3.5" + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true }, - "merge2": { + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "version": "1.4.1" + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "merkle-lib": { - "dev": true, - "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "version": "2.0.10" + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, - "methods": { - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "version": "1.1.2" + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, - "micromatch": { + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "dependencies": { + "whatwg-url": "^5.0.0" }, - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "version": "4.0.4" + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } }, - "mime": { - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "version": "1.6.0" + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } }, - "mime-db": { - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "version": "1.51.0" + "node_modules/node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true }, - "mime-types": { - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - }, - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "version": "2.1.34" + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "minimalistic-assert": { - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "version": "1.0.1" + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "minimalistic-crypto-utils": { - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "version": "1.0.1" + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "minimatch": { + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" }, - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "version": "3.0.4" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "minimist": { + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "version": "1.2.5" + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "mkdirp": { + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "version": "0.5.5" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "mocha": { + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "dependencies": { - "ms": { - "dev": true, - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "version": "2.1.3" - }, - "supports-color": { - "dev": true, - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - }, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "version": "8.1.1" - } + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, - "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==", - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.2.0", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" }, - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz", - "version": "9.2.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "ms": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "version": "2.1.2" + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "nan": { + "node_modules/outvariant": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", + "integrity": "sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "version": "2.15.0" + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "nanoid": { + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "version": "3.2.0" + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "natural-compare": { + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "version": "1.4.0" + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node-addon-api": { - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "version": "2.0.2" + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } }, - "node-fetch": { + "node_modules/patch-package": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", + "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", "dev": true, - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.0", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33" }, - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "version": "2.6.7" + "bin": { + "patch-package": "index.js" + }, + "engines": { + "npm": ">5" + } }, - "node-gyp-build": { - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "version": "4.3.0" + "node_modules/patch-package/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "normalize-path": { + "node_modules/patch-package/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "version": "3.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "oauth-sign": { + "node_modules/patch-package/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "version": "0.9.0" + "dependencies": { + "color-name": "1.1.3" + } }, - "object-inspect": { - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "version": "1.12.0" + "node_modules/patch-package/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "once": { + "node_modules/patch-package/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "version": "1.4.0" + "engines": { + "node": ">=4.8" + } }, - "optionator": { + "node_modules/patch-package/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "version": "0.9.1" + "engines": { + "node": ">=0.8.0" + } }, - "p-limit": { + "node_modules/patch-package/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - }, - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "version": "3.1.0" + "engines": { + "node": ">=4" + } }, - "p-locate": { + "node_modules/patch-package/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - }, - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "version": "5.0.0" + "engines": { + "node": ">=4" + } }, - "parent-module": { + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" + "dependencies": { + "glob": "^7.1.3" }, - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "version": "1.0.1" + "bin": { + "rimraf": "bin.js" + } }, - "parse-json": { + "node_modules/patch-package/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "version": "4.0.0" + "bin": { + "semver": "bin/semver" + } }, - "path-exists": { + "node_modules/patch-package/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "version": "4.0.0" + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "path-is-absolute": { + "node_modules/patch-package/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "version": "1.0.1" + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "version": "3.1.1" + "engines": { + "node": ">=6" + } }, - "path-type": { + "node_modules/patch-package/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "version": "4.0.0" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "pathval": { + "node_modules/patch-package/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "version": "1.1.1" + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } }, - "pbkdf2": { - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "node_modules/patch-package/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "version": "3.1.2" + "bin": { + "which": "bin/which" + } }, - "performance-now": { + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "peer": true, - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "version": "2.1.0" + "engines": { + "node": ">=8" + } }, - "picomatch": { + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "version": "2.3.1" + "engines": { + "node": ">=0.10.0" + } }, - "prelude-ls": { + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "version": "1.2.1" + "engines": { + "node": ">=8" + } }, - "prettier": { - "dev": true, - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "version": "2.6.2" + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, - "prettier-eslint": { - "dependencies": { - "@babel/code-frame": { - "dev": true, - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - }, - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "version": "7.12.11" - }, - "@eslint/eslintrc": { - "dev": true, - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "version": "0.4.3" - }, - "@humanwhocodes/config-array": { - "dev": true, - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "version": "0.5.0" - }, - "@typescript-eslint/parser": { - "dev": true, - "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-visitor-keys": "^1.1.0" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", - "version": "3.10.1" - }, - "@typescript-eslint/types": { - "dev": true, - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "version": "3.10.1" - }, - "@typescript-eslint/typescript-estree": { - "dev": true, - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "requires": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "version": "3.10.1" - }, - "@typescript-eslint/visitor-keys": { - "dev": true, - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "version": "3.10.1" - }, - "acorn": { - "dev": true, - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "version": "7.4.1" - }, - "ansi-regex": { - "dev": true, - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "version": "3.0.1" - }, - "ansi-styles": { - "dev": true, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - }, - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "version": "3.2.1" - }, - "argparse": { - "dev": true, - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - }, - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "version": "1.0.10" - }, - "color-convert": { - "dev": true, - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - }, - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "version": "1.9.3" - }, - "color-name": { - "dev": true, - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "version": "1.1.3" - }, - "eslint": { - "dependencies": { - "eslint-visitor-keys": { - "dev": true, - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "version": "2.1.0" - } - }, - "dev": true, - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "version": "7.32.0" - }, - "eslint-utils": { - "dev": true, - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "version": "2.1.0" - }, - "eslint-visitor-keys": { - "dev": true, - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "version": "1.3.0" - }, - "espree": { - "dev": true, - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "version": "7.3.1" - }, - "glob-parent": { - "dev": true, - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - }, - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "version": "5.1.2" - }, - "ignore": { - "dev": true, - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "version": "4.0.6" - }, - "js-yaml": { - "dev": true, - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "version": "3.14.1" - }, - "pretty-format": { - "dev": true, - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "version": "23.6.0" + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - "typescript": { - "dev": true, - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "version": "3.9.10" + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true, - "integrity": "sha512-P5K31qWgUOQCtJL/3tpvEe28KfP49qbr6MTVEXC7I2k7ci55bP3YDr+glhyCdhIzxGCVp2f8eobfQ5so52RIIA==", - "requires": { - "@typescript-eslint/parser": "^3.0.0", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-eslint": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-15.0.1.tgz", + "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.4.2", + "@types/prettier": "^2.6.0", + "@typescript-eslint/parser": "^5.10.0", "common-tags": "^1.4.0", "dlv": "^1.1.0", - "eslint": "^7.9.0", + "eslint": "^8.7.0", "indent-string": "^4.0.0", "lodash.merge": "^4.6.0", "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^2.0.0", + "prettier": "^2.5.1", "pretty-format": "^23.0.1", "require-relative": "^0.8.7", - "typescript": "^3.9.3", - "vue-eslint-parser": "~7.1.0" + "typescript": "^4.5.4", + "vue-eslint-parser": "^8.0.1" }, - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-13.0.0.tgz", - "version": "13.0.0" + "engines": { + "node": ">=10.0.0" + } }, - "prettier-linter-helpers": { + "node_modules/prettier-eslint/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "requires": { - "fast-diff": "^1.1.2" - }, - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "version": "1.0.0" + "engines": { + "node": ">=4" + } }, - "pretty-format": { + "node_modules/prettier-eslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "ansi-styles": { - "dev": true, - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "version": "5.2.0" - } + "color-convert": "^1.9.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier-eslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", - "version": "27.4.6" + "dependencies": { + "color-name": "1.1.3" + } }, - "printj": { - "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", - "version": "1.3.1" + "node_modules/prettier-eslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "process-nextick-args": { - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "version": "2.0.1" + "node_modules/prettier-eslint/node_modules/pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } }, - "progress": { + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "version": "2.0.3" + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } }, - "protobufjs": { + "node_modules/pretty-format": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", + "dev": true, "dependencies": { - "@types/node": { - "dev": true, - "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", - "version": "17.0.17" - } + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/printj": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "requires": { + "dev": true, + "hasInstallScript": true, + "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", @@ -3612,659 +7687,908 @@ "@types/node": ">=13.7.0", "long": "^4.0.0" }, - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "version": "6.11.2" + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } }, - "psl": { - "dev": true, - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "node_modules/protobufjs/node_modules/@types/node": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", + "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "version": "1.8.0" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, - "punycode": { - "dev": true, - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/punycode": { + "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "version": "2.1.1" - }, - "pushdata-bitcoin": { + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", - "requires": { + "dev": true, + "dependencies": { "bitcoin-ops": "^1.3.0" - }, - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "version": "1.0.1" + } }, - "qs": { + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "requires": { + "dependencies": { "side-channel": "^1.0.4" }, - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "version": "6.10.3" + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "queue-microtask": { - "dev": true, - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/queue-microtask": { + "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "version": "1.2.3" - }, - "random-words": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "integrity": "sha512-GwgC+Yu+D5/044grf2QqaYk3ZrQip7yfgvkj/6bJ3H3B3KrE7qoNPbWaYd06hrigqAkrPzNVEpRlnBaNx4bDuA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/random-words": { + "version": "1.1.2", "resolved": "https://registry.npmjs.org/random-words/-/random-words-1.1.2.tgz", - "version": "1.1.2" + "integrity": "sha512-GwgC+Yu+D5/044grf2QqaYk3ZrQip7yfgvkj/6bJ3H3B3KrE7qoNPbWaYd06hrigqAkrPzNVEpRlnBaNx4bDuA==", + "dev": true }, - "randombytes": { + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" - }, - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "version": "2.1.0" + } }, - "react-is": { - "dev": true, - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "version": "17.0.2" + "node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true }, - "readable-stream": { + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "version": "3.6.0" + "engines": { + "node": ">= 6" + } }, - "readdirp": { - "dev": true, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { + "dev": true, + "dependencies": { "picomatch": "^2.2.1" }, - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "version": "3.6.0" + "engines": { + "node": ">=8.10.0" + } }, - "readline-sync": { - "dev": true, - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "node_modules/readline-sync": { + "version": "1.4.10", "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "version": "1.4.10" + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "regenerator-runtime": { + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "version": "0.13.9" + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true }, - "regexpp": { + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "version": "3.2.0" + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } }, - "request": { + "node_modules/regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, "dependencies": { - "form-data": { - "dev": true, - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "peer": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "version": "2.3.3" - }, - "qs": { - "dev": true, - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "peer": true, - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "version": "6.5.3" - }, - "uuid": { - "dev": true, - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "peer": true, - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "version": "3.4.0" - } + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "peer": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "dependencies": { + "jsesc": "~0.5.0" }, - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "version": "2.88.2" + "bin": { + "regjsparser": "bin/parser" + } }, - "request-promise": { + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", - "requires": { + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { "bluebird": "^3.5.0", "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", - "version": "4.2.6" + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } }, - "request-promise-core": { - "dev": true, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { + "dev": true, + "dependencies": { "lodash": "^4.17.19" }, - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "version": "1.1.4" + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } }, - "require-directory": { - "dev": true, - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/require-directory": { + "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "version": "2.1.1" - }, - "require-from-string": { + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "version": "2.0.2" + "engines": { + "node": ">=0.10.0" + } }, - "require-relative": { - "dev": true, - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "node_modules/require-relative": { + "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "version": "0.8.7" + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true }, - "resolve-from": { + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "version": "4.0.0" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "reusify": { + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "version": "1.0.4" + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } }, - "rimraf": { + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { + "dev": true, + "dependencies": { "glob": "^7.1.3" }, - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "version": "3.0.2" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "ripemd160": { + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" - }, - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "version": "2.0.2" + } }, - "rlp": { - "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==", + "node_modules/rlp": { + "version": "3.0.0", "resolved": "https://registry.npmjs.org/rlp/-/rlp-3.0.0.tgz", - "version": "3.0.0" + "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==", + "bin": { + "rlp": "bin/rlp" + } }, - "rpc-websockets": { + "node_modules/rollup": { + "version": "2.75.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz", + "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==", "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rpc-websockets": { + "version": "7.4.17", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.17.tgz", "integrity": "sha512-eolVi/qlXS13viIUH9aqrde902wzSLAai0IjmOZSRefp5I3CSG/vCnD0c0fDSYCWuEyUoRL1BHQA8K1baEUyow==", - "requires": { + "dev": true, + "dependencies": { "@babel/runtime": "^7.11.2", - "bufferutil": "^4.0.1", "circular-json": "^0.5.9", "eventemitter3": "^4.0.7", - "utf-8-validate": "^5.0.2", "uuid": "^8.3.0", "ws": "^7.4.5" }, - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.17.tgz", - "version": "7.4.17" + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } }, - "run-parallel": { + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" - }, - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "version": "1.2.0" + } }, - "safe-buffer": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "version": "5.2.1" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safer-buffer": { - "dev": true, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true, + "node_modules/safer-buffer": { + "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "version": "2.1.2" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, - "scrypt-js": { - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "node_modules/scrypt-js": { + "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "version": "3.0.1" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, - "secp256k1": { + "node_modules/secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "requires": { + "hasInstallScript": true, + "dependencies": { "elliptic": "^6.5.2", "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" }, - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "version": "4.0.2" + "engines": { + "node": ">=10.0.0" + } }, - "seedrandom": { - "dev": true, - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "node_modules/seedrandom": { + "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "version": "3.0.5" + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true }, - "semver": { - "dev": true, - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { "lru-cache": "^6.0.0" }, - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "version": "7.3.5" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "serialize-javascript": { - "dev": true, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { + "dev": true, + "peer": true, + "dependencies": { "randombytes": "^2.1.0" - }, - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "version": "6.0.0" + } }, - "setimmediate": { - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "node_modules/set-cookie-parser": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", + "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "version": "1.0.5" + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, - "sha.js": { + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "version": "2.4.11" + "bin": { + "sha.js": "bin.js" + } }, - "shebang-command": { - "dev": true, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { + "dev": true, + "dependencies": { "shebang-regex": "^3.0.0" }, - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "version": "2.0.0" + "engines": { + "node": ">=8" + } }, - "shebang-regex": { - "dev": true, - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/shebang-regex": { + "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "version": "3.0.0" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "side-channel": { + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { + "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" }, - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "version": "1.0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "slash": { - "dev": true, - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "version": "3.0.0" + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "slice-ansi": { + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "version": "4.0.0" + "engines": { + "node": ">=8" + } }, - "source-map": { - "dev": true, - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/source-map": { + "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "version": "0.6.1" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { + "dev": true, + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "version": "0.5.21" + } }, - "sshpk": { - "dependencies": { - "tweetnacl": { - "dev": true, - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "peer": true, - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "version": "0.14.5" - } - }, + "node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "peer": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "version": "1.17.0" - }, - "stack-utils": { "dependencies": { - "escape-string-regexp": { - "dev": true, - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "version": "2.0.0" - } - }, - "dev": true, - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "requires": { "escape-string-regexp": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "version": "2.0.5" + "engines": { + "node": ">=10" + } }, - "stealthy-require": { + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "version": "1.1.1" + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "string-width": { + "node_modules/strict-event-emitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.4.tgz", + "integrity": "sha512-xIqTLS5azUH1djSUsLH9DbP6UnM/nI18vu8d43JigCQEoVsnY+mrlE+qv6kYqs6/1OkMnMIiL6ffedQSZStuoQ==", "dev": true, + "dependencies": { + "events": "^3.3.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { + "dev": true, + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "version": "4.2.3" - }, - "string_decoder": { - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "version": "1.3.0" + "engines": { + "node": ">=8" + } }, - "strip-ansi": { - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { + "dev": true, + "dependencies": { "ansi-regex": "^5.0.1" }, - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "version": "6.0.1" + "engines": { + "node": ">=8" + } }, - "strip-bom": { + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "optional": true, - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "version": "3.0.0" + "engines": { + "node": ">=4" + } }, - "strip-json-comments": { - "dev": true, - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/strip-json-comments": { + "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "version": "3.1.1" - }, - "superagent": { - "dependencies": { - "debug": { - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - }, - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "version": "3.2.7" - }, - "readable-stream": { - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "version": "2.3.7" - }, - "safe-buffer": { - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "version": "5.1.2" - }, - "string_decoder": { - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "version": "1.1.1" - } + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" }, - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", + "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" }, - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "version": "3.8.3" + "engines": { + "node": ">=6.4.0 <13 || >=14" + } }, - "superstruct": { - "dev": true, - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "node_modules/superstruct": { + "version": "0.14.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "version": "0.14.2" + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "dev": true }, - "supports-color": { - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { + "dev": true, + "dependencies": { "has-flag": "^4.0.0" }, - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" + "engines": { + "node": ">=8" + } }, - "table": { - "dependencies": { - "ajv": { - "dev": true, - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "version": "8.11.0" - }, - "json-schema-traverse": { - "dev": true, - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "version": "1.0.0" - } - }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "engines": { + "node": ">= 0.4" }, - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "version": "6.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "text-encoding-utf-8": { + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", + "optional": true, + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "version": "1.0.2" + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", + "dev": true }, - "text-table": { - "dev": true, - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "node_modules/text-table": { + "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "version": "0.2.0" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, - "through": { - "dev": true, - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "node_modules/through": { + "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "version": "2.3.8" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, - "tiny-secp256k1": { - "dev": true, + "node_modules/tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", - "requires": { + "dev": true, + "hasInstallScript": true, + "dependencies": { "bindings": "^1.3.0", "bn.js": "^4.11.8", "create-hmac": "^1.1.7", "elliptic": "^6.4.0", "nan": "^2.13.2" }, - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "version": "1.1.6" + "engines": { + "node": ">=6.0.0" + } }, - "tmp": { + "node_modules/tinypool": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.1.3.tgz", + "integrity": "sha512-2IfcQh7CP46XGWGGbdyO4pjcKqsmVqFAPcXfPxcPXmOWt9cYkTP9HcDmGgsfijYoAEc4z9qcpM/BaBz46Y9/CQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-0.3.2.tgz", + "integrity": "sha512-2+40EP4D3sFYy42UkgkFFB+kiX2Tg3URG/lVvAZFfLxgGpnWl5qQJuBw1gaLttq8UOS+2p3C0WrhJnQigLTT2Q==", "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { + "dev": true, + "dependencies": { "rimraf": "^3.0.0" }, - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "version": "0.2.1" + "engines": { + "node": ">=8.17.0" + } }, - "to-regex-range": { + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { + "dev": true, + "dependencies": { "is-number": "^7.0.0" }, - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "version": "5.0.1" + "engines": { + "node": ">=8.0" + } }, - "tough-cookie": { - "dev": true, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { + "dev": true, + "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" }, - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "version": "2.5.0" + "engines": { + "node": ">=0.8" + } }, - "tr46": { - "dev": true, - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "node_modules/tr46": { + "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "version": "0.0.3" + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true }, - "ts-mocha": { + "node_modules/ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", "dev": true, - "integrity": "sha512-WyQjvnzwrrubl0JT7EC1yWmNpcsU3fOuBFfdps30zbmFBgKniSaSOyZMZx+Wq7kytUs5CY+pEbSYEbGfIKnXTw==", - "requires": { - "ts-node": "7.0.1", + "dependencies": { + "ts-node": "7.0.1" + }, + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "optionalDependencies": { "tsconfig-paths": "^3.5.0" }, - "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-9.0.2.tgz", - "version": "9.0.2" + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X" + } }, - "ts-node": { - "dependencies": { - "diff": { - "dev": true, - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "version": "3.5.0" - } - }, - "dev": true, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "requires": { + "dev": true, + "dependencies": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", "diff": "^3.1.0", @@ -4274,237 +8598,488 @@ "source-map-support": "^0.5.6", "yn": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "version": "7.0.1" + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } }, - "tsconfig-paths": { + "node_modules/ts-node/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", "optional": true, - "requires": { + "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "version": "3.12.0" + } }, - "tslib": { - "dev": true, - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/tslib": { + "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "version": "1.14.1" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, - "tsutils": { - "dev": true, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "requires": { + "dev": true, + "dependencies": { "tslib": "^1.8.1" }, - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "version": "3.21.0" + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true }, - "tunnel-agent": { + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "peer": true, - "requires": { - "safe-buffer": "^5.0.1" + "dependencies": { + "prelude-ls": "^1.2.1" }, - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "version": "0.6.0" + "engines": { + "node": ">= 0.8.0" + } }, - "tweetnacl": { + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "version": "1.0.3" + "engines": { + "node": ">=4" + } }, - "type-check": { + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" + "engines": { + "node": ">=10" }, - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "version": "0.4.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "type-detect": { + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", + "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", "dev": true, - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "version": "4.0.8" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "type-fest": { + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "version": "0.20.2" + "engines": { + "node": ">=4" + } }, - "typeforce": { + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "version": "1.18.0" + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "typescript": { + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true, - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "version": "4.5.5" + "engines": { + "node": ">=4" + } }, - "uri-js": { + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { + "dev": true, + "dependencies": { "punycode": "^2.1.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz", + "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" }, - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "version": "4.4.1" + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", + "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/vite": { + "version": "2.9.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz", + "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.15.1.tgz", + "integrity": "sha512-NaNFi93JKSuvV4YGnfQ0l0GKYxH0EsLcTrrXaCzd6qfVEZM/RJpjwSevg6waNFqu2DyN6e0aHHdrCZW5/vh5NA==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.1", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "chai": "^4.3.6", + "debug": "^4.3.4", + "local-pkg": "^0.4.1", + "tinypool": "^0.1.3", + "tinyspy": "^0.3.2", + "vite": "^2.9.12" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vitest/ui": "*", + "c8": "*", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@vitest/ui": { + "optional": true + }, + "c8": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } }, - "utf-8-validate": { + "node_modules/vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", "dev": true, - "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==", - "requires": { - "node-gyp-build": "^4.3.0" + "dependencies": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" }, - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz", - "version": "5.0.8" - }, - "util-deprecate": { - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "version": "1.0.2" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } }, - "uuid": { + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "version": "8.3.2" + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, - "v8-compile-cache": { + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "version": "2.3.0" + "engines": { + "node": ">=4.0" + } }, - "varuint-bitcoin": { + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "dev": true, - "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", - "requires": { - "safe-buffer": "^5.1.1" - }, - "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", - "version": "1.1.2" - }, - "verror": { "dependencies": { - "core-util-is": { - "dev": true, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "peer": true, - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "version": "1.0.2" - } - }, - "dev": true, - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "version": "1.10.0" + "defaults": "^1.0.3" + } }, - "webidl-conversions": { - "dev": true, - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "node_modules/webidl-conversions": { + "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "version": "3.0.1" + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true }, - "whatwg-url": { - "dev": true, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { + "dev": true, + "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" - }, - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "version": "5.0.0" + } }, - "which": { - "dev": true, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { + "dev": true, + "dependencies": { "isexe": "^2.0.0" }, - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "version": "2.0.2" + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } }, - "wif": { - "dev": true, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", - "requires": { + "dev": true, + "dependencies": { "bs58check": "<3.0.0" - }, - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "version": "2.0.6" + } }, - "word-wrap": { - "dev": true, - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/word-wrap": { + "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "version": "1.2.3" - }, - "workerpool": { + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "version": "6.2.0" + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true, + "peer": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { + "dev": true, + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "version": "7.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "wrappy": { - "dev": true, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "node_modules/wrappy": { + "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "version": "1.0.2" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "ws": { - "dev": true, - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "requires": {}, + "node_modules/ws": { + "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "version": "7.5.7" - }, - "y18n": { + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true, - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "version": "5.0.8" + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "yallist": { + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "version": "4.0.0" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yargs": { - "dev": true, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { + "dev": true, + "peer": true, + "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -4513,4900 +9088,5611 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" }, - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "version": "16.2.0" + "engines": { + "node": ">=10" + } }, - "yargs-parser": { - "dev": true, - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "node_modules/yargs-parser": { + "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "version": "20.2.4" - }, - "yargs-unparser": { + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "requires": { + "dev": true, + "peer": true, + "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" }, - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "version": "2.0.0" + "engines": { + "node": ">=10" + } }, - "yn": { - "dev": true, - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "node_modules/yn": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "version": "2.0.0" - }, - "yocto-queue": { + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", "dev": true, - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "version": "0.1.0" - } - }, - "lockfileVersion": 2, - "name": "gridplus-sdk", - "packages": { - "": { - "dependencies": { - "@ethereumjs/common": "2.4.0", - "@ethereumjs/tx": "3.3.0", - "aes-js": "^3.1.1", - "bech32": "^2.0.0", - "bignumber.js": "^9.0.1", - "bitwise": "^2.0.4", - "borc": "^2.1.2", - "bs58check": "^2.1.2", - "buffer": "^5.6.0", - "crc-32": "^1.2.0", - "elliptic": "6.5.4", - "eth-eip712-util-browser": "^0.0.3", - "hash.js": "^1.1.7", - "js-sha3": "^0.8.0", - "rlp": "^3.0.0", - "secp256k1": "4.0.2", - "superagent": "^3.8.3" - }, - "devDependencies": { - "@ethersproject/abi": "^5.5.0", - "@ethersproject/transactions": "^5.5.0", - "@solana/web3.js": "^1.34.0", - "@terra-money/terra.js": "^3.0.7", - "@types/expect": "^24.3.0", - "@types/mocha": "^9.0.0", - "@types/superagent": "^4.1.15", - "@typescript-eslint/eslint-plugin": "^5.10.0", - "@typescript-eslint/parser": "^5.10.0", - "acorn": ">=6.4.1", - "bip32": "^1.0.4", - "bip39": "^3.0.2", - "bitcoinjs-lib": "4.0.3", - "chai": "^4.2.0", - "dotenv": "^16.0.0", - "ed25519-hd-key": "^1.2.0", - "eslint": "^8.7.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "ethereumjs-util": "^7.1.4", - "jsonc": "^2.0.0", - "lodash": ">=4.17.21", - "minimist": ">=0.2.1", - "mocha": "^9.2.0", - "prettier": "^2.6.2", - "prettier-eslint": "^13.0.0", - "random-words": "^1.1.1", - "readline-sync": "^1.4.9", - "request-promise": "^4.2.6", - "seedrandom": "^3.0.5", - "ts-mocha": "^9.0.2", - "typescript": "^4.5.4" - }, - "license": "MIT", - "name": "gridplus-sdk", - "version": "2.0.0" + "engines": { + "node": ">=4" + } }, - "node_modules/@babel/code-frame": { - "dependencies": { - "@babel/highlight": "^7.16.7" - }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "peer": true, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "version": "7.16.7" + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "dev": true + }, + "@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "node_modules/@babel/helper-validator-identifier": { + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, - "engines": { - "node": ">=6.9.0" + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" }, - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "version": "7.16.7" - }, - "node_modules/@babel/highlight": { "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "version": "7.16.10" + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^1.9.0" - }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "version": "3.2.1" + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "@babel/helper-compilation-targets": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, - "engines": { - "node": ">=4" + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" }, - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "version": "2.4.2" - }, - "node_modules/@babel/highlight/node_modules/color-convert": { "dependencies": { - "color-name": "1.1.3" - }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "version": "1.9.3" + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } }, - "node_modules/@babel/highlight/node_modules/color-name": { + "@babel/helper-create-regexp-features-plugin": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dev": true, - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "version": "1.1.3" + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + } }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, - "engines": { - "node": ">=0.8.0" + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "version": "1.0.5" + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "node_modules/@babel/highlight/node_modules/has-flag": { + "@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "dependencies": { - "has-flag": "^3.0.0" - }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } }, - "node_modules/@babel/runtime": { - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", - "version": "7.17.2" + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/@eslint/eslintrc": { - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, + "@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "version": "1.0.5" + "requires": { + "@babel/types": "^7.17.0" + } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, - "engines": { - "node": ">= 4" - }, - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "version": "4.0.6" + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/@ethereumjs/common": { - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.0" - }, - "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz", - "version": "2.4.0" + "@babel/helper-module-transforms": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" + } }, - "node_modules/@ethereumjs/tx": { - "dependencies": { - "@ethereumjs/common": "^2.4.0", - "ethereumjs-util": "^7.1.0" - }, - "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz", - "version": "3.3.0" + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } }, - "node_modules/@ethersproject/abi": { - "dependencies": { - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/hash": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" - }, + "@babel/helper-plugin-utils": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + } }, - "node_modules/@ethersproject/abstract-provider": { - "dependencies": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/networks": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/transactions": "^5.5.0", - "@ethersproject/web": "^5.5.0" - }, + "@babel/helper-replace-supers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", - "version": "5.5.1" + "requires": { + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + } }, - "node_modules/@ethersproject/abstract-signer": { - "dependencies": { - "@ethersproject/abstract-provider": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0" - }, + "@babel/helper-simple-access": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/types": "^7.18.2" + } }, - "node_modules/@ethersproject/address": { - "dependencies": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/rlp": "^5.5.0" - }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/types": "^7.16.0" + } }, - "node_modules/@ethersproject/base64": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0" - }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true }, - "node_modules/@ethersproject/bignumber": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "bn.js": "^4.11.9" - }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + } }, - "node_modules/@ethersproject/bytes": { - "dependencies": { - "@ethersproject/logger": "^5.5.0" - }, + "@babel/helpers": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" + } }, - "node_modules/@ethersproject/constants": { - "dependencies": { - "@ethersproject/bignumber": "^5.5.0" - }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } - ], - "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", - "version": "5.5.0" + } }, - "node_modules/@ethersproject/hash": { - "dependencies": { - "@ethersproject/abstract-signer": "^5.5.0", - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" - }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@ethersproject/keccak256": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "js-sha3": "0.8.0" - }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.17.12" + } }, - "node_modules/@ethersproject/logger": { + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } }, - "node_modules/@ethersproject/networks": { - "dependencies": { - "@ethersproject/logger": "^5.5.0" - }, + "@babel/plugin-proposal-class-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", - "version": "5.5.2" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@ethersproject/properties": { - "dependencies": { - "@ethersproject/logger": "^5.5.0" - }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } }, - "node_modules/@ethersproject/rlp": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0" - }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } }, - "node_modules/@ethersproject/sha2": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "hash.js": "1.1.7" - }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } }, - "node_modules/@ethersproject/signing-key": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - }, + "@babel/plugin-proposal-json-strings": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } }, - "node_modules/@ethersproject/strings": { - "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/logger": "^5.5.0" - }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } }, - "node_modules/@ethersproject/transactions": { - "dependencies": { - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/rlp": "^5.5.0", - "@ethersproject/signing-key": "^5.5.0" - }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", - "version": "5.5.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } }, - "node_modules/@ethersproject/web": { - "dependencies": { - "@ethersproject/base64": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" - }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", - "version": "5.5.1" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } }, - "node_modules/@humanwhocodes/config-array": { - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, - "engines": { - "node": ">=10.10.0" - }, - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "version": "0.9.3" + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.17.12" + } }, - "node_modules/@humanwhocodes/object-schema": { + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "version": "1.2.1" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } }, - "node_modules/@jest/types": { - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz", - "version": "27.4.2" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } }, - "node_modules/@nodelib/fs.scandir": { - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "@babel/plugin-proposal-private-methods": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "version": "2.1.5" + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@nodelib/fs.stat": { + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "version": "2.0.5" + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } }, - "node_modules/@nodelib/fs.walk": { - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "version": "1.2.8" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@protobufjs/aspromise": { + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "version": "1.1.2" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@protobufjs/base64": { + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "version": "1.1.2" + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } }, - "node_modules/@protobufjs/codegen": { + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "version": "2.0.4" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } }, - "node_modules/@protobufjs/eventemitter": { + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "version": "1.1.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@protobufjs/fetch": { - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "version": "1.1.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } }, - "node_modules/@protobufjs/float": { + "@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", "dev": true, - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "version": "1.0.2" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@protobufjs/inquire": { + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "version": "1.1.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@protobufjs/path": { + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "version": "1.1.2" + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "node_modules/@protobufjs/pool": { + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "version": "1.1.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@protobufjs/utf8": { + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "version": "1.1.0" + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "node_modules/@solana/buffer-layout": { - "dependencies": { - "buffer": "~6.0.3" - }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "engines": { - "node": ">=5.10" - }, - "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@solana/buffer-layout/node_modules/buffer": { - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "version": "6.0.3" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@solana/web3.js": { - "dependencies": { - "@babel/runtime": "^7.12.5", - "@ethersproject/sha2": "^5.5.0", - "@solana/buffer-layout": "^3.0.0", - "bn.js": "^5.0.0", - "borsh": "^0.4.0", - "bs58": "^4.0.1", - "buffer": "6.0.1", - "cross-fetch": "^3.1.4", - "jayson": "^3.4.4", - "js-sha3": "^0.8.0", - "rpc-websockets": "^7.4.2", - "secp256k1": "^4.0.2", - "superstruct": "^0.14.2", - "tweetnacl": "^1.0.0" - }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "engines": { - "node": ">=12.20.0" - }, - "integrity": "sha512-6QvqN2DqEELvuV+5yUQM8P9fRiSG+6SzQ58HjumJqODu14r7eu5HXVWEymvKAvMLGME+0TmAdJHjw9xD5NgUWA==", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.34.0.tgz", - "version": "1.34.0" + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "node_modules/@solana/web3.js/node_modules/bn.js": { + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "version": "5.2.0" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } }, - "node_modules/@solana/web3.js/node_modules/buffer": { - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "version": "6.0.1" + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } }, - "node_modules/@terra-money/terra.js": { - "dependencies": { - "@terra-money/terra.proto": "^0.1.7", - "axios": "^0.24.0", - "bech32": "^2.0.0", - "bip32": "^2.0.6", - "bip39": "^3.0.3", - "bufferutil": "^4.0.3", - "decimal.js": "^10.2.1", - "jscrypto": "^1.0.1", - "readable-stream": "^3.6.0", - "secp256k1": "^4.0.2", - "tmp": "^0.2.1", - "utf-8-validate": "^5.0.5", - "ws": "^7.5.5" - }, + "@babel/plugin-syntax-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", + "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dev": true, - "engines": { - "node": ">=14" - }, - "integrity": "sha512-moeVBWqIPZaV0HmCY127Y9H/MsuFtH1VgW0xEvDQWqu1jpKhK5CtPHMLKNje3mKSjU8A7vXZ8hlW3KobqP2poQ==", - "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.7.tgz", - "version": "3.0.7" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@terra-money/terra.js/node_modules/@types/node": { + "@babel/plugin-transform-async-to-generator": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dev": true, - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "version": "10.12.18" + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8" + } }, - "node_modules/@terra-money/terra.js/node_modules/bip32": { - "dependencies": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", - "version": "2.0.6" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@terra-money/terra.proto": { - "dependencies": { - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" - }, + "@babel/plugin-transform-block-scoping": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", + "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", "dev": true, - "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", - "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", - "version": "0.1.7" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/bn.js": { - "dependencies": { - "@types/node": "*" + "@babel/plugin-transform-classes": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", + "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" }, - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "version": "5.1.0" - }, - "node_modules/@types/connect": { "dependencies": { - "@types/node": "*" - }, - "dev": true, - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "version": "3.4.35" + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } }, - "node_modules/@types/cookiejar": { + "@babel/plugin-transform-computed-properties": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dev": true, - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "version": "2.1.2" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/eslint-visitor-keys": { + "@babel/plugin-transform-destructuring": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "version": "1.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/expect": { - "dependencies": { - "expect": "*" - }, - "deprecated": "This is a stub types definition. expect provides its own type definitions, so you do not need this installed.", + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, - "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", - "version": "24.3.0" + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@types/express-serve-static-core": { - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dev": true, - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "version": "4.17.28" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/istanbul-lib-coverage": { + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "version": "2.0.4" + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@types/istanbul-lib-report": { - "dependencies": { - "@types/istanbul-lib-coverage": "*" - }, + "@babel/plugin-transform-for-of": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/istanbul-reports": { - "dependencies": { - "@types/istanbul-lib-report": "*" - }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "version": "3.0.1" + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@types/json-schema": { + "@babel/plugin-transform-literals": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dev": true, - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "version": "7.0.9" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/json5": { + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "optional": true, - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "version": "0.0.29" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@types/lodash": { + "@babel/plugin-transform-modules-amd": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "version": "4.14.178" + "requires": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "node_modules/@types/long": { + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "version": "4.0.1" + "requires": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "node_modules/@types/mocha": { + "@babel/plugin-transform-modules-systemjs": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", + "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", "dev": true, - "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", - "version": "9.1.0" + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "node_modules/@types/node": { - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "version": "11.11.6" + "@babel/plugin-transform-modules-umd": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/pbkdf2": { - "dependencies": { - "@types/node": "*" - }, - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "version": "3.1.0" + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/qs": { + "@babel/plugin-transform-new-target": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "dev": true, - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "version": "6.9.7" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/range-parser": { + "@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "version": "1.2.4" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + } }, - "node_modules/@types/secp256k1": { - "dependencies": { - "@types/node": "*" - }, - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "version": "4.0.3" + "@babel/plugin-transform-parameters": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/stack-utils": { + "@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "version": "2.0.1" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@types/superagent": { - "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" - }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, - "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", - "version": "4.1.15" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "regenerator-transform": "^0.15.0" + } }, - "node_modules/@types/ws": { - "dependencies": { - "@types/node": "*" - }, + "@babel/plugin-transform-reserved-words": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "dev": true, - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "version": "7.4.7" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } }, - "node_modules/@types/yargs": { - "dependencies": { - "@types/yargs-parser": "*" - }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "version": "16.0.4" + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, - "node_modules/@types/yargs-parser": { + "@babel/plugin-transform-spread": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "dev": true, - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "version": "20.2.1" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "dependencies": { - "@typescript-eslint/scope-manager": "5.10.2", - "@typescript-eslint/type-utils": "5.10.2", - "@typescript-eslint/utils": "5.10.2", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==", - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", + "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-typescript": "^7.17.12" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/preset-env": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.2", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", - "version": "5.10.2" + } }, - "node_modules/@typescript-eslint/experimental-utils": { - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", - "peerDependencies": { - "eslint": "*" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { + "@babel/preset-typescript": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", + "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.17.12" + } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { - "dependencies": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, + "@babel/runtime": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz", + "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "peerDependenciesMeta": { - "typescript": { - "optional": true + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true } + } + }, + "@babel/types": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "optional": true, + "peer": true + }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "version": "3.10.1" - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@ethereumjs/common": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz", + "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==", + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.0" + } + }, + "@ethereumjs/tx": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz", + "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==", + "requires": { + "@ethereumjs/common": "^2.4.0", + "ethereumjs-util": "^7.1.0" + } + }, + "@ethersproject/abi": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", + "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, + "@ethersproject/abstract-provider": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", + "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "version": "2.1.0" + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/networks": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/web": "^5.5.0" + } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-visitor-keys": { + "@ethersproject/abstract-signer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", + "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "version": "1.3.0" + "requires": { + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0" + } }, - "node_modules/@typescript-eslint/parser": { - "dependencies": { - "@typescript-eslint/scope-manager": "5.10.2", - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/typescript-estree": "5.10.2", - "debug": "^4.3.2" - }, + "@ethersproject/address": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", + "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==", - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/rlp": "^5.5.0" + } }, - "node_modules/@typescript-eslint/scope-manager": { - "dependencies": { - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/visitor-keys": "5.10.2" - }, + "@ethersproject/base64": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", + "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/bytes": "^5.5.0" + } }, - "node_modules/@typescript-eslint/type-utils": { - "dependencies": { - "@typescript-eslint/utils": "5.10.2", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, + "@ethersproject/bignumber": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", + "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==", - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "bn.js": "^4.11.9" + } }, - "node_modules/@typescript-eslint/types": { + "@ethersproject/bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", + "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/logger": "^5.5.0" + } }, - "node_modules/@typescript-eslint/typescript-estree": { - "dependencies": { - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/visitor-keys": "5.10.2", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, + "@ethersproject/constants": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", + "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==", - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/bignumber": "^5.5.0" + } }, - "node_modules/@typescript-eslint/utils": { - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.2", - "@typescript-eslint/types": "5.10.2", - "@typescript-eslint/typescript-estree": "5.10.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, + "@ethersproject/hash": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", + "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==", - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } }, - "node_modules/@typescript-eslint/visitor-keys": { - "dependencies": { - "@typescript-eslint/types": "5.10.2", - "eslint-visitor-keys": "^3.0.0" - }, + "@ethersproject/keccak256": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", + "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", - "version": "5.10.2" + "requires": { + "@ethersproject/bytes": "^5.5.0", + "js-sha3": "0.8.0" + } + }, + "@ethersproject/logger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", + "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", + "dev": true + }, + "@ethersproject/networks": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", + "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", + "dev": true, + "requires": { + "@ethersproject/logger": "^5.5.0" + } }, - "node_modules/@ungap/promise-all-settled": { + "@ethersproject/properties": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", + "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", "dev": true, - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "version": "1.1.2" + "requires": { + "@ethersproject/logger": "^5.5.0" + } }, - "node_modules/JSONStream": { - "bin": { - "JSONStream": "bin.js" - }, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, + "@ethersproject/rlp": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", + "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "version": "1.3.5" + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } }, - "node_modules/acorn": { - "bin": { - "acorn": "bin/acorn" - }, + "@ethersproject/sha2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", + "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", "dev": true, - "engines": { - "node": ">=0.4.0" - }, - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "version": "8.7.0" + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "hash.js": "1.1.7" + } }, - "node_modules/acorn-jsx": { + "@ethersproject/signing-key": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", + "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", "dev": true, - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "version": "5.3.2" + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } }, - "node_modules/aes-js": { - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "version": "3.1.2" + "@ethersproject/strings": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", + "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } }, - "node_modules/ajv": { - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, + "@ethersproject/transactions": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", + "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - }, - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "version": "6.12.6" + "requires": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0" + } }, - "node_modules/ansi-colors": { + "@ethersproject/web": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", + "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", "dev": true, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "version": "4.1.1" + "requires": { + "@ethersproject/base64": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } }, - "node_modules/ansi-regex": { + "@humanwhocodes/config-array": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "version": "5.0.1" + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } }, - "node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^2.0.1" - }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - }, - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "version": "4.3.0" + "optional": true, + "peer": true }, - "node_modules/anymatch": { - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "@jest/expect-utils": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.1.tgz", + "integrity": "sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw==", "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "version": "3.1.2" + "requires": { + "jest-get-type": "^28.0.2" + } }, - "node_modules/argparse": { + "@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", "dev": true, - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "version": "2.0.1" + "requires": { + "@sinclair/typebox": "^0.23.3" + } }, - "node_modules/array-union": { + "@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "version": "2.1.0" + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } }, - "node_modules/arrify": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "version": "1.0.1" + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "node_modules/asn1": { - "dependencies": { - "safer-buffer": "~2.1.0" - }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", "dev": true, - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "version": "0.2.6" + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "node_modules/assert-plus": { + "@mswjs/cookies": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.1.tgz", + "integrity": "sha512-0tDfcPw5/s7QsNQqS3knAvAD5w5PF1nNPagRhKO/yECY+sMbJxoC2sLWnH7Lzmh52mTSVLKDhd1r92Q3kfljnQ==", "dev": true, - "engines": { - "node": ">=0.8" - }, - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "peer": true, - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "version": "1.0.0" + "requires": { + "@types/set-cookie-parser": "^2.4.0", + "set-cookie-parser": "^2.4.6" + } }, - "node_modules/assertion-error": { + "@mswjs/interceptors": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.16.4.tgz", + "integrity": "sha512-McPKUFlZNS/wo+OAor15k0fv2skK+EdWl9CEcdxAqsN4vKajlxCxDU4B5W/pn1y0TJPSAOmxR6LYFe/8esePrg==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "version": "1.1.0" + "requires": { + "@open-draft/until": "^1.0.3", + "@xmldom/xmldom": "^0.7.5", + "debug": "^4.3.3", + "headers-polyfill": "^3.0.4", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.2.4" + } }, - "node_modules/astral-regex": { + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "version": "2.0.0" + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } }, - "node_modules/asynckit": { - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "version": "0.4.0" + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true }, - "node_modules/aws-sign2": { + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "peer": true, - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "version": "0.7.0" + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } }, - "node_modules/aws4": { - "dev": true, - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "peer": true, - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "version": "1.11.0" + "@open-draft/until": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", + "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==", + "dev": true }, - "node_modules/axios": { - "dependencies": { - "follow-redirects": "^1.14.4" - }, - "dev": true, - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "version": "0.24.0" + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true }, - "node_modules/balanced-match": { + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "dev": true, - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "version": "1.0.2" + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true }, - "node_modules/base-x": { - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "version": "3.0.9" + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true }, - "node_modules/base64-js": { - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "version": "1.5.1" + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true }, - "node_modules/bcrypt-pbkdf": { - "dependencies": { - "tweetnacl": "^0.14.3" - }, - "dev": true, - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "peer": true, - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "version": "1.0.2" + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "dev": true, - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "peer": true, - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "version": "0.14.5" + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true }, - "node_modules/bech32": { - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "version": "2.0.0" + "@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true }, - "node_modules/bignumber.js": { - "engines": { - "node": "*" + "@solana/buffer-layout": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", + "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", + "dev": true, + "requires": { + "buffer": "~6.0.3" }, - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "version": "9.0.2" + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } }, - "node_modules/binary-extensions": { + "@solana/web3.js": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.34.0.tgz", + "integrity": "sha512-6QvqN2DqEELvuV+5yUQM8P9fRiSG+6SzQ58HjumJqODu14r7eu5HXVWEymvKAvMLGME+0TmAdJHjw9xD5NgUWA==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "@babel/runtime": "^7.12.5", + "@ethersproject/sha2": "^5.5.0", + "@solana/buffer-layout": "^3.0.0", + "bn.js": "^5.0.0", + "borsh": "^0.4.0", + "bs58": "^4.0.1", + "buffer": "6.0.1", + "cross-fetch": "^3.1.4", + "jayson": "^3.4.4", + "js-sha3": "^0.8.0", + "rpc-websockets": "^7.4.2", + "secp256k1": "^4.0.2", + "superstruct": "^0.14.2", + "tweetnacl": "^1.0.0" }, - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "version": "2.2.0" - }, - "node_modules/bindings": { "dependencies": { - "file-uri-to-path": "1.0.0" - }, - "dev": true, - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "version": "1.5.0" + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } }, - "node_modules/bip32": { - "dependencies": { - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, + "@terra-money/terra.js": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.7.tgz", + "integrity": "sha512-moeVBWqIPZaV0HmCY127Y9H/MsuFtH1VgW0xEvDQWqu1jpKhK5CtPHMLKNje3mKSjU8A7vXZ8hlW3KobqP2poQ==", "dev": true, - "engines": { - "node": ">=6.0.0" + "requires": { + "@terra-money/terra.proto": "^0.1.7", + "axios": "^0.24.0", + "bech32": "^2.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.3", + "bufferutil": "^4.0.3", + "decimal.js": "^10.2.1", + "jscrypto": "^1.0.1", + "readable-stream": "^3.6.0", + "secp256k1": "^4.0.2", + "tmp": "^0.2.1", + "utf-8-validate": "^5.0.5", + "ws": "^7.5.5" }, - "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", - "version": "1.0.4" - }, - "node_modules/bip39": { "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dev": true, - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "version": "3.0.4" + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true + }, + "bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "dev": true, + "requires": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + } + } + } }, - "node_modules/bip66": { - "dependencies": { - "safe-buffer": "^5.0.1" - }, + "@terra-money/terra.proto": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", + "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", "dev": true, - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "version": "1.1.5" + "requires": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } }, - "node_modules/bitcoin-ops": { - "dev": true, - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "version": "1.4.1" + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "requires": { + "@types/node": "*" + } }, - "node_modules/bitcoinjs-lib": { - "dependencies": { - "bech32": "^1.1.2", - "bip32": "^1.0.0", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.1", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - }, - "dev": true, - "engines": { - "node": ">=8.0.0" - }, - "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", - "version": "4.0.3" + "@types/chai": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz", + "integrity": "sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==", + "dev": true }, - "node_modules/bitcoinjs-lib/node_modules/bech32": { + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", "dev": true, - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "version": "1.1.4" - }, - "node_modules/bitwise": { - "integrity": "sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ==", - "resolved": "https://registry.npmjs.org/bitwise/-/bitwise-2.1.0.tgz", - "version": "2.1.0" - }, - "node_modules/blakejs": { - "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", - "version": "1.1.1" + "requires": { + "@types/chai": "*" + } }, - "node_modules/bluebird": { + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "version": "3.7.2" + "requires": { + "@types/node": "*" + } }, - "node_modules/bn.js": { - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "version": "4.12.0" + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true }, - "node_modules/borc": { - "dependencies": { - "bignumber.js": "^9.0.0", - "buffer": "^5.5.0", - "commander": "^2.15.0", - "ieee754": "^1.1.13", - "iso-url": "~0.4.7", - "json-text-sequence": "~0.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", - "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", - "version": "2.1.2" + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true }, - "node_modules/borsh": { - "dependencies": { - "@types/bn.js": "^4.11.5", - "bn.js": "^5.0.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - }, + "@types/elliptic": { + "version": "6.4.14", + "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.14.tgz", + "integrity": "sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ==", + "dev": true, + "requires": { + "@types/bn.js": "*" + } + }, + "@types/eslint": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", + "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", "dev": true, - "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", - "version": "0.4.0" + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } }, - "node_modules/borsh/node_modules/@types/bn.js": { - "dependencies": { - "@types/node": "*" - }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/expect": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", + "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", "dev": true, - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "version": "4.11.6" + "requires": { + "expect": "*" + } }, - "node_modules/borsh/node_modules/bn.js": { + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "version": "5.2.0" + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } }, - "node_modules/brace-expansion": { - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "version": "1.1.11" + "requires": { + "@types/istanbul-lib-coverage": "*" + } }, - "node_modules/braces": { - "dependencies": { - "fill-range": "^7.0.1" - }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "version": "3.0.2" + "requires": { + "@types/istanbul-lib-report": "*" + } }, - "node_modules/brorand": { - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "version": "1.1.0" + "@types/js-levenshtein": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", + "integrity": "sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==", + "dev": true }, - "node_modules/browser-stdout": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "version": "1.3.1" + "optional": true }, - "node_modules/browserify-aes": { - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "version": "1.2.0" + "@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "dev": true }, - "node_modules/bs58": { - "dependencies": { - "base-x": "^3.0.2" - }, - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "version": "4.0.1" + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "dev": true }, - "node_modules/bs58check": { - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - }, - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "version": "2.1.2" + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" }, - "node_modules/buffer": { - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "version": "5.7.1" + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "requires": { + "@types/node": "*" + } }, - "node_modules/buffer-from": { - "dev": true, - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "version": "1.1.2" + "@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true }, - "node_modules/buffer-xor": { - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "version": "1.0.3" + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true }, - "node_modules/bufferutil": { - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "dev": true, - "engines": { - "node": ">=6.14.2" - }, - "hasInstallScript": true, - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "version": "4.0.6" + "@types/random-words": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/random-words/-/random-words-1.1.2.tgz", + "integrity": "sha512-gULpJ68bNovfBWPWNNhwJgd/GcKdfkPpXXQGgACQWffgy6LRiJB4+4s/IslhFJKQvb5wBlnlOwFJ6RawHU5z3A==", + "dev": true }, - "node_modules/call-bind": { - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "version": "1.0.2" + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true }, - "node_modules/callsites": { + "@types/readline-sync": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@types/readline-sync/-/readline-sync-1.4.4.tgz", + "integrity": "sha512-cFjVIoiamX7U6zkO2VPvXyTxbFDdiRo902IarJuPVxBhpDnXhwSaVE86ip+SCuyWBbEioKCkT4C88RNTxBM1Dw==", + "dev": true + }, + "@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "requires": { + "@types/node": "*" + } + }, + "@types/seedrandom": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.2.tgz", + "integrity": "sha512-YPLqEOo0/X8JU3rdiq+RgUKtQhQtrppE766y7vMTu8dGML7TVtZNiiiaC/hhU9Zqw9UYopXxhuWWENclMVBwKQ==", + "dev": true + }, + "@types/set-cookie-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz", + "integrity": "sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==", "dev": true, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "version": "3.1.0" + "requires": { + "@types/node": "*" + } }, - "node_modules/camelcase": { + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/superagent": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", + "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "version": "6.3.0" + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } }, - "node_modules/caseless": { + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dev": true, - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "peer": true, - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "version": "0.12.0" + "requires": { + "@types/node": "*" + } }, - "node_modules/chai": { - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "version": "4.3.6" + "requires": { + "@types/yargs-parser": "*" + } }, - "node_modules/chalk": { - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", + "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - }, - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "version": "4.1.2" + "requires": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/type-utils": "5.10.2", + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } }, - "node_modules/check-error": { + "@typescript-eslint/parser": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz", + "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "version": "1.0.2" + "requires": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "debug": "^4.3.2" + } }, - "node_modules/chokidar": { - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, + "@typescript-eslint/scope-manager": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", + "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==", "dev": true, - "engines": { - "node": ">= 8.10.0" - }, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "version": "3.5.3" + "requires": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2" + } }, - "node_modules/chokidar/node_modules/glob-parent": { - "dependencies": { - "is-glob": "^4.0.1" - }, + "@typescript-eslint/type-utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", + "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==", "dev": true, - "engines": { - "node": ">= 6" - }, - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "version": "5.1.2" + "requires": { + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } }, - "node_modules/cipher-base": { - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "version": "1.0.4" + "@typescript-eslint/types": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz", + "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==", + "dev": true }, - "node_modules/circular-json": { - "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "@typescript-eslint/typescript-estree": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", + "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==", "dev": true, - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "version": "0.5.9" + "requires": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } }, - "node_modules/cliui": { - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, + "@typescript-eslint/utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz", + "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==", "dev": true, - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "version": "7.0.4" + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } }, - "node_modules/color-convert": { - "dependencies": { - "color-name": "~1.1.4" - }, + "@typescript-eslint/visitor-keys": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", + "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==", "dev": true, - "engines": { - "node": ">=7.0.0" - }, - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "version": "2.0.1" + "requires": { + "@typescript-eslint/types": "5.10.2", + "eslint-visitor-keys": "^3.0.0" + } }, - "node_modules/color-name": { + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true, - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "version": "1.1.4" + "peer": true }, - "node_modules/combined-stream": { - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "version": "1.0.8" + "@xmldom/xmldom": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", + "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==", + "dev": true }, - "node_modules/commander": { - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "version": "2.20.3" + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, - "node_modules/common-tags": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "engines": { - "node": ">=4.0.0" - }, - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "version": "1.8.2" + "requires": {} }, - "node_modules/component-emitter": { - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "version": "1.3.0" + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" }, - "node_modules/concat-map": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "version": "0.0.1" - }, - "node_modules/cookiejar": { - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "version": "2.1.3" + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } }, - "node_modules/core-util-is": { - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "version": "1.0.3" + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true }, - "node_modules/crc-32": { - "bin": { - "crc32": "bin/crc32.njs" + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" }, "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.3.1" - }, - "engines": { - "node": ">=0.8" - }, - "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", - "version": "1.2.1" + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } }, - "node_modules/create-hash": { - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - }, - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "version": "1.2.0" + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, - "node_modules/create-hmac": { - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "version": "1.1.7" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "node_modules/cross-fetch": { - "dependencies": { - "node-fetch": "2.6.7" - }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "version": "3.1.5" + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } }, - "node_modules/cross-spawn": { - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "version": "7.0.3" + "requires": { + "follow-redirects": "^1.14.4" + } }, - "node_modules/dashdash": { - "dependencies": { - "assert-plus": "^1.0.0" - }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, - "engines": { - "node": ">=0.10" - }, - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "peer": true, - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "version": "1.14.1" + "requires": { + "object.assign": "^4.1.0" + } }, - "node_modules/debug": { - "dependencies": { - "ms": "2.1.2" - }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, - "engines": { - "node": ">=6.0" + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" }, - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peerDependenciesMeta": { - "supports-color": { - "optional": true + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } - }, - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "version": "4.3.3" + } }, - "node_modules/decamelize": { + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "version": "4.0.0" + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } }, - "node_modules/decimal.js": { + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "version": "10.3.1" + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } }, - "node_modules/deep-eql": { - "dependencies": { - "type-detect": "^4.0.0" - }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, - "engines": { - "node": ">=0.12" - }, - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "version": "3.0.1" + "requires": { + "file-uri-to-path": "1.0.0" + } }, - "node_modules/deep-is": { + "bip32": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", + "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", "dev": true, - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "version": "0.1.4" + "requires": { + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.0.0", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + } }, - "node_modules/delay": { + "bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "version": "5.0.0" + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } }, - "node_modules/delayed-stream": { - "engines": { - "node": ">=0.4.0" - }, - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "version": "1.0.0" + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, - "node_modules/delimit-stream": { - "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=", - "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "version": "0.1.0" + "bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", + "dev": true }, - "node_modules/diff": { + "bitcoinjs-lib": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", + "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", "dev": true, - "engines": { - "node": ">=0.3.1" + "requires": { + "bech32": "^1.1.2", + "bip32": "^1.0.0", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.1", + "tiny-secp256k1": "^1.0.0", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" }, - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "version": "5.0.0" + "dependencies": { + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true + } + } }, - "node_modules/diff-sequences": { + "bitwise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bitwise/-/bitwise-2.1.0.tgz", + "integrity": "sha512-XKgAhMXCh4H/3oNwAHAsAO0iC89s9cOiumgYwSHjSobGWxYjv62YhkL9QEdvGP151xypCtMlAfKK79GEcd2eRQ==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", - "version": "27.4.0" + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, - "node_modules/dir-glob": { - "dependencies": { - "path-type": "^4.0.0" - }, + "blakejs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", + "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "borc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", + "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "requires": { + "bignumber.js": "^9.0.0", + "buffer": "^5.5.0", + "commander": "^2.15.0", + "ieee754": "^1.1.13", + "iso-url": "~0.4.7", + "json-text-sequence": "~0.1.0", + "readable-stream": "^3.6.0" + } + }, + "borsh": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz", + "integrity": "sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "@types/bn.js": "^4.11.5", + "bn.js": "^5.0.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" }, - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "version": "3.0.1" + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + } + } }, - "node_modules/dlv": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "version": "1.1.3" + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/doctrine": { - "dependencies": { - "esutils": "^2.0.2" - }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "fill-range": "^7.0.1" + } }, - "node_modules/dotenv": { - "dev": true, - "engines": { - "node": ">=12" - }, - "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", - "version": "16.0.0" + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "node_modules/ecc-jsbn": { - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true, - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "peer": true, - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "version": "0.1.2" + "peer": true }, - "node_modules/ed25519-hd-key": { - "dependencies": { - "bip39": "3.0.2", - "create-hmac": "1.1.7", - "tweetnacl": "1.0.3" - }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserslist": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", + "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", "dev": true, - "integrity": "sha512-pwES3tQ4Z8g3sfIBZEgtuTwFtHq5AlB9L8k9a48k7qPn74q2OmgrrgkdwyJ+P2GVTOBVCClAC7w21Wpksso3gw==", - "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.2.0.tgz", - "version": "1.2.0" + "requires": { + "caniuse-lite": "^1.0.30001349", + "electron-to-chromium": "^1.4.147", + "escalade": "^3.1.1", + "node-releases": "^2.0.5", + "picocolors": "^1.0.0" + } }, - "node_modules/ed25519-hd-key/node_modules/bip39": { - "dependencies": { - "@types/node": "11.11.6", + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - }, - "dev": true, - "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", - "version": "3.0.2" + "safe-buffer": "^5.1.2" + } }, - "node_modules/elliptic": { - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "version": "6.5.4" + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "node_modules/emoji-regex": { - "dev": true, - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "version": "8.0.0" + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, - "node_modules/enquirer": { - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "dev": true, - "engines": { - "node": ">=8.6" - }, - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "version": "2.3.6" + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, - "node_modules/error-ex": { - "dependencies": { - "is-arrayish": "^0.2.1" - }, + "bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", "dev": true, - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "version": "1.3.2" + "requires": { + "node-gyp-build": "^4.3.0" + } }, - "node_modules/es6-promise": { + "c8": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.3.tgz", + "integrity": "sha512-6YBmsaNmqRm9OS3ZbIiL2EZgi1+Xc4O24jL3vMYGE6idixYuGdy76rIfIdltSKDj9DpLNrcXSonUTR1miBD0wA==", "dev": true, - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "version": "4.2.8" + "optional": true, + "peer": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "dependencies": { + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "optional": true, + "peer": true + } + } }, - "node_modules/es6-promisify": { - "dependencies": { - "es6-promise": "^4.0.3" - }, - "dev": true, - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "version": "5.0.0" + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } }, - "node_modules/escalade": { - "dev": true, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "version": "3.1.1" + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, - "node_modules/escape-string-regexp": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "version": "4.0.0" + "peer": true }, - "node_modules/eslint": { - "bin": { - "eslint": "bin/eslint.js" - }, - "dependencies": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", - "version": "8.8.0" + "caniuse-lite": { + "version": "1.0.30001349", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001349.tgz", + "integrity": "sha512-VFaWW3jeo6DLU5rwdiasosxhYSduJgSGil4cSyX3/85fbctlE58pXAkWyuRmVA0r2RxsOSVYUTZcySJ8WpbTxw==", + "dev": true }, - "node_modules/eslint-config-prettier": { - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, + "chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "peerDependencies": { - "eslint": ">=7.0.0" - }, - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "version": "8.5.0" + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } }, - "node_modules/eslint-plugin-prettier": { - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "version": "4.0.0" + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "node_modules/eslint-scope": { - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dev": true, - "engines": { - "node": ">=8.0.0" - }, - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "version": "5.1.1" + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, - "node_modules/eslint-utils": { - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "peerDependencies": { - "eslint": ">=5" + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "version": "3.0.0" + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "version": "2.1.0" + "ci-info": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "dev": true }, - "node_modules/eslint-visitor-keys": { - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "version": "3.2.0" + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, - "node_modules/eslint/node_modules/eslint-scope": { - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "version": "7.1.0" + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true }, - "node_modules/eslint/node_modules/estraverse": { + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "engines": { - "node": ">=4.0" - }, - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "version": "5.3.0" + "requires": { + "restore-cursor": "^3.1.0" + } }, - "node_modules/espree": { - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "version": "9.3.0" + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true }, - "node_modules/esprima": { - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "version": "4.0.1" + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true }, - "node_modules/esquery": { - "dependencies": { - "estraverse": "^5.1.0" - }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "engines": { - "node": ">=0.10" - }, - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "version": "1.4.0" + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "node_modules/esquery/node_modules/estraverse": { - "dev": true, - "engines": { - "node": ">=4.0" - }, - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "version": "5.3.0" + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true }, - "node_modules/esrecurse": { - "dependencies": { - "estraverse": "^5.2.0" - }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "engines": { - "node": ">=4.0" - }, - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "version": "4.3.0" + "requires": { + "color-name": "~1.1.4" + } }, - "node_modules/esrecurse/node_modules/estraverse": { - "dev": true, - "engines": { - "node": ">=4.0" - }, - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "version": "5.3.0" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/estraverse": { - "dev": true, - "engines": { - "node": ">=4.0" - }, - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "version": "4.3.0" + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } }, - "node_modules/esutils": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "safe-buffer": "~5.1.1" }, - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "version": "2.0.3" - }, - "node_modules/eth-eip712-util-browser": { "dependencies": { - "bn.js": ">4.0.0", - "buffer": "^6.0.3", - "js-sha3": "^0.8.0" - }, - "integrity": "sha512-RUXQ6Hjl0wEjm/ObWgYKjzMfO1segqcPFGnMPtBkkwGaHGbXXh6WFAn5vZfReK9WWujs35uIW2+kgJmh3FXtww==", - "resolved": "https://registry.npmjs.org/eth-eip712-util-browser/-/eth-eip712-util-browser-0.0.3.tgz", - "version": "0.0.3" + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } }, - "node_modules/eth-eip712-util-browser/node_modules/buffer": { - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "core-js-compat": { + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", + "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "semver": "7.0.0" }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true } - ], - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "version": "6.0.3" + } }, - "node_modules/ethereum-cryptography": { - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - }, - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "version": "0.1.3" + "crc-32": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz", + "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.3.1" + } }, - "node_modules/ethereumjs-util": { - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "integrity": "sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz", - "version": "7.1.4" + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } }, - "node_modules/ethereumjs-util/node_modules/bn.js": { - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "version": "5.2.0" + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } }, - "node_modules/ethereumjs-util/node_modules/rlp": { - "bin": { - "rlp": "bin/rlp" - }, - "dependencies": { - "bn.js": "^5.2.0" - }, - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "version": "2.2.7" + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "requires": { + "node-fetch": "2.6.7" + } }, - "node_modules/eventemitter3": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "version": "4.0.7" + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "node_modules/evp_bytestokey": { - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - }, - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "version": "1.0.3" + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } }, - "node_modules/exit-on-epipe": { - "engines": { - "node": ">=0.8" - }, - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "version": "1.0.1" + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "peer": true }, - "node_modules/expect": { - "dependencies": { - "@jest/types": "^27.4.2", - "jest-get-type": "^27.4.0", - "jest-matcher-utils": "^27.4.6", - "jest-message-util": "^27.4.6" - }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag==", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz", - "version": "27.4.6" + "requires": { + "type-detect": "^4.0.0" + } }, - "node_modules/extend": { - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "version": "3.0.2" + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, - "node_modules/extsprintf": { + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", "dev": true, - "engines": [ - "node >=0.6.0" - ], - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "peer": true, - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "version": "1.3.0" + "requires": { + "clone": "^1.0.2" + } }, - "node_modules/eyes": { + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, - "engines": { - "node": "> 0.1.90" - }, - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "version": "0.1.8" + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } }, - "node_modules/fast-deep-equal": { + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delimit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", + "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ==", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "version": "3.1.3" + "peer": true }, - "node_modules/fast-diff": { + "diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "version": "1.2.0" + "requires": { + "path-type": "^4.0.0" + } }, - "node_modules/fast-glob": { - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "engines": { - "node": ">=8.6.0" - }, - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "version": "3.2.11" + "requires": { + "esutils": "^2.0.2" + } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "dependencies": { - "is-glob": "^4.0.1" - }, + "dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "dev": true + }, + "ed25519-hd-key": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.2.0.tgz", + "integrity": "sha512-pwES3tQ4Z8g3sfIBZEgtuTwFtHq5AlB9L8k9a48k7qPn74q2OmgrrgkdwyJ+P2GVTOBVCClAC7w21Wpksso3gw==", "dev": true, - "engines": { - "node": ">= 6" + "requires": { + "bip39": "3.0.2", + "create-hmac": "1.1.7", + "tweetnacl": "1.0.3" }, - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "version": "5.1.2" + "dependencies": { + "bip39": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "dev": true, + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + } + } }, - "node_modules/fast-json-stable-stringify": { - "dev": true, - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "version": "2.1.0" + "electron-to-chromium": { + "version": "1.4.147", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.147.tgz", + "integrity": "sha512-czclPqxLMPqPMkahKcske4TaS5lcznsc26ByBlEFDU8grTBVK9C5W6K9I6oEEhm4Ai4jTihGnys90xY1yjXcRg==", + "dev": true }, - "node_modules/fast-levenshtein": { - "dev": true, - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "version": "2.0.6" + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } }, - "node_modules/fast-safe-stringify": { - "dev": true, - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "version": "2.1.1" + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/fastq": { - "dependencies": { - "reusify": "^1.0.4" - }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "version": "1.13.0" + "requires": { + "ansi-colors": "^4.1.1" + } }, - "node_modules/file-entry-cache": { - "dependencies": { - "flat-cache": "^3.0.4" - }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "version": "6.0.1" + "requires": { + "is-arrayish": "^0.2.1" + } }, - "node_modules/file-uri-to-path": { + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "version": "1.0.0" + "requires": { + "es6-promise": "^4.0.3" + } + }, + "esbuild": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz", + "integrity": "sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.43", + "esbuild-android-arm64": "0.14.43", + "esbuild-darwin-64": "0.14.43", + "esbuild-darwin-arm64": "0.14.43", + "esbuild-freebsd-64": "0.14.43", + "esbuild-freebsd-arm64": "0.14.43", + "esbuild-linux-32": "0.14.43", + "esbuild-linux-64": "0.14.43", + "esbuild-linux-arm": "0.14.43", + "esbuild-linux-arm64": "0.14.43", + "esbuild-linux-mips64le": "0.14.43", + "esbuild-linux-ppc64le": "0.14.43", + "esbuild-linux-riscv64": "0.14.43", + "esbuild-linux-s390x": "0.14.43", + "esbuild-netbsd-64": "0.14.43", + "esbuild-openbsd-64": "0.14.43", + "esbuild-sunos-64": "0.14.43", + "esbuild-windows-32": "0.14.43", + "esbuild-windows-64": "0.14.43", + "esbuild-windows-arm64": "0.14.43" + } }, - "node_modules/fill-range": { - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "esbuild-android-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz", + "integrity": "sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "version": "7.0.1" + "optional": true }, - "node_modules/find-up": { - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "esbuild-android-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz", + "integrity": "sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "version": "5.0.0" + "optional": true }, - "node_modules/flat": { - "bin": { - "flat": "cli.js" - }, + "esbuild-darwin-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz", + "integrity": "sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==", "dev": true, - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "version": "5.0.2" + "optional": true }, - "node_modules/flat-cache": { - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, + "esbuild-darwin-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz", + "integrity": "sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "version": "3.0.4" + "optional": true }, - "node_modules/flatted": { + "esbuild-freebsd-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz", + "integrity": "sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==", "dev": true, - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "version": "3.2.5" + "optional": true }, - "node_modules/follow-redirects": { + "esbuild-freebsd-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz", + "integrity": "sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==", "dev": true, - "engines": { - "node": ">=4.0" - }, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "peerDependenciesMeta": { - "debug": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "version": "1.14.8" + "optional": true }, - "node_modules/forever-agent": { + "esbuild-linux-32": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz", + "integrity": "sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "peer": true, - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "version": "0.6.1" + "optional": true }, - "node_modules/form-data": { - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - }, - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "version": "2.5.1" + "esbuild-linux-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz", + "integrity": "sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==", + "dev": true, + "optional": true }, - "node_modules/formidable": { - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - }, - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "version": "1.2.6" + "esbuild-linux-arm": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz", + "integrity": "sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==", + "dev": true, + "optional": true }, - "node_modules/fs.realpath": { + "esbuild-linux-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz", + "integrity": "sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==", "dev": true, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "version": "1.0.0" + "optional": true }, - "node_modules/fsevents": { + "esbuild-linux-mips64le": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz", + "integrity": "sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==", "dev": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - }, - "hasInstallScript": true, - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true, - "os": [ - "darwin" - ], - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "version": "2.3.2" + "optional": true }, - "node_modules/function-bind": { - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "version": "1.1.1" + "esbuild-linux-ppc64le": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz", + "integrity": "sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==", + "dev": true, + "optional": true }, - "node_modules/functional-red-black-tree": { + "esbuild-linux-riscv64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz", + "integrity": "sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==", "dev": true, - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "version": "1.0.1" + "optional": true }, - "node_modules/get-caller-file": { + "esbuild-linux-s390x": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz", + "integrity": "sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==", "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - }, - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "version": "2.0.5" + "optional": true }, - "node_modules/get-func-name": { + "esbuild-netbsd-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz", + "integrity": "sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "version": "2.0.0" + "optional": true }, - "node_modules/get-intrinsic": { - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "version": "1.1.1" + "esbuild-openbsd-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz", + "integrity": "sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==", + "dev": true, + "optional": true }, - "node_modules/getpass": { - "dependencies": { - "assert-plus": "^1.0.0" - }, + "esbuild-sunos-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz", + "integrity": "sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==", "dev": true, - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "peer": true, - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "version": "0.1.7" + "optional": true }, - "node_modules/glob": { - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "esbuild-windows-32": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz", + "integrity": "sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==", "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "version": "7.2.0" + "optional": true }, - "node_modules/glob-parent": { - "dependencies": { - "is-glob": "^4.0.3" - }, + "esbuild-windows-64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz", + "integrity": "sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==", "dev": true, - "engines": { - "node": ">=10.13.0" - }, - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "version": "6.0.2" + "optional": true }, - "node_modules/globals": { - "dependencies": { - "type-fest": "^0.20.2" - }, + "esbuild-windows-arm64": { + "version": "0.14.43", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz", + "integrity": "sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "version": "13.12.1" + "optional": true }, - "node_modules/globby": { - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "version": "11.1.0" + "dependencies": { + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } }, - "node_modules/google-protobuf": { + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, - "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.4.tgz", - "version": "3.19.4" + "requires": {} }, - "node_modules/graceful-fs": { + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "version": "4.2.9" + "requires": { + "prettier-linter-helpers": "^1.0.0" + } }, - "node_modules/growl": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "engines": { - "node": ">=4.x" - }, - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "version": "1.10.5" + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } }, - "node_modules/har-schema": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "engines": { - "node": ">=4" + "requires": { + "eslint-visitor-keys": "^2.0.0" }, - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "peer": true, - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "version": "2.0.0" - }, - "node_modules/har-validator": { "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "deprecated": "this library is no longer supported", - "dev": true, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "peer": true, - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "version": "5.1.5" + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } }, - "node_modules/has": { - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "version": "1.0.3" + "eslint-visitor-keys": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "dev": true }, - "node_modules/has-ansi": { - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "espree": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" }, - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "version": "2.0.0" + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } }, - "node_modules/has-ansi/node_modules/ansi-regex": { + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "estraverse": "^5.2.0" }, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "version": "2.1.1" + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } }, - "node_modules/has-flag": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "version": "4.0.0" + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, - "node_modules/has-symbols": { - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "version": "1.0.2" + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, - "node_modules/hash-base": { - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" + "eth-eip712-util-browser": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/eth-eip712-util-browser/-/eth-eip712-util-browser-0.0.3.tgz", + "integrity": "sha512-RUXQ6Hjl0wEjm/ObWgYKjzMfO1segqcPFGnMPtBkkwGaHGbXXh6WFAn5vZfReK9WWujs35uIW2+kgJmh3FXtww==", + "requires": { + "bn.js": ">4.0.0", + "buffer": "^6.0.3", + "js-sha3": "^0.8.0" }, - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "version": "3.1.0" - }, - "node_modules/hash.js": { "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - }, - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "version": "1.1.7" + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } }, - "node_modules/he": { - "bin": { - "he": "bin/he" - }, - "dev": true, - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "version": "1.2.0" + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } }, - "node_modules/hmac-drbg": { - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "ethereumjs-util": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz", + "integrity": "sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "version": "1.0.1" - }, - "node_modules/http-signature": { "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "dev": true, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - }, - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "peer": true, - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "version": "1.2.0" - }, - "node_modules/ieee754": { - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, - { - "type": "consulting", - "url": "https://feross.org/support" + "rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "requires": { + "bn.js": "^5.2.0" + } } - ], - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "version": "1.2.1" + } }, - "node_modules/ignore": { - "dev": true, - "engines": { - "node": ">= 4" - }, - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "version": "5.2.0" + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, - "node_modules/import-fresh": { - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "version": "3.3.0" + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true }, - "node_modules/imurmurhash": { + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "expect": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.1.tgz", + "integrity": "sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==", "dev": true, - "engines": { - "node": ">=0.8.19" - }, - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "version": "0.1.4" + "requires": { + "@jest/expect-utils": "^28.1.1", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1" + } }, - "node_modules/indent-string": { + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "version": "4.0.0" - }, - "node_modules/inflight": { "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dev": true, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "version": "1.0.6" + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } }, - "node_modules/inherits": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "version": "2.0.4" + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true }, - "node_modules/is-arrayish": { - "dev": true, - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "version": "0.2.1" + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, - "node_modules/is-binary-path": { - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "version": "2.1.0" + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true }, - "node_modules/is-extglob": { + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "version": "2.1.1" + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } }, - "node_modules/is-fullwidth-code-point": { + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "reusify": "^1.0.4" + } }, - "node_modules/is-glob": { - "dependencies": { - "is-extglob": "^2.1.1" - }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "escape-string-regexp": "^1.0.5" }, - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "version": "4.0.3" + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } }, - "node_modules/is-number": { + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "engines": { - "node": ">=0.12.0" - }, - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "version": "7.0.0" + "requires": { + "flat-cache": "^3.0.4" + } }, - "node_modules/is-plain-obj": { + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "version": "2.1.0" + "requires": { + "to-regex-range": "^5.0.1" + } }, - "node_modules/is-typedarray": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "peer": true, - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "version": "1.0.0" + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } }, - "node_modules/is-unicode-supported": { + "find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "version": "0.1.0" + "requires": { + "micromatch": "^4.0.2" + } }, - "node_modules/isarray": { - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "version": "1.0.0" + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "peer": true }, - "node_modules/isexe": { + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "version": "2.0.0" + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } }, - "node_modules/iso-url": { - "engines": { - "node": ">=10" - }, - "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", - "version": "0.4.7" + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true }, - "node_modules/isomorphic-ws": { - "dev": true, - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - }, - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "version": "4.0.1" + "follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true }, - "node_modules/isstream": { + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true, "peer": true, - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "version": "0.1.2" + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } }, - "node_modules/jayson": { - "bin": { - "jayson": "bin/jayson.js" + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", + "requires": { + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" }, "dependencies": { - "@types/connect": "^3.4.33", - "@types/express-serve-static-core": "^4.17.9", - "@types/lodash": "^4.14.159", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "JSONStream": "^1.3.5", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "uuid": "^8.3.2", - "ws": "^7.4.5" - }, + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==" + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ==", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz", - "version": "3.6.6" + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } }, - "node_modules/jayson/node_modules/@types/node": { + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "integrity": "sha512-1Jg2Qv5tuxBqgQV04+wO5u+wmSHbHgpORCJdeCLM+E+YdPElpdHhgywU+M1V1InL8rfOtpqtOjswk+uXTKwx7w==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.45.tgz", - "version": "12.20.45" + "optional": true }, - "node_modules/jest-diff": { - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.4.0", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" - }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz", - "version": "27.4.6" + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, - "node_modules/jest-get-type": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz", - "version": "27.4.0" + "requires": { + "is-glob": "^4.0.3" + } }, - "node_modules/jest-matcher-utils": { - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.4.6", - "jest-get-type": "^27.4.0", - "pretty-format": "^27.4.6" - }, + "globals": { + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz", - "version": "27.4.6" + "requires": { + "type-fest": "^0.20.2" + } }, - "node_modules/jest-message-util": { - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.4.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.4.6", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz", - "version": "27.4.6" + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } }, - "node_modules/js-sha3": { - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "version": "0.8.0" + "google-protobuf": { + "version": "3.19.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.4.tgz", + "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==", + "dev": true }, - "node_modules/js-tokens": { - "dev": true, - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "version": "4.0.0" + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true }, - "node_modules/js-yaml": { - "bin": { - "js-yaml": "bin/js-yaml.js" + "graphql": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.5.0.tgz", + "integrity": "sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" }, "dependencies": { - "argparse": "^2.0.1" - }, - "dev": true, - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "version": "4.1.0" + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } }, - "node_modules/jsbn": { - "dev": true, - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "peer": true, - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "version": "0.1.1" + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "node_modules/jscrypto": { - "bin": { - "jscrypto": "bin/cli.js" - }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "integrity": "sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==", - "resolved": "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.3.tgz", - "version": "1.0.3" + "requires": { + "get-intrinsic": "^1.1.1" + } }, - "node_modules/json-parse-better-errors": { - "dev": true, - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "version": "1.0.2" + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, - "node_modules/json-schema": { - "dev": true, - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "peer": true, - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "version": "0.4.0" + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } }, - "node_modules/json-schema-traverse": { - "dev": true, - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "version": "0.4.1" + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } }, - "node_modules/json-stable-stringify-without-jsonify": { + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "version": "1.0.1" + "peer": true }, - "node_modules/json-stringify-safe": { - "dev": true, - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "version": "5.0.1" + "headers-polyfill": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.0.7.tgz", + "integrity": "sha512-JoLCAdCEab58+2/yEmSnOlficyHFpIl0XJqwu3l+Unkm1gXpFUYsThz6Yha3D6tNhocWkCPfyW0YVIGWFqTi7w==", + "dev": true }, - "node_modules/json-text-sequence": { - "dependencies": { - "delimit-stream": "0.1.0" - }, - "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", - "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", - "version": "0.1.1" + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" }, - "node_modules/json5": { - "bin": { - "json5": "lib/cli.js" - }, - "dependencies": { - "minimist": "^1.2.0" - }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "optional": true, - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "version": "1.0.1" + "peer": true }, - "node_modules/jsonc": { - "dependencies": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" - }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "version": "2.0.0" + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, - "node_modules/jsonc/node_modules/strip-bom": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "version": "4.0.0" + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "node_modules/jsonparse": { - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "version": "1.3.1" + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true }, - "node_modules/jsprim": { - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "engines": { - "node": ">=0.6.0" - }, - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "peer": true, - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "version": "1.4.2" + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } }, - "node_modules/keccak": { - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "hasInstallScript": true, - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "version": "3.0.2" + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, - "node_modules/levn": { - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "dev": true, - "engines": { - "node": ">= 0.8.0" - }, - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "version": "0.4.1" + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, - "node_modules/locate-path": { - "dependencies": { - "p-locate": "^5.0.0" - }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "version": "6.0.0" + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "node_modules/lodash": { - "dev": true, - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "version": "4.17.21" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + } }, - "node_modules/lodash.merge": { - "dev": true, - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "version": "4.6.2" + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, - "node_modules/lodash.truncate": { + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "version": "4.4.2" + "requires": { + "binary-extensions": "^2.0.0" + } }, - "node_modules/log-symbols": { - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "ci-info": "^2.0.0" }, - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "version": "4.1.0" + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + } + } }, - "node_modules/loglevel": { + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - }, - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "version": "1.8.0" + "requires": { + "has": "^1.0.3" + } }, - "node_modules/loglevel-colored-level-prefix": { - "dependencies": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" - }, - "dev": true, - "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", - "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", - "version": "1.0.0" + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "version": "2.1.1" + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "version": "2.2.1" + "requires": { + "is-extglob": "^2.1.1" + } }, - "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-node-process": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz", + "integrity": "sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "version": "1.1.3" + "peer": true }, - "node_modules/loglevel-colored-level-prefix/node_modules/escape-string-regexp": { + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "engines": { - "node": ">=0.8.0" - }, - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "version": "1.0.5" + "requires": { + "is-docker": "^2.0.0" + } }, - "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "iso-url": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", + "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==" + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "version": "3.0.1" + "requires": {} }, - "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "engines": { - "node": ">=0.8.0" - }, - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "version": "2.0.0" + "optional": true, + "peer": true }, - "node_modules/long": { + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "version": "4.0.0" + "optional": true, + "peer": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } }, - "node_modules/loupe": { - "dependencies": { - "get-func-name": "^2.0.0" - }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, - "integrity": "sha512-QgVamnvj0jX1LMPlCAq0MK6hATORFtGqHoUKXTkwNe13BqlN6aePQCKnnTcFvdDYEEITcJ+gBl4mTW7YJtJbyQ==", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.2.tgz", - "version": "2.3.2" + "optional": true, + "peer": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } }, - "node_modules/lru-cache": { - "dependencies": { - "yallist": "^4.0.0" - }, + "jayson": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz", + "integrity": "sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ==", "dev": true, - "engines": { - "node": ">=10" + "requires": { + "@types/connect": "^3.4.33", + "@types/express-serve-static-core": "^4.17.9", + "@types/lodash": "^4.14.159", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "lodash": "^4.17.20", + "uuid": "^8.3.2", + "ws": "^7.4.5" }, - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "version": "6.0.0" + "dependencies": { + "@types/node": { + "version": "12.20.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.45.tgz", + "integrity": "sha512-1Jg2Qv5tuxBqgQV04+wO5u+wmSHbHgpORCJdeCLM+E+YdPElpdHhgywU+M1V1InL8rfOtpqtOjswk+uXTKwx7w==", + "dev": true + } + } }, - "node_modules/make-error": { + "jest-diff": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.1.tgz", + "integrity": "sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==", "dev": true, - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "version": "1.3.6" + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" + } }, - "node_modules/md5.js": { - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "version": "1.3.5" + "jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true }, - "node_modules/merge2": { + "jest-matcher-utils": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz", + "integrity": "sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==", "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "version": "1.4.1" + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" + } }, - "node_modules/merkle-lib": { + "jest-message-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", "dev": true, - "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "version": "2.0.10" - }, - "node_modules/methods": { - "engines": { - "node": ">= 0.6" - }, - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "version": "1.1.2" + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } }, - "node_modules/micromatch": { - "dependencies": { - "braces": "^3.0.1", + "jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" - }, + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=8.6" - }, - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "version": "4.0.4" + "requires": { + "argparse": "^2.0.1" + } }, - "node_modules/mime": { - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "version": "1.6.0" + "jscrypto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.3.tgz", + "integrity": "sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==", + "dev": true }, - "node_modules/mime-db": { - "engines": { - "node": ">= 0.6" - }, - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "version": "1.51.0" + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, - "node_modules/mime-types": { - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - }, - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "version": "2.1.34" + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, - "node_modules/minimalistic-assert": { - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "version": "1.0.1" + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "node_modules/minimalistic-crypto-utils": { - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "version": "1.0.1" + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, - "node_modules/minimatch": { - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "version": "3.0.4" + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, - "node_modules/minimist": { - "dev": true, - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "version": "1.2.5" + "json-text-sequence": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", + "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", + "requires": { + "delimit-stream": "0.1.0" + } }, - "node_modules/mkdirp": { - "bin": { - "mkdirp": "bin/cmd.js" - }, - "dependencies": { - "minimist": "^1.2.5" - }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "version": "0.5.5" + "optional": true, + "requires": { + "minimist": "^1.2.0" + } }, - "node_modules/mocha": { - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.2.0", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, + "jsonc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "integrity": "sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==", "dev": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "requires": { + "fast-safe-stringify": "^2.0.6", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "parse-json": "^4.0.0", + "strip-bom": "^4.0.0", + "strip-json-comments": "^3.0.1" }, - "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz", - "version": "9.2.0" + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } }, - "node_modules/mocha/node_modules/ms": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "version": "2.1.3" + "requires": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/mocha/node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - }, - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "version": "8.1.1" + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } }, - "node_modules/ms": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "version": "2.1.2" + "keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + } }, - "node_modules/nan": { + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", "dev": true, - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "version": "2.15.0" + "requires": { + "graceful-fs": "^4.1.11" + } }, - "node_modules/nanoid": { - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - }, - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "version": "3.2.0" + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } }, - "node_modules/natural-compare": { + "local-pkg": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.1.tgz", + "integrity": "sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "version": "1.4.0" + "peer": true, + "requires": { + "p-locate": "^5.0.0" + } }, - "node_modules/node-addon-api": { - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "version": "2.0.2" + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, - "node_modules/node-fetch": { - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - }, - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "version": "2.6.7" + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, - "node_modules/node-gyp-build": { - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - }, - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "version": "4.3.0" + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, - "node_modules/normalize-path": { + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } }, - "node_modules/oauth-sign": { + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", "dev": true, - "engines": { - "node": "*" + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" }, - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "version": "0.9.0" + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } }, - "node_modules/object-inspect": { - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "version": "1.12.0" + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true }, - "node_modules/once": { - "dependencies": { - "wrappy": "1" - }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", "dev": true, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "version": "1.4.0" + "requires": { + "get-func-name": "^2.0.0" + } }, - "node_modules/optionator": { - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "dev": true, - "engines": { - "node": ">= 0.8.0" - }, - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "version": "0.9.1" + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } }, - "node_modules/p-limit": { - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "peer": true, + "requires": { + "semver": "^6.0.0" }, - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "version": "3.1.0" - }, - "node_modules/p-locate": { "dependencies": { - "p-limit": "^3.0.2" - }, - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "version": "5.0.0" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=", + "dev": true }, - "node_modules/parent-module": { - "dependencies": { - "callsites": "^3.0.0" - }, - "dev": true, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "version": "1.0.1" + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "node_modules/parse-json": { - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "version": "4.0.0" + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } }, - "node_modules/path-exists": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "version": "4.0.0" + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, - "node_modules/path-is-absolute": { - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "version": "1.0.1" + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, - "node_modules/path-key": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "version": "3.1.1" + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } }, - "node_modules/path-type": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "version": "4.0.0" + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true }, - "node_modules/pathval": { - "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "version": "1.1.1" + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, - "node_modules/pbkdf2": { - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - }, - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "version": "3.1.2" + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, - "node_modules/performance-now": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "peer": true, - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "version": "2.1.0" + "requires": { + "brace-expansion": "^1.1.7" + } }, - "node_modules/picomatch": { - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - }, - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "version": "2.3.1" + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, - "node_modules/prelude-ls": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "engines": { - "node": ">= 0.8.0" - }, - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "version": "1.2.1" + "requires": { + "minimist": "^1.2.5" + } }, - "node_modules/prettier": { - "bin": { - "prettier": "bin-prettier.js" - }, + "mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peer": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "version": "2.6.2" - }, - "node_modules/prettier-eslint": { "dependencies": { - "@typescript-eslint/parser": "^3.0.0", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^7.9.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^2.0.0", - "pretty-format": "^23.0.1", - "require-relative": "^0.8.7", - "typescript": "^3.9.3", - "vue-eslint-parser": "~7.1.0" - }, - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "integrity": "sha512-P5K31qWgUOQCtJL/3tpvEe28KfP49qbr6MTVEXC7I2k7ci55bP3YDr+glhyCdhIzxGCVp2f8eobfQ5so52RIIA==", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-13.0.0.tgz", - "version": "13.0.0" + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "peer": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "node_modules/prettier-eslint/node_modules/@babel/code-frame": { - "dependencies": { - "@babel/highlight": "^7.10.4" + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "msw": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-0.42.0.tgz", + "integrity": "sha512-vB9rzgiGHoQGfkKpp3QZHxobzfuuQOJk+0bff0wtbK8k3P3CaUSt8bCwvExours682AY4mUfTjIkCsxy0JoS3w==", + "dev": true, + "requires": { + "@mswjs/cookies": "^0.2.0", + "@mswjs/interceptors": "^0.16.3", + "@open-draft/until": "^1.0.3", + "@types/cookie": "^0.4.1", + "@types/js-levenshtein": "^1.1.1", + "chalk": "4.1.1", + "chokidar": "^3.4.2", + "cookie": "^0.4.2", + "graphql": "^16.3.0", + "headers-polyfill": "^3.0.4", + "inquirer": "^8.2.0", + "is-node-process": "^1.0.1", + "js-levenshtein": "^1.1.6", + "node-fetch": "^2.6.7", + "outvariant": "^1.3.0", + "path-to-regexp": "^6.2.0", + "statuses": "^2.0.0", + "strict-event-emitter": "^0.2.0", + "type-fest": "^1.2.2", + "yargs": "^17.3.1" }, - "dev": true, - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "version": "7.12.11" - }, - "node_modules/prettier-eslint/node_modules/@eslint/eslintrc": { "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "version": "0.4.3" + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + } + } }, - "node_modules/prettier-eslint/node_modules/@humanwhocodes/config-array": { - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "engines": { - "node": ">=10.10.0" - }, - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "version": "0.5.0" + "peer": true }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { - "dependencies": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/typescript-estree": "3.10.1", - "eslint-visitor-keys": "^1.1.0" - }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==", - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { + "node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { - "dependencies": { - "@typescript-eslint/types": "3.10.1", - "@typescript-eslint/visitor-keys": "3.10.1", - "debug": "^4.1.1", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - }, - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "mimic-fn": "^2.1.0" + } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "version": "3.10.1" + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } }, - "node_modules/prettier-eslint/node_modules/acorn": { - "bin": { - "acorn": "bin/acorn" - }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "engines": { - "node": ">=0.4.0" - }, - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "version": "7.4.1" + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } }, - "node_modules/prettier-eslint/node_modules/ansi-regex": { + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "version": "3.0.1" + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } }, - "node_modules/prettier-eslint/node_modules/ansi-styles": { - "dependencies": { - "color-convert": "^1.9.0" - }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "outvariant": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", + "integrity": "sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "version": "3.2.1" + "peer": true, + "requires": { + "yocto-queue": "^0.1.0" + } }, - "node_modules/prettier-eslint/node_modules/argparse": { - "dependencies": { - "sprintf-js": "~1.0.2" - }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "version": "1.0.10" + "peer": true, + "requires": { + "p-limit": "^3.0.2" + } }, - "node_modules/prettier-eslint/node_modules/color-convert": { - "dependencies": { - "color-name": "1.1.3" - }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "version": "1.9.3" + "requires": { + "callsites": "^3.0.0" + } }, - "node_modules/prettier-eslint/node_modules/color-name": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "version": "1.1.3" + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } }, - "node_modules/prettier-eslint/node_modules/eslint": { - "bin": { - "eslint": "bin/eslint.js" - }, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, + "patch-package": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", + "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.0", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33" }, - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "version": "7.32.0" - }, - "node_modules/prettier-eslint/node_modules/eslint-utils": { "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "version": "2.1.0" + "peer": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, - "node_modules/prettier-eslint/node_modules/eslint-visitor-keys": { - "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "version": "1.3.0" + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, - "node_modules/prettier-eslint/node_modules/eslint/node_modules/eslint-visitor-keys": { + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, - "engines": { - "node": ">=10" + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "version": "2.1.0" - }, - "node_modules/prettier-eslint/node_modules/espree": { "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "version": "7.3.1" + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + } + } }, - "node_modules/prettier-eslint/node_modules/glob-parent": { - "dependencies": { - "is-glob": "^4.0.1" - }, - "dev": true, - "engines": { - "node": ">= 6" - }, - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "version": "5.1.2" + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, - "node_modules/prettier-eslint/node_modules/ignore": { - "dev": true, - "engines": { - "node": ">= 4" - }, - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "version": "4.0.6" + "prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "dev": true }, - "node_modules/prettier-eslint/node_modules/js-yaml": { - "bin": { - "js-yaml": "bin/js-yaml.js" - }, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, + "prettier-eslint": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-15.0.1.tgz", + "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==", "dev": true, - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "version": "3.14.1" - }, - "node_modules/prettier-eslint/node_modules/pretty-format": { - "dependencies": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "requires": { + "@types/eslint": "^8.4.2", + "@types/prettier": "^2.6.0", + "@typescript-eslint/parser": "^5.10.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^2.5.1", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^4.5.4", + "vue-eslint-parser": "^8.0.1" }, - "dev": true, - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "version": "23.6.0" + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } }, - "node_modules/prettier-eslint/node_modules/typescript": { - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "engines": { - "node": ">=4.2.0" - }, - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "version": "3.9.10" - }, - "node_modules/prettier-linter-helpers": { - "dependencies": { + "requires": { "fast-diff": "^1.1.2" - }, - "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "version": "1.0.0" + } }, - "node_modules/pretty-format": { - "dependencies": { + "pretty-format": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz", - "version": "27.4.6" - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "react-is": "^18.0.0" }, - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "version": "5.2.0" + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } }, - "node_modules/printj": { - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - }, - "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==", + "printj": { + "version": "1.3.1", "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz", - "version": "1.3.1" - }, - "node_modules/process-nextick-args": { - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "version": "2.0.1" + "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==" }, - "node_modules/progress": { + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", "dev": true, - "engines": { - "node": ">=0.4.0" - }, - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "version": "2.0.3" - }, - "node_modules/protobufjs": { - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - }, - "dependencies": { + "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", @@ -9421,876 +14707,672 @@ "@types/node": ">=13.7.0", "long": "^4.0.0" }, - "dev": true, - "hasInstallScript": true, - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "version": "6.11.2" - }, - "node_modules/protobufjs/node_modules/@types/node": { - "dev": true, - "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", - "version": "17.0.17" + "dependencies": { + "@types/node": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", + "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==", + "dev": true + } + } }, - "node_modules/psl": { - "dev": true, - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "psl": { + "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "version": "1.8.0" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, - "node_modules/punycode": { - "dev": true, - "engines": { - "node": ">=6" - }, - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "punycode": { + "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "version": "2.1.1" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, - "node_modules/pushdata-bitcoin": { - "dependencies": { - "bitcoin-ops": "^1.3.0" - }, - "dev": true, - "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", + "pushdata-bitcoin": { + "version": "1.0.1", "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "version": "1.0.1" + "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", + "dev": true, + "requires": { + "bitcoin-ops": "^1.3.0" + } }, - "node_modules/qs": { - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "qs": { + "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "version": "6.10.3" + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } }, - "node_modules/queue-microtask": { - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "queue-microtask": { + "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "version": "1.2.3" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, - "node_modules/random-words": { - "dev": true, - "integrity": "sha512-GwgC+Yu+D5/044grf2QqaYk3ZrQip7yfgvkj/6bJ3H3B3KrE7qoNPbWaYd06hrigqAkrPzNVEpRlnBaNx4bDuA==", + "random-words": { + "version": "1.1.2", "resolved": "https://registry.npmjs.org/random-words/-/random-words-1.1.2.tgz", - "version": "1.1.2" + "integrity": "sha512-GwgC+Yu+D5/044grf2QqaYk3ZrQip7yfgvkj/6bJ3H3B3KrE7qoNPbWaYd06hrigqAkrPzNVEpRlnBaNx4bDuA==", + "dev": true }, - "node_modules/randombytes": { - "dependencies": { - "safe-buffer": "^5.1.0" - }, - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "randombytes": { + "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "version": "2.1.0" + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } }, - "node_modules/react-is": { - "dev": true, - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "version": "17.0.2" + "react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true }, - "node_modules/readable-stream": { - "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - }, - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "version": "3.6.0" + } }, - "node_modules/readdirp": { - "dependencies": { - "picomatch": "^2.2.1" - }, - "dev": true, - "engines": { - "node": ">=8.10.0" - }, - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "readdirp": { + "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "version": "3.6.0" - }, - "node_modules/readline-sync": { + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "engines": { - "node": ">= 0.8.0" - }, - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "readline-sync": { + "version": "1.4.10", "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "version": "1.4.10" + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true }, - "node_modules/regenerator-runtime": { + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "version": "0.13.9" + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true }, - "node_modules/regexpp": { + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpp": { + "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "version": "3.2.0" - }, - "node_modules/request": { - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "engines": { - "node": ">= 6" - }, - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "peer": true, - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "version": "2.88.2" + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true }, - "node_modules/request-promise": { - "dependencies": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", - "peerDependencies": { - "request": "^2.34" - }, - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", - "version": "4.2.6" + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } }, - "node_modules/request-promise-core": { - "dependencies": { - "lodash": "^4.17.19" - }, - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "peerDependencies": { - "request": "^2.34" - }, - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "version": "1.1.4" + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true }, - "node_modules/request/node_modules/form-data": { - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, - "engines": { - "node": ">= 0.12" + "requires": { + "jsesc": "~0.5.0" }, - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "version": "2.3.3" + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } }, - "node_modules/request/node_modules/qs": { + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", "dev": true, - "engines": { - "node": ">=0.6" - }, - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "peer": true, - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "version": "6.5.3" + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } }, - "node_modules/request/node_modules/uuid": { - "bin": { - "uuid": "bin/uuid" - }, - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "peer": true, - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "version": "3.4.0" + "requires": { + "lodash": "^4.17.19" + } }, - "node_modules/require-directory": { - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "require-directory": { + "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "version": "2.1.1" - }, - "node_modules/require-from-string": { - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "version": "2.0.2" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, - "node_modules/require-relative": { - "dev": true, - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "require-relative": { + "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "version": "0.8.7" + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true }, - "node_modules/resolve-from": { + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "version": "4.0.0" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, - "node_modules/reusify": { + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - }, - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "version": "1.0.4" + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, - "node_modules/rimraf": { - "bin": { - "rimraf": "bin.js" - }, - "dependencies": { - "glob": "^7.1.3" - }, - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "rimraf": { + "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "version": "3.0.2" + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, - "node_modules/ripemd160": { - "dependencies": { + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" - }, - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "version": "2.0.2" + } }, - "node_modules/rlp": { - "bin": { - "rlp": "bin/rlp" - }, - "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==", + "rlp": { + "version": "3.0.0", "resolved": "https://registry.npmjs.org/rlp/-/rlp-3.0.0.tgz", - "version": "3.0.0" + "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==" }, - "node_modules/rpc-websockets": { - "dependencies": { + "rollup": { + "version": "2.75.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz", + "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rpc-websockets": { + "version": "7.4.17", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.17.tgz", + "integrity": "sha512-eolVi/qlXS13viIUH9aqrde902wzSLAai0IjmOZSRefp5I3CSG/vCnD0c0fDSYCWuEyUoRL1BHQA8K1baEUyow==", + "dev": true, + "requires": { "@babel/runtime": "^7.11.2", + "bufferutil": "^4.0.1", "circular-json": "^0.5.9", "eventemitter3": "^4.0.7", + "utf-8-validate": "^5.0.2", "uuid": "^8.3.0", "ws": "^7.4.5" - }, - "dev": true, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" - }, - "integrity": "sha512-eolVi/qlXS13viIUH9aqrde902wzSLAai0IjmOZSRefp5I3CSG/vCnD0c0fDSYCWuEyUoRL1BHQA8K1baEUyow==", - "optionalDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.17.tgz", - "version": "7.4.17" + } }, - "node_modules/run-parallel": { - "dependencies": { - "queue-microtask": "^1.2.2" - }, - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "version": "1.2.0" + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, - "node_modules/safe-buffer": { - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "version": "5.2.1" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "node_modules/safer-buffer": { - "dev": true, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true, + "safer-buffer": { + "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "version": "2.1.2" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, - "node_modules/scrypt-js": { - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "scrypt-js": { + "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "version": "3.0.1" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, - "node_modules/secp256k1": { - "dependencies": { + "secp256k1": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", + "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "requires": { "elliptic": "^6.5.2", "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "hasInstallScript": true, - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "version": "4.0.2" + } }, - "node_modules/seedrandom": { - "dev": true, - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "seedrandom": { + "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "version": "3.0.5" + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true }, - "node_modules/semver": { - "bin": { - "semver": "bin/semver.js" - }, - "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { "lru-cache": "^6.0.0" - }, - "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "version": "7.3.5" + } }, - "node_modules/serialize-javascript": { - "dependencies": { - "randombytes": "^2.1.0" - }, - "dev": true, - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "serialize-javascript": { + "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "version": "6.0.0" + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } }, - "node_modules/setimmediate": { - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "set-cookie-parser": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", + "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "version": "1.0.5" + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, - "node_modules/sha.js": { - "bin": { - "sha.js": "bin.js" - }, - "dependencies": { + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" - }, - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "version": "2.4.11" + } }, - "node_modules/shebang-command": { - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "shebang-command": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "version": "2.0.0" - }, - "node_modules/shebang-regex": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "version": "3.0.0" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, - "node_modules/side-channel": { - "dependencies": { + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "version": "1.0.4" + } }, - "node_modules/slash": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "version": "3.0.0" + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "node_modules/slice-ansi": { - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - }, - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "version": "4.0.0" + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, - "node_modules/source-map": { - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "source-map": { + "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "version": "0.6.1" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, - "node_modules/source-map-support": { - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dev": true, - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "version": "0.5.21" + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true }, - "node_modules/sshpk": { - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "peer": true, - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "version": "1.17.0" + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/sshpk/node_modules/tweetnacl": { + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "peer": true, - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "version": "0.14.5" - }, - "node_modules/stack-utils": { - "dependencies": { + "requires": { "escape-string-regexp": "^2.0.0" }, - "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "version": "2.0.5" + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "version": "2.0.0" + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true }, - "node_modules/stealthy-require": { - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "stealthy-require": { + "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "version": "1.1.1" + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true }, - "node_modules/string-width": { - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "strict-event-emitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.4.tgz", + "integrity": "sha512-xIqTLS5azUH1djSUsLH9DbP6UnM/nI18vu8d43JigCQEoVsnY+mrlE+qv6kYqs6/1OkMnMIiL6ffedQSZStuoQ==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "version": "4.2.3" + "requires": { + "events": "^3.3.0" + } }, - "node_modules/string_decoder": { - "dependencies": { - "safe-buffer": "~5.2.0" - }, - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "string_decoder": { + "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "version": "1.3.0" + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/strip-ansi": { - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "version": "6.0.1" + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } }, - "node_modules/strip-bom": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "optional": true, - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "version": "3.0.0" + "requires": { + "ansi-regex": "^5.0.1" + } }, - "node_modules/strip-json-comments": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "version": "3.1.1" - }, - "node_modules/superagent": { - "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . Thanks to @shadowgate15, @spence-s, and @niftylettuce. Superagent is sponsored by Forward Email at .", - "engines": { - "node": ">= 4.0" - }, - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "version": "3.8.3" - }, - "node_modules/superagent/node_modules/debug": { - "dependencies": { - "ms": "^2.1.1" - }, - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "version": "3.2.7" - }, - "node_modules/superagent/node_modules/readable-stream": { - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "version": "2.3.7" + "optional": true }, - "node_modules/superagent/node_modules/safe-buffer": { - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "version": "5.1.2" + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true }, - "node_modules/superagent/node_modules/string_decoder": { - "dependencies": { - "safe-buffer": "~5.1.0" - }, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "version": "1.1.1" + "superagent": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", + "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" + } }, - "node_modules/superstruct": { - "dev": true, - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "superstruct": { + "version": "0.14.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "version": "0.14.2" + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", + "dev": true }, - "node_modules/supports-color": { - "dependencies": { - "has-flag": "^4.0.0" - }, - "dev": true, - "engines": { - "node": ">=8" - }, - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "supports-color": { + "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "version": "7.2.0" - }, - "node_modules/table": { - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "version": "6.8.0" + "requires": { + "has-flag": "^4.0.0" + } }, - "node_modules/table/node_modules/ajv": { - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - }, - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "version": "8.11.0" + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true }, - "node_modules/table/node_modules/json-schema-traverse": { + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "version": "1.0.0" + "optional": true, + "peer": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } }, - "node_modules/text-encoding-utf-8": { - "dev": true, - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", + "text-encoding-utf-8": { + "version": "1.0.2", "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "version": "1.0.2" + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", + "dev": true }, - "node_modules/text-table": { - "dev": true, - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "text-table": { + "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "version": "0.2.0" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, - "node_modules/through": { - "dev": true, - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "through": { + "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "version": "2.3.8" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, - "node_modules/tiny-secp256k1": { - "dependencies": { + "tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "dev": true, + "requires": { "bindings": "^1.3.0", "bn.js": "^4.11.8", "create-hmac": "^1.1.7", "elliptic": "^6.4.0", "nan": "^2.13.2" - }, - "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "hasInstallScript": true, - "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "version": "1.1.6" + } }, - "node_modules/tmp": { - "dependencies": { - "rimraf": "^3.0.0" - }, - "dev": true, - "engines": { - "node": ">=8.17.0" - }, - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "version": "0.2.1" + "tinypool": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.1.3.tgz", + "integrity": "sha512-2IfcQh7CP46XGWGGbdyO4pjcKqsmVqFAPcXfPxcPXmOWt9cYkTP9HcDmGgsfijYoAEc4z9qcpM/BaBz46Y9/CQ==", + "dev": true }, - "node_modules/to-regex-range": { - "dependencies": { - "is-number": "^7.0.0" - }, + "tinyspy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-0.3.2.tgz", + "integrity": "sha512-2+40EP4D3sFYy42UkgkFFB+kiX2Tg3URG/lVvAZFfLxgGpnWl5qQJuBw1gaLttq8UOS+2p3C0WrhJnQigLTT2Q==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, - "engines": { - "node": ">=8.0" - }, - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "version": "5.0.1" + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } }, - "node_modules/tough-cookie": { - "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" - }, - "dev": true, - "engines": { - "node": ">=0.8" - }, - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "version": "2.5.0" + } }, - "node_modules/tr46": { - "dev": true, - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "tr46": { + "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "version": "0.0.3" + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true }, - "node_modules/ts-mocha": { - "bin": { - "ts-mocha": "bin/ts-mocha" - }, - "dependencies": { - "ts-node": "7.0.1" - }, + "ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", "dev": true, - "engines": { - "node": ">= 6.X.X" - }, - "integrity": "sha512-WyQjvnzwrrubl0JT7EC1yWmNpcsU3fOuBFfdps30zbmFBgKniSaSOyZMZx+Wq7kytUs5CY+pEbSYEbGfIKnXTw==", - "optionalDependencies": { + "requires": { + "ts-node": "7.0.1", "tsconfig-paths": "^3.5.0" - }, - "peerDependencies": { - "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X" - }, - "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-9.0.2.tgz", - "version": "9.0.2" + } }, - "node_modules/ts-node": { - "bin": { - "ts-node": "dist/bin.js" - }, - "dependencies": { + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", "diff": "^3.1.0", @@ -10300,317 +15382,333 @@ "source-map-support": "^0.5.6", "yn": "^2.0.0" }, - "dev": true, - "engines": { - "node": ">=4.2.0" - }, - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "version": "7.0.1" + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + } + } }, - "node_modules/ts-node/node_modules/diff": { + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, - "engines": { - "node": ">=0.3.1" - }, - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "version": "3.5.0" - }, - "node_modules/tsconfig-paths": { - "dependencies": { + "optional": true, + "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dev": true, - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", - "optional": true, - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "version": "3.12.0" + } }, - "node_modules/tslib": { - "dev": true, - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "tslib": { + "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "version": "1.14.1" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, - "node_modules/tsutils": { - "dependencies": { - "tslib": "^1.8.1" - }, - "dev": true, - "engines": { - "node": ">= 6" - }, - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - }, + "tsutils": { + "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "version": "3.21.0" - }, - "node_modules/tunnel-agent": { - "dependencies": { - "safe-buffer": "^5.0.1" - }, + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "engines": { - "node": "*" - }, - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "peer": true, - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "version": "0.6.0" + "requires": { + "tslib": "^1.8.1" + } }, - "node_modules/tweetnacl": { - "dev": true, - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "tweetnacl": { + "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "version": "1.0.3" + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true }, - "node_modules/type-check": { - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "dev": true, - "engines": { - "node": ">= 0.8.0" - }, - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "type-check": { + "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "version": "0.4.0" - }, - "node_modules/type-detect": { + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "version": "4.0.8" + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, - "node_modules/type-fest": { - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "type-fest": { + "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "version": "0.20.2" + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true }, - "node_modules/typeforce": { - "dev": true, - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "typeforce": { + "version": "1.18.0", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "version": "1.18.0" + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "dev": true + }, + "typescript": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", + "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true }, - "node_modules/typescript": { - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "engines": { - "node": ">=4.2.0" - }, - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "version": "4.5.5" - }, - "node_modules/uri-js": { - "dependencies": { + "requires": { "punycode": "^2.1.0" - }, - "dev": true, - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "version": "4.4.1" + } }, - "node_modules/utf-8-validate": { - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "dev": true, - "engines": { - "node": ">=6.14.2" - }, - "hasInstallScript": true, - "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==", + "utf-8-validate": { + "version": "5.0.8", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz", - "version": "5.0.8" + "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==", + "dev": true, + "requires": { + "node-gyp-build": "^4.3.0" + } }, - "node_modules/util-deprecate": { - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "util-deprecate": { + "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "version": "1.0.2" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "node_modules/uuid": { - "bin": { - "uuid": "dist/bin/uuid" - }, - "dev": true, - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "uuid": { + "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "version": "8.3.2" + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true }, - "node_modules/v8-compile-cache": { - "dev": true, - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "v8-compile-cache": { + "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "version": "2.3.0" + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, - "node_modules/varuint-bitcoin": { - "dependencies": { - "safe-buffer": "^5.1.1" - }, + "v8-to-istanbul": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", + "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", "dev": true, - "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "optional": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.7", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "varuint-bitcoin": { + "version": "1.1.2", "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", - "version": "1.1.2" + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } }, - "node_modules/verror": { - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, + "vite": { + "version": "2.9.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz", + "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==", "dev": true, - "engines": [ - "node >=0.6.0" - ], - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "peer": true, - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "version": "1.10.0" + "requires": { + "esbuild": "^0.14.27", + "fsevents": "~2.3.2", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": "^2.59.0" + } }, - "node_modules/verror/node_modules/core-util-is": { + "vitest": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.15.1.tgz", + "integrity": "sha512-NaNFi93JKSuvV4YGnfQ0l0GKYxH0EsLcTrrXaCzd6qfVEZM/RJpjwSevg6waNFqu2DyN6e0aHHdrCZW5/vh5NA==", "dev": true, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "peer": true, - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "version": "1.0.2" + "requires": { + "@types/chai": "^4.3.1", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "chai": "^4.3.6", + "debug": "^4.3.4", + "local-pkg": "^0.4.1", + "tinypool": "^0.1.3", + "tinyspy": "^0.3.2", + "vite": "^2.9.12" + } }, - "node_modules/webidl-conversions": { + "vue-eslint-parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", "dev": true, - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "requires": { + "debug": "^4.3.2", + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.5" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "version": "3.0.1" + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true }, - "node_modules/whatwg-url": { - "dependencies": { + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" - }, - "dev": true, - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "version": "5.0.0" + } }, - "node_modules/which": { - "bin": { - "node-which": "bin/node-which" - }, - "dependencies": { - "isexe": "^2.0.0" - }, - "dev": true, - "engines": { - "node": ">= 8" - }, - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "which": { + "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "version": "2.0.2" - }, - "node_modules/wif": { - "dependencies": { - "bs58check": "<3.0.0" - }, + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "version": "2.0.6" + "requires": { + "isexe": "^2.0.0" + } }, - "node_modules/word-wrap": { + "wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "requires": { + "bs58check": "<3.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "version": "1.2.3" + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, - "node_modules/workerpool": { + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true, - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "version": "6.2.0" + "peer": true }, - "node_modules/wrap-ansi": { - "dependencies": { + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - }, - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "version": "7.0.0" + } }, - "node_modules/wrappy": { - "dev": true, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "wrappy": { + "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "version": "1.0.2" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/ws": { - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - }, + "ws": { + "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "version": "7.5.7" - }, - "node_modules/y18n": { + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "requires": {} + }, + "y18n": { + "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "version": "5.0.8" + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true }, - "node_modules/yallist": { - "dev": true, - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "yallist": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "version": "4.0.0" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yargs": { - "dependencies": { + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "peer": true, + "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -10618,61 +15716,40 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" - }, - "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "version": "16.2.0" + } }, - "node_modules/yargs-parser": { - "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "yargs-parser": { + "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "version": "20.2.4" + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "peer": true }, - "node_modules/yargs-unparser": { - "dependencies": { + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "peer": true, + "requires": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" - }, - "dev": true, - "engines": { - "node": ">=10" - }, - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "version": "2.0.0" + } }, - "node_modules/yn": { - "dev": true, - "engines": { - "node": ">=4" - }, - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "yn": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "version": "2.0.0" + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true }, - "node_modules/yocto-queue": { - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "yocto-queue": { + "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "version": "0.1.0" + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "peer": true } - }, - "requires": true, - "version": "2.0.0" + } } diff --git a/package.json b/package.json index f9e47562..3ec46fa9 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,31 @@ { "name": "gridplus-sdk", - "version": "2.0.0", + "version": "2.1.0", "description": "SDK to interact with GridPlus Lattice1 device", "scripts": { "build": "NODE_ENV=production tsc -p tsconfig.json", "commit": "git-cz", "lint:fix": "eslint --fix src test --ext .ts", "lint": "eslint src test --ext .ts", - "postinstall": "", + "postinstall": "patch-package", "precommit": "npm run lint:fix && npm run test", "prepublish": "", - "test": "ts-mocha --timeout 120000 -R spec test/testAll.ts --recursive --exit", - "test-btc": "ts-mocha --timeout 180000 -R spec test/testBtc.ts --recursive --exit", - "test-chaos-monkey": "ts-mocha --timeout 300000 -R spec test/testChaosMonkey.ts --recursive --exit", - "test-eth-msg": "ts-mocha --timeout 180000 -R spec test/testEthMsg.ts --recursive --exit", - "test-kv": "ts-mocha --timeout 180000 -R spec test/testKv.ts --recursive --exit", - "test-non-exportable": "ts-mocha --timeout 300000 -R spec test/testNonExportable.ts --recursive --exit", - "test-signing": "ts-mocha --timeout 120000 -R spec test/signing/index.ts --recursive --exit", - "test-wallet-jobs": "ts-mocha --timeout 300000 -R spec test/testWalletJobs.ts --recursive --exit" + "test": "vitest src/__test__/unit", + "unit-decode": "vitest src/__test__/unit/decoders.test.ts", + "unit-decrypt": "vitest src/__test__/unit/decrypters.test.ts", + "unit-encode": "vitest src/__test__/unit/encoders.test.ts", + "unit-encrypt": "vitest src/__test__/unit/encrypters.test.ts", + "unit-validators": "vitest src/__test__/unit/validators.test.ts", + "test-int": "vitest src/__test__/integration/", + "test-utils": "vitest src/__test__/utils/__test__/", + "e2e": "vitest src/__test__/e2e", + "e2e-btc": "vitest src/__test__/e2e/btc.test.ts", + "e2e-eth": "vitest src/__test__/e2e/eth.msg.test.ts", + "e2e-gen": "vitest src/__test__/e2e/general.test.ts", + "e2e-kv": "vitest src/__test__/e2e/kv.test.ts", + "e2e-ne": "vitest src/__test__/e2e/non-exportable.test.ts", + "e2e-sign": "vitest src/__test__/e2e/signing/signing.test.ts", + "e2e-wj": "vitest src/__test__/e2e/wallet-jobs.test.ts" }, "main": "./dist/index.js", "repository": { @@ -35,21 +43,27 @@ "bs58check": "^2.1.2", "buffer": "^5.6.0", "crc-32": "^1.2.0", - "elliptic": "6.5.4", + "elliptic": "^6.5.4", "eth-eip712-util-browser": "^0.0.3", "hash.js": "^1.1.7", "js-sha3": "^0.8.0", "rlp": "^3.0.0", "secp256k1": "4.0.2", - "superagent": "^3.8.3" + "superagent": "^7.1.3" }, "devDependencies": { + "@babel/core": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@babel/preset-typescript": "^7.17.12", "@ethersproject/abi": "^5.5.0", "@ethersproject/transactions": "^5.5.0", "@solana/web3.js": "^1.34.0", "@terra-money/terra.js": "^3.0.7", + "@types/elliptic": "^6.4.14", "@types/expect": "^24.3.0", - "@types/mocha": "^9.0.0", + "@types/random-words": "^1.1.2", + "@types/readline-sync": "^1.4.4", + "@types/seedrandom": "^3.0.2", "@types/superagent": "^4.1.15", "@typescript-eslint/eslint-plugin": "^5.10.0", "@typescript-eslint/parser": "^5.10.0", @@ -60,22 +74,25 @@ "chai": "^4.2.0", "dotenv": "^16.0.0", "ed25519-hd-key": "^1.2.0", + "enquirer": "^2.3.6", + "eslint": "^8.7.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", - "eslint": "^8.7.0", "ethereumjs-util": "^7.1.4", "jsonc": "^2.0.0", "lodash": ">=4.17.21", "minimist": ">=0.2.1", - "mocha": "^9.2.0", - "prettier-eslint": "^13.0.0", + "msw": "^0.42.0", + "patch-package": "^6.4.7", "prettier": "^2.6.2", + "prettier-eslint": "^15.0.1", "random-words": "^1.1.1", "readline-sync": "^1.4.9", "request-promise": "^4.2.6", "seedrandom": "^3.0.5", - "ts-mocha": "^9.0.2", - "typescript": "^4.5.4" + "ts-mocha": "^10.0.0", + "typescript": "^4.7.0", + "vitest": "^0.15.1" }, "files": [ "dist" diff --git a/src/__test__/e2e/btc.test.ts b/src/__test__/e2e/btc.test.ts new file mode 100644 index 00000000..ec95fbac --- /dev/null +++ b/src/__test__/e2e/btc.test.ts @@ -0,0 +1,193 @@ +import { getPrng, getTestnet } from '../utils/getters'; +// You must have `FEATURE_TEST_RUNNER=0` enabled in firmware to run these tests. +import bip32 from 'bip32'; +import { + BTC_PURPOSE_P2PKH, + BTC_PURPOSE_P2SH_P2WPKH, + BTC_PURPOSE_P2WPKH, + copyBuffer, + deserializeExportSeedJobResult, + jobTypes, + parseWalletJobResp, + serializeJobData, + setup_btc_sig_test, + stripDER +} from '../utils/helpers'; +import { initializeClient } from '../utils/initializeClient'; +import { testRequest } from '../utils/testRequest'; + +const prng = getPrng(); +const TEST_TESTNET = !!getTestnet() || false; +const client = initializeClient(); +let wallet: Wallet | null = null; +type InputObj = { hash: string, value: number, signerIdx: number, idx: number }; + +// Build the inputs. By default we will build 10. Note that there are `n` tests for +// *each category*, where `n` is the number of inputs. +function rand32Bit () { + return Math.floor(prng.quick() * 2 ** 32); +} +const inputs: InputObj[] = []; +const count = 10; +for (let i = 0; i < count; i++) { + const hash = Buffer.alloc(32); + for (let j = 0; j < 8; j++) { + // 32 bits of randomness per call + hash.writeUInt32BE(rand32Bit(), j * 4); + } + const value = Math.floor(rand32Bit()); + const signerIdx = Math.floor(prng.quick() * 19); // Random signer (keep it inside initial cache of 20) + const idx = Math.floor(prng.quick() * 25); // Random previous output index (keep it small) + inputs.push({ hash: hash.toString('hex'), value, signerIdx, idx }); +} + +async function testSign ({ txReq, signingKeys, sigHashes }: any) { + const tx = await client.sign(txReq); + const len = tx?.sigs?.length ?? 0 + expect(len).toEqual(signingKeys.length); + expect(len).toEqual(sigHashes.length); + for (let i = 0; i < len; i++) { + const sig = stripDER(tx.sigs?.[i]); + const verification = signingKeys[i].verify(sigHashes[i], sig); + expect(verification).toEqualElseLog( + true, + `Signature validation failed for priv=${signingKeys[ + i + ].privateKey.toString('hex')}, ` + + `hash=${sigHashes[i].toString('hex')}, sig=${sig.toString('hex')}`, + ); + } +} + +async function runTestSet ( + opts: any, + wallet: Wallet | null, + inputsSlice: InputObj[], +) { + expect(wallet).not.toEqualElseLog(null, 'Wallet not available'); + if (TEST_TESTNET) { + // Testnet + change + opts.isTestnet = true; + opts.useChange = true; + await testSign(setup_btc_sig_test(opts, wallet, inputsSlice, prng)); + // Testnet + no change + opts.isTestnet = true; + opts.useChange = false; + await testSign(setup_btc_sig_test(opts, wallet, inputsSlice, prng)); + } + // Mainnet + change + opts.isTestnet = false; + opts.useChange = true; + await testSign(setup_btc_sig_test(opts, wallet, inputsSlice, prng)); + // Mainnet + no change + opts.isTestnet = false; + opts.useChange = false; + await testSign(setup_btc_sig_test(opts, wallet, inputsSlice, prng)); +} + +describe('Bitcoin', () => { + describe('wallet seeds', () => { + it('Should get GP_SUCCESS for a known, connected wallet', async () => { + const activeWalletUID = client.getActiveWallet()?.uid; + expect(activeWalletUID).not.toEqualElseLog(null, 'No wallet found'); + const jobType = jobTypes.WALLET_JOB_EXPORT_SEED; + const jobData = {}; + const jobReq = { + client, + testID: 0, // wallet_job test ID + payload: serializeJobData(jobType, activeWalletUID, jobData), + }; + const res = await testRequest(jobReq); + //@ts-expect-error - accessing private property + const _res = parseWalletJobResp(res, client.fwVersion); + expect(_res.resultStatus).toEqual(0); + const data = deserializeExportSeedJobResult(_res.result); + const activeWalletSeed = copyBuffer(data.seed); + wallet = bip32.fromSeed(activeWalletSeed); + }); + }); + + for (let i = 0; i < inputs.length; i++) { + const inputsSlice = inputs.slice(0, i + 1); + + describe(`Input Set ${i}`, () => { + describe('segwit spender (p2wpkh)', function () { + it('p2wpkh->p2pkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2WPKH, + recipientPurpose: BTC_PURPOSE_P2PKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + + it('p2wpkh->p2sh-p2wpkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2WPKH, + recipientPurpose: BTC_PURPOSE_P2SH_P2WPKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + + it('p2wpkh->p2wpkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2WPKH, + recipientPurpose: BTC_PURPOSE_P2WPKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + }); + + describe('wrapped segwit spender (p2sh-p2wpkh)', function () { + it('p2sh-p2wpkh->p2pkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2SH_P2WPKH, + recipientPurpose: BTC_PURPOSE_P2PKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + + it('p2sh-p2wpkh->p2sh-p2wpkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2SH_P2WPKH, + recipientPurpose: BTC_PURPOSE_P2SH_P2WPKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + + it('p2sh-p2wpkh->p2wpkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2SH_P2WPKH, + recipientPurpose: BTC_PURPOSE_P2WPKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + }); + + describe('legacy spender (p2pkh)', function () { + it('p2pkh->p2pkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2PKH, + recipientPurpose: BTC_PURPOSE_P2PKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + + it('p2pkh->p2sh-p2wpkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2PKH, + recipientPurpose: BTC_PURPOSE_P2SH_P2WPKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + + it('p2pkh->p2wpkh', async () => { + const opts = { + spenderPurpose: BTC_PURPOSE_P2PKH, + recipientPurpose: BTC_PURPOSE_P2WPKH, + }; + await runTestSet(opts, wallet, inputsSlice); + }); + }); + }) + } +}); diff --git a/src/__test__/e2e/eth.msg.test.ts b/src/__test__/e2e/eth.msg.test.ts new file mode 100644 index 00000000..2f17616e --- /dev/null +++ b/src/__test__/e2e/eth.msg.test.ts @@ -0,0 +1,1211 @@ +/** Tests for ETH transaction edge cases + * NOTE: You must run the following BEFORE executing these tests: + * + * 1. Pair with the device once. This will ask you for your deviceID, which will act as a salt for + * your pairing: + * + * env REUSE_KEY=1 npm run test + * + * 2. Connect with the same deviceID you specfied in 1: + * + * env DEVICE_ID='' npm test + * + * After you do the above, you can run this test with `npm run test-eth` + * + * NOTE: It is highly suggested that you set `AUTO_SIGN_DEV_ONLY=1` in the firmware root + * CMakeLists.txt file (for dev units) + */ + +import { HARDENED_OFFSET } from '../../constants'; +import { randomBytes } from '../../util'; +import { buildEthMsgReq, buildRandomMsg } from '../utils/builders'; +import { getN } from '../utils/getters'; +import { initializeClient } from '../utils/initializeClient'; +import { runEthMsg } from '../utils/runners'; + +const client = initializeClient(); +const numRandom = getN() ? getN() : 20; // Number of random tests to conduct + +describe('ETH Messages', () => { + describe('Test ETH personalSign', function () { + it('Should throw error when message contains non-ASCII characters', async () => { + const protocol = 'signPersonal'; + const msg = '⚠️'; + const msg2 = 'ASCII plus ⚠️'; + await expect(client.sign(buildEthMsgReq(msg, protocol))).rejects.toThrow( + /Lattice can only display ASCII/, + ); + await expect(client.sign(buildEthMsgReq(msg2, protocol))).rejects.toThrow( + /Lattice can only display ASCII/, + ); + }); + + it('Should test ASCII buffers', async () => { + await runEthMsg( + buildEthMsgReq(Buffer.from('i am an ascii buffer'), 'signPersonal'), + client, + ); + await runEthMsg( + buildEthMsgReq(Buffer.from('{\n\ttest: foo\n}'), 'signPersonal'), + client, + ); + }); + + it('Should test hex buffers', async () => { + await runEthMsg( + buildEthMsgReq(Buffer.from('abcdef', 'hex'), 'signPersonal'), + client, + ); + }); + + it('Should test a message that needs to be prehashed', async () => { + await runEthMsg( + buildEthMsgReq(randomBytes(4000), 'signPersonal'), + client, + ); + }); + + it('Msg: sign_personal boundary conditions and auto-rejected requests', async () => { + const protocol = 'signPersonal'; + const fwConstants = client.getFwConstants(); + // `personal_sign` requests have a max size smaller than other requests because a header + // is displayed in the text region of the screen. The size of this is captured + // by `fwConstants.personalSignHeaderSz`. + const maxMsgSz = + fwConstants.ethMaxMsgSz + + fwConstants.personalSignHeaderSz + + fwConstants.extraDataMaxFrames * fwConstants.extraDataFrameSz; + const maxValid = `0x${randomBytes(maxMsgSz).toString('hex')}`; + const minInvalid = `0x${randomBytes(maxMsgSz + 1).toString('hex')}`; + const zeroInvalid = '0x'; + // The largest non-hardened index which will take the most chars to print + const x = HARDENED_OFFSET - 1; + // Okay sooo this is a bit awkward. We have to use a known coin_type here (e.g. ETH) + // or else firmware will return an error, but the maxSz is based on the max length + // of a path, which is larger than we can actually print. + // I guess all this tests is that the first one is shown in plaintext while the second + // one (which is too large) gets prehashed. + const largeSignPath = [x, HARDENED_OFFSET + 60, x, x, x] as SigningPath; + await runEthMsg( + buildEthMsgReq(maxValid, protocol, largeSignPath), + client, + ); + await runEthMsg( + buildEthMsgReq(minInvalid, protocol, largeSignPath), + client, + ); + // Using a zero length payload should auto-reject + await expect( + client.sign(buildEthMsgReq(zeroInvalid, protocol)), + ).rejects.toThrow(/Invalid request/); + }); + + describe(`Test ${numRandom} random payloads`, () => { + for (let i = 0; i < numRandom; i++) { + it(`Payload: ${i}`, async () => { + await runEthMsg( + buildEthMsgReq( + buildRandomMsg('signPersonal', client), + 'signPersonal', + ), + client, + ); + }); + } + }); + }); + + describe('Test ETH EIP712', function () { + it('Should test a message that needs to be prehashed', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + ], + dYdX: [ + { type: 'string', name: 'action' }, + { type: 'string', name: 'onlySignOn' }, + ], + }, + domain: { + name: 'dYdX', + version: '1.0', + chainId: '1', + }, + primaryType: 'dYdX', + message: { + action: 'dYdX STARK Key', + onlySignOn: randomBytes(4000).toString('hex'), + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test simple dydx example', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + ], + dYdX: [ + { type: 'string', name: 'action' }, + { type: 'string', name: 'onlySignOn' }, + ], + }, + domain: { + name: 'dYdX', + version: '1.0', + chainId: '1', + }, + primaryType: 'dYdX', + message: { + action: 'dYdX STARK Key', + onlySignOn: 'https://trade.dydx.exchange', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a Loopring message with non-standard numerical type', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + AccountUpdate: [ + { name: 'owner', type: 'address' }, + { name: 'accountID', type: 'uint32' }, + { name: 'feeTokenID', type: 'uint16' }, + { name: 'maxFee', type: 'uint96' }, + { name: 'publicKey', type: 'uint256' }, + { name: 'validUntil', type: 'uint32' }, + { name: 'nonce', type: 'uint32' }, + ], + }, + primaryType: 'AccountUpdate', + domain: { + name: 'Loopring Protocol', + version: '3.6.0', + chainId: 1, + verifyingContract: '0x0BABA1Ad5bE3a5C0a66E7ac838a129Bf948f1eA4', + }, + message: { + owner: '0x8c3b776bdac9a7a4facc3cc20cdb40832bff9005', + accountID: 32494, + feeTokenID: 0, + maxFee: 100, + publicKey: + '11413934541425201845815969801249874136651857829494005371571206042985258823663', + validUntil: 1631655383, + nonce: 0, + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a large 1inch transaction', async () => { + const msg = { + domain: { + chainId: 137, + name: '1inch Limit Order Protocol', + verifyingContract: '0xb707d89d29c189421163515c59e42147371d6857', + version: '1', + }, + message: { + getMakerAmount: + '0xf4a215c30000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000018fae27693b40000', + getTakerAmount: + '0x296637bf0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000018fae27693b40000', + interaction: '0x', + makerAsset: '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', + makerAssetData: + '0x23b872dd0000000000000000000000003e3e2ccdd7bae6bbd4a64e8d16ca8842061335eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000', + permit: '0x', + predicate: + '0x961d5b1e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b707d89d29c189421163515c59e42147371d6857000000000000000000000000b707d89d29c189421163515c59e42147371d68570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000044cf6fc6e30000000000000000000000003e3e2ccdd7bae6bbd4a64e8d16ca8842061335eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002463592c2b00000000000000000000000000000000000000000000000000000000613e28e500000000000000000000000000000000000000000000000000000000', + salt: '885135864076', + takerAsset: '0x8f3cf7ad23cd3cadbd9735aff958023239c6a063', + takerAssetData: + '0x23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e3e2ccdd7bae6bbd4a64e8d16ca8842061335eb00000000000000000000000000000000000000000000000018fae27693b40000', + }, + primaryType: 'Order', + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Order: [ + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAsset', + type: 'address', + }, + { + name: 'takerAsset', + type: 'address', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + { + name: 'getMakerAmount', + type: 'bytes', + }, + { + name: 'getTakerAmount', + type: 'bytes', + }, + { + name: 'predicate', + type: 'bytes', + }, + { + name: 'permit', + type: 'bytes', + }, + { + name: 'interaction', + type: 'bytes', + }, + ], + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test an example with 0 values', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'host', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Test: [ + { name: 'owner', type: 'string' }, + { name: 'testArray', type: 'uint256[]' }, + ], + }, + domain: { + name: 'Opensea on Matic', + verifyingContract: '0x0', + version: '1', + chainId: '', + host: '', + }, + primaryType: 'Test', + message: { + owner: '0x56626bd0d646ce9da4a12403b2c1ba00fb9e1c43', + testArray: [], + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test canonical EIP712 example', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'address' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 12, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'foobar', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test canonical EIP712 example with 2nd level nesting', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Wallet: [ + { name: 'address', type: 'address' }, + { name: 'balance', type: 'uint256' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'Wallet' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 12, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: { + address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + balance: '0x12345678', + }, + }, + to: { + name: 'Bob', + wallet: { + address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + balance: '0xabcdef12', + }, + }, + contents: 'foobar', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test canonical EIP712 example with 3rd level nesting', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Wallet: [ + { name: 'address', type: 'address' }, + { name: 'balance', type: 'Balance' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'Wallet' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + Balance: [ + { name: 'value', type: 'uint256' }, + { name: 'currency', type: 'string' }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 12, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: { + address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + balance: { + value: '0x12345678', + currency: 'ETH', + }, + }, + }, + to: { + name: 'Bob', + wallet: { + address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + balance: { + value: '0xabcdef12', + currency: 'UNI', + }, + }, + }, + contents: 'foobar', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test canonical EIP712 example with 3rd level nesting and params in a different order', async () => { + const msg = { + types: { + Balance: [ + { name: 'value', type: 'uint256' }, + { name: 'currency', type: 'string' }, + ], + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'Wallet' }, + ], + Wallet: [ + { name: 'address', type: 'address' }, + { name: 'balance', type: 'Balance' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 12, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + contents: 'foobar', + from: { + name: 'Cow', + wallet: { + address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + balance: { + value: '0x12345678', + currency: 'ETH', + }, + }, + }, + to: { + name: 'Bob', + wallet: { + address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + balance: { + value: '0xabcdef12', + currency: 'UNI', + }, + }, + }, + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a payload with an array type', async () => { + const msg = { + types: { + EIP712Domain: [{ name: 'name', type: 'string' }], + UserVotePayload: [ + { + name: 'allocations', + type: 'UserVoteAllocationItem[]', + }, + ], + UserVoteAllocationItem: [ + { + name: 'reactorKey', + type: 'bytes32', + }, + { + name: 'amount', + type: 'uint256', + }, + ], + }, + primaryType: 'UserVotePayload', + domain: { + name: 'Tokemak Voting', + version: '1', + chainId: 1, + verifyingContract: '0x4495982ea5ed9c1b7cec37434cbf930b9472e823', + }, + message: { + allocations: [ + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + amount: '1', + }, + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + amount: '2', + }, + ], + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test multiple array types', async () => { + const msg = { + types: { + EIP712Domain: [{ name: 'name', type: 'string' }], + UserVotePayload: [ + { + name: 'integer', + type: 'uint256', + }, + { + name: 'allocations', + type: 'UserVoteAllocationItem[]', + }, + { + name: 'dummy', + type: 'uint256', + }, + { + name: 'integerArray', + type: 'uint256[]', + }, + ], + UserVoteAllocationItem: [ + { + name: 'reactorKey', + type: 'bytes32', + }, + { + name: 'amount', + type: 'uint256', + }, + ], + }, + primaryType: 'UserVotePayload', + domain: { + name: 'Tokemak Voting', + }, + message: { + integer: 56, + allocations: [ + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + amount: '1', + }, + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + amount: '2', + }, + ], + dummy: 52, + integerArray: [1, 2, 3], + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a nested array', async () => { + const msg = { + types: { + EIP712Domain: [{ name: 'name', type: 'string' }], + UserVotePayload: [ + { + name: 'allocations', + type: 'UserVoteAllocationItem[]', + }, + ], + UserVoteAllocationItem: [ + { + name: 'reactorKey', + type: 'bytes32', + }, + { + name: 'amount', + type: 'uint256[]', + }, + ], + }, + primaryType: 'UserVotePayload', + domain: { + name: 'Tokemak Voting', + }, + message: { + allocations: [ + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + amount: ['1', '2'], + }, + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + amount: ['2', '3'], + }, + ], + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a nested array of custom type', async () => { + const msg = { + types: { + EIP712Domain: [{ name: 'name', type: 'string' }], + DummyThing: [ + { + name: 'foo', + type: 'bytes', + }, + ], + UserVotePayload: [ + { + name: 'test', + type: 'string', + }, + { + name: 'athing', + type: 'uint32', + }, + { + name: 'allocations', + type: 'UserVoteAllocationItem[]', + }, + ], + UserVoteAllocationItem: [ + { + name: 'reactorKey', + type: 'bytes32', + }, + { + name: 'dummy', + type: 'DummyThing[]', + }, + ], + }, + primaryType: 'UserVotePayload', + domain: { + name: 'Tokemak Voting', + }, + message: { + athing: 5, + test: 'hello', + allocations: [ + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + dummy: [ + { + foo: '0xabcd', + }, + { + foo: '0x123456', + }, + ], + }, + { + reactorKey: + '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', + dummy: [ + { + foo: '0xdeadbeef', + }, + { + foo: '0x', + }, + ], + }, + ], + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a bunch of EIP712 data types', async () => { + const msg = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + PrimaryStuff: [ + { name: 'UINT8', type: 'uint8' }, + { name: 'UINT16', type: 'uint16' }, + { name: 'UINT32', type: 'uint32' }, + { name: 'UINT64', type: 'uint64' }, + { name: 'UINT256', type: 'uint256' }, + { name: 'BYTES1', type: 'bytes1' }, + { name: 'BYTES5', type: 'bytes5' }, + { name: 'BYTES7', type: 'bytes7' }, + { name: 'BYTES12', type: 'bytes12' }, + { name: 'BYTES16', type: 'bytes16' }, + { name: 'BYTES20', type: 'bytes20' }, + { name: 'BYTES21', type: 'bytes21' }, + { name: 'BYTES31', type: 'bytes31' }, + { name: 'BYTES32', type: 'bytes32' }, + { name: 'BYTES', type: 'bytes' }, + { name: 'STRING', type: 'string' }, + { name: 'BOOL', type: 'bool' }, + { name: 'ADDRESS', type: 'address' }, + ], + }, + primaryType: 'PrimaryStuff', + domain: { + name: 'Muh Domainz', + version: '1', + chainId: 270, + verifyingContract: '0xcc9c93cef8c70a7b46e32b3635d1a746ee0ec5b4', + }, + message: { + UINT8: '0xab', + UINT16: '0xb1d7', + UINT32: '0x80bb335b', + UINT64: '0x259528d5bc', + UINT256: '0xad2693f24ba507750d1763ebae3661c07504', + BYTES1: '0x2f', + BYTES5: '0x9485269fa5', + BYTES7: '0xc4e8d65ce8c3cf', + BYTES12: '0x358eb7b28e8e1643e7c4737f', + BYTES16: '0x7ace034ab088fdd434f1e817f32171a0', + BYTES20: '0x4ab51f2d5bfdc0f1b96f83358d5f356c98583573', + BYTES21: '0x6ecdc19b30c7fa712ba334458d77377b6a586bbab5', + BYTES31: + '0x06c21824a98643f96643b3220962f441210b007f4c19dfdf0dea53d097fc28', + BYTES32: + '0x59cfcbf35256451756b02fa644d3d0748bd98f5904febf3433e6df19b4df7452', + BYTES: + '0x0354b2c449772905b2598a93f5da69962f0444e0a6e2429e8f844f1011446f6fe81815846fb6ebe2d213968d1f8532749735f5702f565db0429b2fe596d295d9c06241389fe97fb2f3b91e1e0f2d978fb26e366737451f1193097bd0a2332e0bfc0cdb631005', + STRING: 'I am a string hello there human', + BOOL: true, + ADDRESS: '0x078a8d6eba928e7ea787ed48f71c5936aed4625d', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a payload with a nested type in multiple nesting levels', async () => { + const msg = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + ], + PrimaryType: [ + { + name: 'one', + type: 'Type1', + }, + { + name: 'zero', + type: 'Type0', + }, + ], + Type1: [ + { + name: '1s', + type: 'string', + }, + ], + Type0: [ + { + name: 'one', + type: 'Type1', + }, + ], + }, + primaryType: 'PrimaryType', + domain: { + name: 'Domain', + }, + message: { + one: { + '1s': 'nestedOne', + }, + zero: { + one: { + '1s': 'nestedTwo', + }, + }, + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a payload that requires use of extraData frames', async () => { + const msg = { + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Wallet: [ + { name: 'address', type: 'address' }, + { name: 'balance', type: 'Balance' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'Wallet' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + Balance: [ + { name: 'value', type: 'uint256' }, + { name: 'currency', type: 'string' }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 12, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: { + address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + balance: { + value: '0x12345678', + currency: 'ETH', + }, + }, + }, + to: { + name: 'Bob', + wallet: { + address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + balance: { + value: '0xabcdef12', + currency: 'UNI', + }, + }, + }, + contents: + 'stupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimes', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test a message with very large types', async () => { + const msg = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Order: [ + { + name: 'exchange', + type: 'address', + }, + { + name: 'maker', + type: 'address', + }, + { + name: 'taker', + type: 'address', + }, + { + name: 'makerRelayerFee', + type: 'uint256', + }, + { + name: 'takerRelayerFee', + type: 'uint256', + }, + { + name: 'makerProtocolFee', + type: 'uint256', + }, + { + name: 'takerProtocolFee', + type: 'uint256', + }, + { + name: 'feeRecipient', + type: 'address', + }, + { + name: 'feeMethod', + type: 'uint8', + }, + { + name: 'side', + type: 'uint8', + }, + { + name: 'saleKind', + type: 'uint8', + }, + { + name: 'target', + type: 'address', + }, + { + name: 'howToCall', + type: 'uint8', + }, + { + name: 'calldata', + type: 'bytes', + }, + { + name: 'replacementPattern', + type: 'bytes', + }, + { + name: 'staticTarget', + type: 'address', + }, + { + name: 'staticExtradata', + type: 'bytes', + }, + { + name: 'paymentToken', + type: 'address', + }, + { + name: 'basePrice', + type: 'uint256', + }, + { + name: 'extra', + type: 'uint256', + }, + { + name: 'listingTime', + type: 'uint256', + }, + { + name: 'expirationTime', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'nonce', + type: 'uint256', + }, + ], + }, + domain: { + name: 'Wyvern Exchange Contract', + version: '2.3', + chainId: 1, + verifyingContract: '0x7f268357a8c2552623316e2562d90e642bb538e5', + }, + primaryType: 'Order', + message: { + maker: '0x44fa5d521a02db7ce5a88842a6842496f84009bc', + exchange: '0x7f268357a8c2552623316e2562d90e642bb538e5', + taker: '0x0000000000000000000000000000000000000000', + makerRelayerFee: '750', + takerRelayerFee: '0', + makerProtocolFee: '0', + takerProtocolFee: '0', + feeRecipient: '0x5b3256965e7c3cf26e11fcaf296dfc8807c01073', + feeMethod: 1, + side: 1, + saleKind: 0, + target: '0xbaf2127b49fc93cbca6269fade0f7f31df4c88a7', + howToCall: 1, + calldata: + '0xfb16a59500000000000000000000000044fa5d521a02db7ce5a88842a6842496f84009bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a9f037d4cd7da318ab097a47acd4dea3abc083000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000', + replacementPattern: + '0x000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + staticTarget: '0x0000000000000000000000000000000000000000', + staticExtradata: '0x', + paymentToken: '0x0000000000000000000000000000000000000000', + basePrice: '1000000000000000000', + extra: '0', + listingTime: '1645233344', + expirationTime: '1645838240', + salt: '35033335384310326785897317545538185126505283328747281434561962939625063440824', + nonce: 0, + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + it('Should test random edge case #1', async () => { + // This was a randomly generated payload which caused an edge case. + // It has been slimmed down but definition structure is preserved. + const msg = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Primary_Click: [ + { + name: 'utility', + type: 'Expose', + }, + { + name: 'aisle', + type: 'Cancel', + }, + { + name: 'gym', + type: 'Razor', + }, + { + name: 'drift_patch_cable_bi', + type: 'bytes1', + }, + ], + Expose: [ + { + name: 'favorite', + type: 'bytes21', + }, + ], + Cancel: [ + { + name: 'clever', + type: 'uint200', + }, + ], + Razor: [ + { + name: 'private', + type: 'bytes2', + }, + ], + }, + primaryType: 'Primary_Click', + domain: { + name: 'Domain_Avocado_luggage_twel', + version: '1', + chainId: '0x324e', + verifyingContract: '0x69f758a7911448c2f7aa6df15ca27d69ffa1c6b7', + }, + message: { + utility: { + favorite: '0x891b56dc6ab87ab73cf69761183d499283f1925871', + }, + aisle: { + clever: '0x0102', + }, + gym: { + private: '0xbb42', + }, + drift_patch_cable_bi: '0xb4', + }, + }; + await runEthMsg(buildEthMsgReq(msg, 'eip712'), client); + }); + + describe(`test ${numRandom} random payloads`, () => { + for (let i = 0; i < numRandom; i++) { + it(`Payload #: ${i}`, async () => { + await runEthMsg( + buildEthMsgReq(buildRandomMsg('eip712', client), 'eip712'), + client, + ); + }); + } + }); + }); +}); diff --git a/src/__test__/e2e/general.test.ts b/src/__test__/e2e/general.test.ts new file mode 100644 index 00000000..563c0d9d --- /dev/null +++ b/src/__test__/e2e/general.test.ts @@ -0,0 +1,334 @@ +/** + * Tests for establishing a connection to a target Lattice and validating + * basic functionality. + * + * This test suite serves two purposes: + * + * 1. You need to run this before you can run any other tests. Run it with `REUSE_KEY=1` + * as an `env` param. This will ask you for a device ID and will attempt a pairing + * with the target Lattice. Note that the Lattice cannot already be paired so you may + * need to remove the SDK permission before proceeding to re-pair. After you pair, + * the connection will be cached locally and you can run subsequent tests with + * `DEVICE_ID=` as an `env` param. This includes *any* test, including + * this one. + * + * 2. You can run this to just validate basic connectivity. If you don't need to cache + * the connection you can run this without any `env` params and it will attempt to + * pair with a target Lattice. + */ +import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; +import { question } from 'readline-sync'; +import { + HARDENED_OFFSET, + responseCodes, + responseMsgs, +} from '../../constants'; +import { randomBytes } from '../../util'; +import { buildEthSignRequest } from '../utils/builders'; +import { getDeviceId } from '../utils/getters'; +import { + BTC_COIN, + BTC_PURPOSE_P2PKH, + BTC_PURPOSE_P2SH_P2WPKH, + BTC_PURPOSE_P2WPKH, + BTC_TESTNET_COIN, + ETH_COIN, + setupTestClient, +} from '../utils/helpers'; +import { initializeClient } from '../utils/initializeClient'; + +const id = getDeviceId(); +const client = initializeClient(); + +describe('General', () => { + it('Should test SDK dehydration/rehydration', async () => { + const addrData = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, BTC_COIN, HARDENED_OFFSET, 0, 0], + n: 1, + }; + + const client1 = setupTestClient(); + await client1.connect(id); + const addrs1 = await client1.getAddresses(addrData); + + const stateData = client1.getStateData(); + + const client2 = setupTestClient(null, stateData); + await client2.connect(id); + const addrs2 = await client2.getAddresses(addrData); + + expect(addrs1).toEqual(addrs2); + }); + + it('Should get addresses', async () => { + await client.connect(id); + const fwConstants = client.getFwConstants(); + const addrData = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, BTC_COIN, HARDENED_OFFSET, 0, 0], + n: 5, + }; + // Bitcoin addresses + // NOTE: The format of address will be based on the user's Lattice settings + // By default, this will be P2SH(P2WPKH), i.e. addresses that start with `3` + let addrs = await client.getAddresses(addrData); + expect(addrs.length).toEqual(5); + expect(addrs[0]?.[0]).toEqual('3'); + + // Ethereum addresses + addrData.startPath[0] = BTC_PURPOSE_P2PKH; + addrData.startPath[1] = ETH_COIN; + addrData.n = 1; + addrs = await client.getAddresses(addrData); + expect(addrs.length).toEqual(1); + expect(addrs[0]?.slice(0, 2)).toEqual('0x'); + // If firmware supports it, try shorter paths + if (fwConstants.flexibleAddrPaths) { + const flexData = { + startPath: [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET, 0], + n: 1, + }; + addrs = await client.getAddresses(flexData); + expect(addrs.length).toEqual(1); + expect(addrs[0]?.slice(0, 2)).toEqual('0x'); + } + // Should fail for non-EVM purpose and non-matching coin_type + addrData.startPath[0] = BTC_PURPOSE_P2WPKH; + addrData.n = 1; + await client.getAddresses(addrData); + // Switch to BTC coin. Should work now. + addrData.startPath[1] = BTC_COIN; + // Bech32 + addrs = await client.getAddresses(addrData); + expect(addrs.length).toEqual(1); + expect(addrs[0]?.slice(0, 3)).to.be.oneOf(['bc1']); + addrData.startPath[0] = BTC_PURPOSE_P2SH_P2WPKH; + addrData.n = 5; + + addrData.startPath[4] = 1000000; + addrData.n = 3; + addrs = await client.getAddresses(addrData); + expect(addrs.length).toEqual(addrData.n); + addrData.startPath[4] = 0; + addrData.n = 1; + + // Unsupported purpose (m//) + addrData.startPath[0] = 0; // Purpose 0 -- undefined + try { + addrs = await client.getAddresses(addrData); + } catch (err: any) { + expect(err.message).not.toEqual(null); + } + addrData.startPath[0] = BTC_PURPOSE_P2SH_P2WPKH; + + // Unsupported currency + addrData.startPath[1] = HARDENED_OFFSET + 5; // 5' currency - aka unknown + try { + addrs = await client.getAddresses(addrData); + throw new Error('Expected failure but got success.'); + } catch (err: any) { + expect(err.message).not.toEqual(null); + } + addrData.startPath[1] = BTC_COIN; + // Too many addresses (n>10) + addrData.n = 11; + try { + addrs = await client.getAddresses(addrData); + throw new Error('Expected failure but got success.'); + } catch (err: any) { + expect(err.message).not.toEqual(null); + } + }); + + describe('Should sign Ethereum transactions', () => { + it('should sign Legacy transactions', async () => { + const { req } = await buildEthSignRequest(client); + await client.sign(req); + }); + it('should sign newer transactions', async () => { + // Test data range + const { txData, req, maxDataSz, common } = await buildEthSignRequest( + client, + ); + // NOTE: This will display a prehashed payload for bridged general signing + // requests because `ethMaxDataSz` represents the `data` field for legacy + // requests, but it represents the entire payload for general signing requests. + txData.data = randomBytes(maxDataSz); + const tx = EthTxFactory.fromTxData(txData, { common }); + req.data.payload = tx.getMessageToSign(false); + await client.sign(req); + }); + + it('should sign bad transactions', async () => { + const { txData, req, maxDataSz, common } = await buildEthSignRequest( + client, + ); + await question( + 'Please REJECT the next request if the warning screen displays. Press enter to continue.', + ); + req.data.data = randomBytes(maxDataSz + 1); + const tx = EthTxFactory.fromTxData(txData, { common }); + req.data.payload = tx.getMessageToSign(false); + await expect(client.sign(req)).rejects.toThrow( + `${responseMsgs[responseCodes.RESP_ERR_USER_DECLINED]}`, + ); + }); + }); + + describe('Should sign Bitcoin transactions', () => { + it('Should sign legacy Bitcoin inputs', async () => { + const txData = { + prevOuts: [ + { + txHash: + '6e78493091f80d89a92ae3152df7fbfbdc44df09cf01a9b76c5113c02eaf2e0f', + value: 10000, + index: 1, + signerPath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 0, + 0, + ], + }, + ], + recipient: 'mhifA1DwiMPHTjSJM8FFSL8ibrzWaBCkVT', + value: 1000, + fee: 1000, + // isSegwit: false, // old encoding + changePath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 1, + 0, + ], + }; + const req = { + currency: 'BTC', + data: txData, + }; + + // Sign a legit tx + const sigResp = await client.sign(req); + expect(sigResp.tx).not.toEqual(null); + expect(sigResp.txHash).not.toEqual(null); + }); + + it('Should sign wrapped segwit Bitcoin inputs', async () => { + const txData = { + prevOuts: [ + { + txHash: + 'ab8288ef207f11186af98db115aa7120aa36ceb783e8792fb7b2f39c88109a99', + value: 10000, + index: 1, + signerPath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 0, + 0, + ], + }, + ], + recipient: '2NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE', + value: 1000, + fee: 1000, + changePath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 1, + 0, + ], + }; + const req = { + currency: 'BTC', + data: txData, + }; + // Sign a legit tx + const sigResp = await client.sign(req); + expect(sigResp.tx).not.toEqual(null); + expect(sigResp.txHash).not.toEqual(null); + }); + + it('Should sign wrapped segwit Bitcoin inputs to a bech32 address', async () => { + const txData = { + prevOuts: [ + { + txHash: + 'f93d0a77f58b4274d84f427d647f1f27e38b4db79fd975691e15109fde7ea06e', + value: 1802440, + index: 1, + signerPath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 1, + 0, + ], + }, + ], + recipient: 'tb1qym0z2a939lefrgw67ep5flhf43dvpg3h4s96tn', + value: 1000, + fee: 1000, + changePath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 1, + 0, + ], + }; + const req = { + currency: 'BTC', + data: txData, + }; + // Sign a legit tx + const sigResp = await client.sign(req); + expect(sigResp.tx).not.toEqual(null); + expect(sigResp.txHash).not.toEqual(null); + }); + + it('Should sign an input from a native segwit account', async () => { + const txData = { + prevOuts: [ + { + txHash: + 'b2efdbdd3340d2bc547671ce3993a6f05d70343c07578f9d7f5626fdfc06fa35', + value: 76800, + index: 0, + signerPath: [ + BTC_PURPOSE_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 0, + 0, + ], + }, + ], + recipient: '2N4gqWT4oqWL2gz9ps92z9fm2Bg3FUkqG7Q', + value: 70000, + fee: 4380, + isSegwit: true, + changePath: [ + BTC_PURPOSE_P2WPKH, + BTC_TESTNET_COIN, + HARDENED_OFFSET, + 1, + 0, + ], + }; + const req = { + currency: 'BTC', + data: txData, + }; + // Sign a legit tx + const sigResp = await client.sign(req); + expect(sigResp.tx).not.toEqual(null); + expect(sigResp.txHash).not.toEqual(null); + expect(sigResp.changeRecipient?.slice(0, 2)).toEqual('tb'); + }); + }); +}); diff --git a/test/testKv.ts b/src/__test__/e2e/kv.test.ts similarity index 54% rename from test/testKv.ts rename to src/__test__/e2e/kv.test.ts index 5e8e1e77..d9c27e29 100644 --- a/test/testKv.ts +++ b/src/__test__/e2e/kv.test.ts @@ -1,14 +1,20 @@ +import { DEFAULT_SIGNER } from '../utils/builders'; /** * Test kv (key-value) file functionality. These types of files are simple mappings * between a 64 byte key and a 64 byte value of any type. The main use case for these * at the time of writing is address tags. */ -import { expect } from 'chai'; import { question } from 'readline-sync'; -import { HARDENED_OFFSET, responseCodes, responseMsgs } from '../src/constants'; -import helpers from './testUtil/helpers'; -let client, id; -let continueTests = true; +import { + HARDENED_OFFSET, + responseCodes, + responseMsgs +} from '../../constants'; +import { BTC_PURPOSE_P2PKH, ETH_COIN } from '../utils/helpers'; +import { initializeClient } from '../utils/initializeClient'; + +const client = initializeClient(); + // Random address to test the screen with. // IMPORTANT NOTE: For Ethereum addresses you should always add the lower case variety since // requests come in at lower case @@ -16,19 +22,13 @@ const UNISWAP_ADDR = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'; const UNISWAP_TAG = 'Uniswap V2 Router'; const RANDOM_ADDR = '0x30da3d7A865C934b389c919c737510054111AB3A'; const RANDOM_TAG = 'Test Address Name'; -const REJECT_PROMPT_TEXT = 'Please reject if you do NOT see an address tag.' +const REJECT_PROMPT_TEXT = 'Please reject if you do NOT see an address tag.'; let _numStartingRecords = 0; -let _fetchedRecords = []; +let _fetchedRecords: any = []; const ETH_REQ = { currency: 'ETH', data: { - signerPath: [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ], + signerPath: DEFAULT_SIGNER, nonce: '0x02', gasPrice: '0x1fe5d61a00', gasLimit: '0x034e97', @@ -39,54 +39,10 @@ const ETH_REQ = { }, }; -describe('Test key-value files API', () => { - before(() => { - client = helpers.setupTestClient(process.env); - if (process.env.DEVICE_ID) id = process.env.DEVICE_ID; - }); - - beforeEach(() => { - expect(continueTests).to.equal(true, 'Error in previous test. Aborting.'); - continueTests = false; - }) - - //------------------------------------------- - // TESTS - //------------------------------------------- - it('Should connect to a Lattice', async () => { - // Again, we assume that if an `id` has already been set, we are paired - // with the hardcoded privkey above. - if (!process.env.DEVICE_ID) { - const _id = question('Please enter the ID of your test device: '); - id = _id; - const isPaired = await client.connect(id); - expect(isPaired).to.equal(false); - expect(client.isPaired).to.equal(false); - expect(client.hasActiveWallet()).to.equal(false); - } - continueTests = true; - }); - - it('Should attempt to pair with pairing secret', async () => { - if (!process.env.DEVICE_ID) { - const secret = question('Please enter the pairing secret: '); - await client.pair(secret); - expect(client.hasActiveWallet()).to.equal(true); - } - continueTests = true; - }); - - it('Should try to connect again but recognize the pairing already exists', async () => { - const isPaired = await client.connect(id); - expect(isPaired).to.equal(true); - expect(client.isPaired).to.equal(true); - expect(client.hasActiveWallet()).to.equal(true); - continueTests = true; - }); - +describe('key-value', () => { it('Should ask if the user wants to reset state', async () => { const answer = question( - 'Do you want to clear all kv records and start anew? (Y/N) ' + 'Do you want to clear all kv records and start anew? (Y/N) ', ); if (answer.toUpperCase() === 'Y') { let cont = true; @@ -96,36 +52,28 @@ describe('Test key-value files API', () => { if (data.total === numRmv) { cont = false; } else { - const ids = []; + const ids: string[] = []; for (let i = 0; i < Math.min(100, data.records.length); i++) { - ids.push(data.records[i].id); + ids.push(data?.records[i]?.id ?? ''); } - await client.removeKvRecords({ ids }) + await client.removeKvRecords({ ids }); } } } - continueTests = true; - }) + }); it('Should make a request to an unknown address', async () => { - try { - question(REJECT_PROMPT_TEXT); - await client.sign(ETH_REQ); - } catch (err) { - expect( - err.message.indexOf(responseMsgs[responseCodes.RESP_ERR_USER_DECLINED]) - ).to.not.equal( - -1, - `Expected rejection but got: ${err}` + question(REJECT_PROMPT_TEXT); + await client.sign(ETH_REQ).catch((err) => { + expect(err.message).toBe( + responseMsgs[responseCodes.RESP_ERR_USER_DECLINED], ); - continueTests = true; - } + }); }); it('Should get the initial set of records', async () => { const resp = await client.getKvRecords({ n: 2, start: 0 }); _numStartingRecords = resp.total; - continueTests = true; }); it('Should add some key value records', async () => { @@ -134,51 +82,28 @@ describe('Test key-value files API', () => { [RANDOM_ADDR]: RANDOM_TAG, }; await client.addKvRecords({ records, caseSensitive: false, type: 0 }); - continueTests = true; }); it('Should fail to add records with unicode characters', async () => { const badKey = { '0x🔥🦍': 'Muh name' }; const badVal = { UNISWAP_ADDR: 'val🔥🦍' }; - try { - await client.addKvRecords({ records: badKey }); - } catch (err) { - expect(err.message).to.not.equal( - null, - 'Should have failed to add Unicode key but did not' - ); - } - try { - await client.addKvRecords({ records: badVal }); - } catch (err) { - expect(err.message).to.not.equal( - null, - 'Should have failed to add Unicode key but did not' - ); - continueTests = true; - } + await expect(client.addKvRecords({ records: badKey })).rejects.toThrow( + 'Unicode characters are not supported.', + ); + await expect(client.addKvRecords({ records: badVal })).rejects.toThrow( + 'Unicode characters are not supported.', + ); }); it('Should fail to add zero length keys and values', async () => { const badKey = { '': 'Muh name' }; const badVal = { UNISWAP_ADDR: '' }; - try { - await client.addKvRecords({ records: badKey }); - } catch (err) { - expect(err.message).to.not.equal( - null, - 'Should have failed to add Unicode key but did not' - ); - } - try { - await client.addKvRecords({ records: badVal }); - } catch (err) { - expect(err.message).to.not.equal( - null, - 'Should have failed to add Unicode key but did not' - ); - continueTests = true; - } + await expect(client.addKvRecords({ records: badKey })).rejects.toThrow( + 'Keys and values must be >0 characters.', + ); + await expect(client.addKvRecords({ records: badVal })).rejects.toThrow( + 'Keys and values must be >0 characters.', + ); }); it('Should fetch the newly created records', async () => { @@ -187,19 +112,16 @@ describe('Test key-value files API', () => { start: _numStartingRecords, }; const resp = await client.getKvRecords(opts); - console.log(resp) const { records, total, fetched } = resp; _fetchedRecords = records; - expect(total).to.equal(fetched + _numStartingRecords); - expect(records.length).to.equal(fetched); - expect(records.length).to.equal(2); - continueTests = true; + expect(total).toEqual(fetched + _numStartingRecords); + expect(records.length).toEqual(fetched); + expect(records.length).toEqual(2); }); it('Should make a request to an address which is now known', async () => { question(REJECT_PROMPT_TEXT); await client.sign(ETH_REQ); - continueTests = true; }); it('Should make an EIP712 request that uses the record', async () => { @@ -228,8 +150,8 @@ describe('Test key-value files API', () => { currency: 'ETH_MSG', data: { signerPath: [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, + BTC_PURPOSE_P2PKH, + ETH_COIN, HARDENED_OFFSET, 0, 0, @@ -240,27 +162,24 @@ describe('Test key-value files API', () => { }; question(REJECT_PROMPT_TEXT); await client.sign(req); - continueTests = true; }); it('Should make a request with calldata', async () => { // TODO: Add decoder data const req = JSON.parse(JSON.stringify(ETH_REQ)); req.data.data = `0x23b872dd00000000000000000000000057974eb88e50cc61049b44e43e90d3bc40fa61c0000000000000000000000000${RANDOM_ADDR.slice( - 2 + 2, )}000000000000000000000000000000000000000000000000000000000000270f`; question(REJECT_PROMPT_TEXT); await client.sign(req); - continueTests = true; }); it('Should remove key value records', async () => { - const idsToRemove = []; - _fetchedRecords.forEach((r) => { + const idsToRemove: any[] = []; + _fetchedRecords.forEach((r: any) => { idsToRemove.push(r.id); }); await client.removeKvRecords({ ids: idsToRemove }); - continueTests = true; }); it('Should confirm the records we recently added are removed', async () => { @@ -270,10 +189,9 @@ describe('Test key-value files API', () => { }; const resp = await client.getKvRecords(opts); const { records, total, fetched } = resp; - expect(total).to.equal(_numStartingRecords); - expect(fetched).to.equal(0); - expect(records.length).to.equal(0); - continueTests = true; + expect(total).toEqual(_numStartingRecords); + expect(fetched).toEqual(0); + expect(records.length).toEqual(0); }); it('Should add the same record with case sensitivity', async () => { @@ -285,22 +203,15 @@ describe('Test key-value files API', () => { caseSensitive: true, type: 0, }); - continueTests = true; }); it('Should make another request to make sure case sensitivity is enforced', async () => { - try { - question(REJECT_PROMPT_TEXT); - await client.sign(ETH_REQ); - } catch (err) { - expect( - err.message.indexOf(responseMsgs[responseCodes.RESP_ERR_USER_DECLINED]) - ).to.not.equal( - -1, - `Expected rejection but got: ${err}` + question(REJECT_PROMPT_TEXT); + await client.sign(ETH_REQ).catch((err) => { + expect(err.message).toBe( + responseMsgs[responseCodes.RESP_ERR_USER_DECLINED], ); - continueTests = true; - } + }); }); it('Should get the id of the newly added record', async () => { @@ -310,20 +221,18 @@ describe('Test key-value files API', () => { }; const resp: any = await client.getKvRecords(opts); const { records, total, fetched } = resp; - expect(total).to.equal(_numStartingRecords + 1); - expect(fetched).to.equal(1); - expect(records.length).to.equal(1); + expect(total).toEqual(_numStartingRecords + 1); + expect(fetched).toEqual(1); + expect(records.length).toEqual(1); _fetchedRecords = records; - continueTests = true; }); it('Should remove the new record', async () => { - const idsToRemove = []; - _fetchedRecords.forEach((r) => { + const idsToRemove: any = []; + _fetchedRecords.forEach((r: any) => { idsToRemove.push(r.id); }); await client.removeKvRecords({ ids: idsToRemove }); - continueTests = true; }); it('Should confirm there are no new records', async () => { @@ -333,9 +242,8 @@ describe('Test key-value files API', () => { }; const resp: any = await client.getKvRecords(opts); const { records, total, fetched } = resp; - expect(total).to.equal(_numStartingRecords); - expect(fetched).to.equal(0); - expect(records.length).to.equal(0); - continueTests = true; + expect(total).toEqual(_numStartingRecords); + expect(fetched).toEqual(0); + expect(records.length).toEqual(0); }); }); diff --git a/src/__test__/e2e/non-exportable.test.ts b/src/__test__/e2e/non-exportable.test.ts new file mode 100644 index 00000000..ea907775 --- /dev/null +++ b/src/__test__/e2e/non-exportable.test.ts @@ -0,0 +1,242 @@ +/** + * Legacy SafeCards had the ability to block export of the seed from the card. + * This was beneficial from a security standpoint, but limited the cryptography + * by what was available on the card. This option has been deprecated in newer + * versions of GridPlus firmware, but we still want to support cards that do + * not allow seed export, as we may bring that feature back in the future. + * + * In addition to the limitied cryptogrpahy, signature determinism is not possible + * in the SafeCard applet as it exists today. These tests simply confirm that + * signing the same message multiple times results in signatures that all appear + * different, but cryptographically validate on the secp256k1 curve. + * + * You must have `FEATURE_TEST_RUNNER=1` enabled in firmware to run these tests. + */ +import Common, { Chain, Hardfork } from '@ethereumjs/common'; +import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; +import { question } from 'readline-sync'; +import { ecdsaRecover } from 'secp256k1'; +import { Constants } from '../..'; +import { DEFAULT_SIGNER } from '../utils/builders'; +import { getSigStr } from '../utils/helpers'; +import { initializeClient } from '../utils/initializeClient'; + +const client = initializeClient(); +describe('Non-Exportable Seed', () => { + describe('Setup', () => { + it('Should ask if the user wants to test a card with a non-exportable seed', async () => { + // NOTE: non-exportable seeds were deprecated from the normal setup pathway in firmware v0.12.0 + const result = await question( + 'Do you have a non-exportable SafeCard seed loaded and wish to continue? (Y/N) ', + ); + if (result.toLowerCase() !== 'y') { + console.log( + '\nTest must be run with a SafeCard loaded with a non-exportable seed.\n', + ); + process.exit(1); + } + }); + }); + + describe('Test non-exportable seed on SafeCard', () => { + it('Should test that ETH transaction sigs differ and validate on secp256k1', async () => { + // Test ETH transactions + const tx = EthTxFactory.fromTxData( + { + type: 2, + maxFeePerGas: 1200000000, + maxPriorityFeePerGas: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 100, + data: '0xdeadbeef', + }, + { + common: new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }), + }, + ); + const txReq = { + data: { + signerPath: DEFAULT_SIGNER, + payload: tx.getMessageToSign(false), + curveType: Constants.SIGNING.CURVES.SECP256K1, + hashType: Constants.SIGNING.HASHES.KECCAK256, + encodingType: Constants.SIGNING.ENCODINGS.EVM, + }, + }; + // Validate that tx sigs are non-uniform + const tx1Resp = await client.sign(txReq); + validateSig(tx1Resp, tx.getMessageToSign(true)); + const tx2Resp = await client.sign(txReq); + validateSig(tx2Resp, tx.getMessageToSign(true)); + const tx3Resp = await client.sign(txReq); + validateSig(tx3Resp, tx.getMessageToSign(true)); + const tx4Resp = await client.sign(txReq); + validateSig(tx4Resp, tx.getMessageToSign(true)); + const tx5Resp = await client.sign(txReq); + validateSig(tx5Resp, tx.getMessageToSign(true)); + // Check sig 1 + expect(getSigStr(tx1Resp, tx)).not.toEqual( + getSigStr(tx2Resp, tx), + ); + expect(getSigStr(tx1Resp, tx)).not.toEqual( + getSigStr(tx3Resp, tx), + ); + expect(getSigStr(tx1Resp, tx)).not.toEqual( + getSigStr(tx4Resp, tx), + ); + expect(getSigStr(tx1Resp, tx)).not.toEqual( + getSigStr(tx5Resp, tx), + ); + // Check sig 2 + expect(getSigStr(tx2Resp, tx)).not.toEqual( + getSigStr(tx1Resp, tx), + ); + expect(getSigStr(tx2Resp, tx)).not.toEqual( + getSigStr(tx3Resp, tx), + ); + expect(getSigStr(tx2Resp, tx)).not.toEqual( + getSigStr(tx4Resp, tx), + ); + expect(getSigStr(tx2Resp, tx)).not.toEqual( + getSigStr(tx5Resp, tx), + ); + // Check sig 3 + expect(getSigStr(tx3Resp, tx)).not.toEqual( + getSigStr(tx1Resp, tx), + ); + expect(getSigStr(tx3Resp, tx)).not.toEqual( + getSigStr(tx2Resp, tx), + ); + expect(getSigStr(tx3Resp, tx)).not.toEqual( + getSigStr(tx4Resp, tx), + ); + expect(getSigStr(tx3Resp, tx)).not.toEqual( + getSigStr(tx5Resp, tx), + ); + // Check sig 4 + expect(getSigStr(tx4Resp, tx)).not.toEqual( + getSigStr(tx1Resp, tx), + ); + expect(getSigStr(tx4Resp, tx)).not.toEqual( + getSigStr(tx2Resp, tx), + ); + expect(getSigStr(tx4Resp, tx)).not.toEqual( + getSigStr(tx3Resp, tx), + ); + expect(getSigStr(tx4Resp, tx)).not.toEqual( + getSigStr(tx5Resp, tx), + ); + // Check sig 5 + expect(getSigStr(tx5Resp, tx)).not.toEqual( + getSigStr(tx1Resp, tx), + ); + expect(getSigStr(tx5Resp, tx)).not.toEqual( + getSigStr(tx2Resp, tx), + ); + expect(getSigStr(tx5Resp, tx)).not.toEqual( + getSigStr(tx3Resp, tx), + ); + expect(getSigStr(tx5Resp, tx)).not.toEqual( + getSigStr(tx4Resp, tx), + ); + }); + + it('Should test that ETH message sigs differ and validate on secp256k1', async () => { + // Validate that signPersonal message sigs are non-uniform + const msgReq = { + currency: 'ETH_MSG', + data: { + signerPath: DEFAULT_SIGNER, + protocol: 'signPersonal', + payload: 'test message', + }, + }; + // NOTE: This uses the legacy signing pathway, which validates the signature + // Once we move this to generic signing, we will need to validate these. + const msg1Resp = await client.sign(msgReq); + const msg2Resp = await client.sign(msgReq); + const msg3Resp = await client.sign(msgReq); + const msg4Resp = await client.sign(msgReq); + const msg5Resp = await client.sign(msgReq); + // Check sig 1 + expect(getSigStr(msg1Resp)).not.toEqual( + getSigStr(msg2Resp), + ); + expect(getSigStr(msg1Resp)).not.toEqual( + getSigStr(msg3Resp), + ); + expect(getSigStr(msg1Resp)).not.toEqual( + getSigStr(msg4Resp), + ); + expect(getSigStr(msg1Resp)).not.toEqual( + getSigStr(msg5Resp), + ); + // Check sig 2 + expect(getSigStr(msg2Resp)).not.toEqual( + getSigStr(msg1Resp), + ); + expect(getSigStr(msg2Resp)).not.toEqual( + getSigStr(msg3Resp), + ); + expect(getSigStr(msg2Resp)).not.toEqual( + getSigStr(msg4Resp), + ); + expect(getSigStr(msg2Resp)).not.toEqual( + getSigStr(msg5Resp), + ); + // Check sig 3 + expect(getSigStr(msg3Resp)).not.toEqual( + getSigStr(msg1Resp), + ); + expect(getSigStr(msg3Resp)).not.toEqual( + getSigStr(msg2Resp), + ); + expect(getSigStr(msg3Resp)).not.toEqual( + getSigStr(msg4Resp), + ); + expect(getSigStr(msg3Resp)).not.toEqual( + getSigStr(msg5Resp), + ); + // Check sig 4 + expect(getSigStr(msg4Resp)).not.toEqual( + getSigStr(msg1Resp), + ); + expect(getSigStr(msg4Resp)).not.toEqual( + getSigStr(msg2Resp), + ); + expect(getSigStr(msg4Resp)).not.toEqual( + getSigStr(msg3Resp), + ); + expect(getSigStr(msg4Resp)).not.toEqual( + getSigStr(msg5Resp), + ); + // Check sig 5 + expect(getSigStr(msg5Resp)).not.toEqual( + getSigStr(msg1Resp), + ); + expect(getSigStr(msg5Resp)).not.toEqual( + getSigStr(msg2Resp), + ); + expect(getSigStr(msg5Resp)).not.toEqual( + getSigStr(msg3Resp), + ); + expect(getSigStr(msg5Resp)).not.toEqual( + getSigStr(msg4Resp), + ); + }); + }); +}) + +function validateSig (resp: any, hash: Buffer) { + const rs = new Uint8Array(Buffer.concat([resp.sig.r, resp.sig.s])); + const pubkeyA = Buffer.from(ecdsaRecover(rs, 0, hash, false)).toString('hex'); + const pubkeyB = Buffer.from(ecdsaRecover(rs, 1, hash, false)).toString('hex'); + if ( + resp.pubkey.toString('hex') !== pubkeyA && + resp.pubkey.toString('hex') !== pubkeyB + ) { + throw new Error('Signature did not validate.'); + } +} diff --git a/src/__test__/e2e/signing/determinism.test.ts b/src/__test__/e2e/signing/determinism.test.ts new file mode 100644 index 00000000..21f500d7 --- /dev/null +++ b/src/__test__/e2e/signing/determinism.test.ts @@ -0,0 +1,636 @@ +import { getDeviceId } from '../../utils/getters'; +import { question } from 'readline-sync'; +import { HARDENED_OFFSET } from '../../../constants'; +import { randomBytes } from '../../../util'; +import { Client } from '../../../client'; +import { + buildMsgReq, + buildRandomVectors, + buildTx, + buildTxReq, + DEFAULT_SIGNER, +} from '../../utils/builders'; +import { + deriveAddress, + setupJob, + signPersonalJS, + testUniformSigs, + TEST_SEED, +} from '../../utils/determinism'; +import { + BTC_PURPOSE_P2PKH, + copyBuffer, + deserializeExportSeedJobResult, + ETH_COIN, + getSigStr, + gpErrors, + jobTypes, +} from '../../utils/helpers'; +import { initializeSeed } from '../../utils/initializeClient'; +import { runTestCase } from '../../utils/runners'; +let seed: Buffer; + +export const runDeterminismTests = ({ client }: { client: Client }) => { + describe('[Determinism]', () => { + describe('Setup and validate seed', () => { + it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', async () => { + await question( + '\nPlease remove, re-insert, and unlock your SafeCard.\n' + + 'Press enter to continue after addresses have fully synced.', + ); + }); + + it('Should remove the seed', async () => { + // Make sure a seed was exported + seed = await initializeSeed(client); + if (!seed) { + throw new Error('No seed was exported'); + } + const testRequestPayload = setupJob( + jobTypes.WALLET_JOB_DELETE_SEED, + client, + ); + await runTestCase(testRequestPayload, gpErrors.GP_SUCCESS); + }); + + it('Should load the known test seed', async () => { + const testRequestPayload = setupJob( + jobTypes.WALLET_JOB_LOAD_SEED, + client, + TEST_SEED, + ); + await runTestCase(testRequestPayload, gpErrors.GP_SUCCESS); + }); + + it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { + question( + '\nPlease remove, re-insert, and unlock your SafeCard.\n' + + 'Press enter to continue after addresses have fully synced.', + ); + }); + + it('Should re-connect to the Lattice and update the walletUID.', async () => { + await client.connect(getDeviceId()); + expect(client.isPaired).toEqual(true); + expect(!!client.getActiveWallet()).toEqual(true); + }); + + it('Should ensure export seed matches the test seed', async () => { + const testRequestPayload = setupJob( + jobTypes.WALLET_JOB_EXPORT_SEED, + client, + ); + const _res = await runTestCase(testRequestPayload, gpErrors.GP_SUCCESS); + const { seed } = deserializeExportSeedJobResult(_res.result); + expect(seed.toString('hex')).toEqualElseLog( + TEST_SEED.toString('hex'), + 'Seeds did not match', + ); + }); + + it('Should validate some Ledger addresses derived from the test seed', async () => { + // These addresses were all fetched using MetaMask with a real ledger loaded with TEST_MNEOMNIC + // NOTE: These are 0-indexed indices whereas MetaMask shows 1-indexed (addr0 -> metamask1) + const path0 = [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET, 0, 0] as WalletPath; + const addr0 = '0x17E43083812d45040E4826D2f214601bc730F60C'; + const path1 = [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET + 1, 0, 0] as WalletPath; + const addr1 = '0xfb25a9D4472A55083042672e42309056763B667E'; + const path8 = [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET + 8, 0, 0] as WalletPath; + const addr8 = '0x8A520d7f70906Ebe00F40131791eFF414230Ea5c'; + // Derive these from the seed as a sanity check + expect(deriveAddress(TEST_SEED, path0).toLowerCase()).toEqualElseLog( + addr0.toLowerCase(), + 'Incorrect address 0 derived.', + ); + expect(deriveAddress(TEST_SEED, path1).toLowerCase()).toEqualElseLog( + addr1.toLowerCase(), + 'Incorrect address 1 derived.', + ); + expect(deriveAddress(TEST_SEED, path8).toLowerCase()).toEqualElseLog( + addr8.toLowerCase(), + 'Incorrect address 8 derived.', + ); + // Fetch these addresses from the Lattice and validate + + const req = { + currency: 'ETH', + startPath: path0, + n: 1, + }; + const latAddr0 = await client.getAddresses(req); + //@ts-expect-error - Returns strings sometimes + expect(latAddr0[0].toLowerCase()).toEqualElseLog( + addr0.toLowerCase(), + 'Incorrect address 0 fetched.', + ); + req.startPath = path1; + const latAddr1 = await client.getAddresses(req); + //@ts-expect-error - Returns strings sometimes + expect(latAddr1[0].toLowerCase()).toEqualElseLog( + addr1.toLowerCase(), + 'Incorrect address 1 fetched.', + ); + req.startPath = path8; + const latAddr8 = await client.getAddresses(req); + //@ts-expect-error - Returns strings sometimes + expect(latAddr8[0].toLowerCase()).toEqualElseLog( + addr8.toLowerCase(), + 'Incorrect address 8 fetched.', + ); + }); + + const txReq = buildTxReq(buildTx()); + it('Should test that wrongWallet retry works', async () => { + question( + 'Please switch to a SafeCard with a different seed. Press enter to continue.', + ); + await expect(client.sign(txReq)).rejects.toThrow( + /Active wallet does not match request/, + ); + question( + 'Please switch back to the first SafeCard. Press enter to continue.', + ); + await client.sign(txReq); + }, 1000000); + }); + + describe('Test uniformity of Ethereum transaction sigs', () => { + it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/0', async () => { + const tx = buildTx(); + const txReq = buildTxReq(tx); + txReq.data.signerPath[2] = HARDENED_OFFSET; + await testUniformSigs(txReq, tx, client); + }); + + it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/1', async () => { + const tx = buildTx(); + const txReq = buildTxReq(tx); + txReq.data.signerPath[2] = HARDENED_OFFSET + 1; + await testUniformSigs(txReq, tx, client); + }); + + it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/8', async () => { + const tx = buildTx(); + const txReq = buildTxReq(tx); + txReq.data.signerPath[2] = HARDENED_OFFSET + 8; + await testUniformSigs(txReq, tx, client); + }); + + it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/0', async () => { + const tx = buildTx(`0x${randomBytes(4000).toString('hex')}`); + const txReq = buildTxReq(tx); + txReq.data.signerPath[2] = HARDENED_OFFSET; + await testUniformSigs(txReq, tx, client); + }); + + it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/1', async () => { + const tx = buildTx(`0x${randomBytes(4000).toString('hex')}`); + const txReq = buildTxReq(tx); + txReq.data.signerPath[2] = HARDENED_OFFSET + 1; + await testUniformSigs(txReq, tx, client); + }); + + it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/8', async () => { + const tx = buildTx(`0x${randomBytes(4000).toString('hex')}`); + const txReq = buildTxReq(tx); + txReq.data.signerPath[2] = HARDENED_OFFSET + 8; + await testUniformSigs(txReq, tx, client); + }); + }); + + describe('Compare personal_sign signatures vs Ledger vectors (1)', () => { + it('Should validate signature from addr0', async () => { + const expected = + '4820a558ab69907c90141f4857f54a7d71e7791f84478fef7b9a3e5b200ee242' + // r + '529cc19a58ed8fa017510d24a443b757018834b3e3585a7199168d3af4b3837e' + // s + '01'; // v + const msgReq = buildMsgReq(); + msgReq.data.signerPath[2] = HARDENED_OFFSET; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + + it('Should validate signature from addr1', async () => { + const expected = + 'c292c988b26ae24a06a8270f2794c259ec5742168ed77cd635cba041f767a569' + // r + '2e4d218a02ba0b5f82b80488ccc519b67fb37a9f4cbb1d35d9ce4b99e8afcc18' + // s + '01'; // v + const msgReq = buildMsgReq(); + msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + + it('Should validate signature from addr8', async () => { + const expected = + '60cadafdbb7cba590a37eeff854d2598af71904077312875ef7b4f525d4dcb52' + // r + '5903ae9e4b7e61f6f24abfe9a1d5fb1375347ef6a48f7abe2319c89f426eb27c' + // s + '00'; // v + const msgReq = buildMsgReq(); + msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + }); + + describe('Compare personal_sign signatures vs Ledger vectors (2)', () => { + it('Should validate signature from addr0', async () => { + const expected = + 'b4fb4e0db168de42781ee1a27a1e907d5ec39aaccf24733846739f94f5b4542f' + // r + '65639d4aa368a5510c64e758732de419ac6489efeaf9e3cb29a616a2c624c2c7' + // s + '01'; // v + const msgReq = buildMsgReq('hello ethereum this is another message'); + msgReq.data.signerPath[2] = HARDENED_OFFSET; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + + it('Should validate signature from addr1', async () => { + const expected = + '1318229681d8fcdf6db12819c8859501186a3c792543d38a38643c6f185dd252' + // r + '6a7655b7ff8b5a2bdfa5023abd91e04c7c7a8f8ee491122da17e13dd85ede531' + // s + '01'; // v + const msgReq = buildMsgReq('hello ethereum this is another message'); + msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + + it('Should validate signature from addr8', async () => { + const expected = + 'c748f3fbf9f517fbd33462a858b40615ab6747295c27b4a46568d7d08c1d9d32' + // r + '0e14363c2885feaee0e4393454292be1ee3a1f32fb95571231db09a2b3bd8737' + // s + '00'; // v + const msgReq = buildMsgReq('hello ethereum this is another message'); + msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + }); + + describe('Compare personal_sign signatures vs Ledger vectors (3)', () => { + it('Should validate signature from addr0', async () => { + const expected = + 'f245100f07a6c695140fda7e29097034b3c97be94910639d20efdff5c96387fd' + // r + '6703f40f53647528ed93ac929a256ed1f09eba316a5e94daac2a464356b14058' + // s + '00'; // v + const msgReq = buildMsgReq('third vector yo'); + msgReq.data.signerPath[2] = HARDENED_OFFSET; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + + it('Should validate signature from addr1', async () => { + const expected = + '3a42c4955e4fb7ee2c4ee58df79c4be5f62839e691c169b74f90eafd371e2065' + // r + '51c7fc3da33dff2d2961ac7909244b4c32deee70abf7fac0e088184853cdff4a' + // s + '01'; // v + const msgReq = buildMsgReq('third vector yo'); + msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + + it('Should validate signature from addr8', async () => { + const expected = + '3e55dbb101880960cb32c17237d3ceb9d5846cf2f68c5c4c504cb827ea6a2e73' + // r + '22254bb6f6464c95dd743c506e7bc71eb90ceab17d2fd3b02e6636c508b14cc7' + // s + '00'; // v + const msgReq = buildMsgReq('third vector yo'); + msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(expected, 'Lattice sig does not match'); + const jsSig = signPersonalJS( + msgReq.data.payload, + msgReq.data.signerPath, + ); + expect(sig).toEqualElseLog(jsSig, 'JS sig does not match'); + }); + }); + + describe('Compare EIP712 signatures vs Ledger vectors (1)', () => { + const msgReq = { + currency: 'ETH_MSG', + data: { + signerPath: DEFAULT_SIGNER, + protocol: 'eip712', + payload: { + types: { + Greeting: [ + { + name: 'salutation', + type: 'string', + }, + { + name: 'target', + type: 'string', + }, + { + name: 'born', + type: 'int32', + }, + ], + EIP712Domain: [ + { + name: 'chainId', + type: 'uint256', + }, + ], + }, + domain: { + chainId: 1, + }, + primaryType: 'Greeting', + message: { + salutation: 'Hello', + target: 'Ethereum', + born: '2015', + }, + }, + }, + }; + + it('Should validate signature from addr0', async () => { + const expected = + 'dbf9a493935770f97a1f0886f370345508398ac76fbf31ccf1c30d8846d3febf' + // r + '047e8ae03e146044e7857f1e485921a9d978b1ead93bdd0de6be619dfb72f0b5' + // s + '01'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + + it('Should validate signature from addr1', async () => { + const expected = + '9e784c6388f6f938f94239c67dc764909b86f34ec29312f4c623138fd7192115' + // r + '5efbc9af2339e04303bf300366a675dd90d33fdb26d131c17b278725d36d728e' + // s + '00'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + + it('Should validate signature from addr8', async () => { + const expected = + '6e7e9bfc4773291713bb5cdc483057d43a95a5082920bdd1dd3470caf6f11155' + // r + '6c163b7d489f37ffcecfd20dab2de6a8a04f79af7e265b249db9b4973e75c7d1' + // s + '00'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + }); + + describe('Compare EIP712 signatures vs Ledger vectors (2)', () => { + const msgReq = { + currency: 'ETH_MSG', + data: { + signerPath: DEFAULT_SIGNER, + protocol: 'eip712', + payload: { + types: { + MuhType: [ + { + name: 'thing', + type: 'string', + }, + ], + EIP712Domain: [ + { + name: 'chainId', + type: 'uint256', + }, + ], + }, + domain: { + chainId: 1, + }, + primaryType: 'MuhType', + message: { + thing: 'I am a string', + }, + }, + }, + }; + + it('Should validate signature from addr0', async () => { + const expected = + '0a1843ee1be7bf1ddd8bb32230ee3842b47022b8ba8795d3522db8a7341a9b85' + // r + '72d0e38463b5a7e1f1d1acd09acb8db936af52bdcab6374abb7013842b6840b8' + // s + '01'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + + it('Should validate signature from addr1', async () => { + const expected = + 'f5284359479eb32eefe88bd24de59e4fd656d82238c7752e7a576b7a875eb5ae' + // r + '6ef7b021f5bed2122161de6b373d5ee0aa9a3e4d3f499b3bb95ad5b9ed9f7bd9' + // s + '00'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + + it('Should validate signature from addr8', async () => { + const expected = + 'f7a94b7ba7e0fbab88472cb77c5c255ba36e60e9f90bf4073960082bb5ef17cf' + // r + '2e3b79ebad1f0ee96e0d3fe862372a1e586dba1bee309adf8c338b5e42d3424e' + // s + '00'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + }); + + describe('Compare EIP712 signatures vs Ledger vectors (3)', () => { + const msgReq = { + currency: 'ETH_MSG', + data: { + signerPath: DEFAULT_SIGNER, + protocol: 'eip712', + payload: { + types: { + MuhType: [ + { + name: 'numbawang', + type: 'uint32', + }, + ], + EIP712Domain: [ + { + name: 'chainId', + type: 'uint256', + }, + ], + }, + domain: { + chainId: 1, + }, + primaryType: 'MuhType', + message: { + numbawang: 999, + }, + }, + }, + }; + + it('Should validate signature from addr0', async () => { + const expected = + 'c693714421acbba9fb8fdcd825295b6042802b06a55ae17a65db510dd5a348e0' + // r + '2ffed1a8dbaf63919727c0b5e52978e9dce3638b0385fda45e022a50bab510eb' + // s + '01'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + it('Should validate signature from addr1', async () => { + const expected = + '4a32a478f6f772b37d8cfffabe8ee7c7956d45fd098035163c92b06564ead034' + // r + '2eb54cde42f636f63f72615b53510e970a9f7ff2c4527b753ef0eb8ce1ee4a44' + // s + '00'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + it('Should validate signature from addr8', async () => { + const expected = + '7a9f4e67309efb733fc4092f69f95583e06ccf4b25a364d9a9dc51b921edb464' + // r + '22c310c83fd61936618b8f1caaa0b82ac492822e6a5d1a65cd5fb3f0bc0126bf' + // s + '00'; // v + msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; + const res = await client.sign(msgReq); + const sig = getSigStr(res); + expect(sig).toEqual(expected); + }); + }); + + describe('Test random personal_sign messages against JS signatures', () => { + const randomVectors = buildRandomVectors(); + const signerPathOffsets = [0, 1, 8]; + + randomVectors.forEach((payload, i) => { + signerPathOffsets.forEach(async (offset) => { + it(`Should test random vector: ${i} with offset ${offset}`, async () => { + const req = { + currency: 'ETH_MSG', + data: { + signerPath: DEFAULT_SIGNER, + protocol: 'signPersonal', + payload, + }, + }; + req.data.signerPath[2] = HARDENED_OFFSET + offset; + const jsSig = signPersonalJS(req.data.payload, req.data.signerPath); + const res = await client.sign(req); + const sig = getSigStr(res); + expect(sig).toEqualElseLog(jsSig, `Addr${offset} sig failed`); + }); + }); + }); + }); + + describe('Teardown Test', () => { + it('Should remove the seed', async () => { + const testRequestPayload = setupJob( + jobTypes.WALLET_JOB_DELETE_SEED, + client, + ); + await runTestCase(testRequestPayload, gpErrors.GP_SUCCESS); + }); + + it('Should load the seed', async () => { + const testRequestPayload = setupJob( + jobTypes.WALLET_JOB_LOAD_SEED, + client, + seed, + ); + await runTestCase(testRequestPayload, gpErrors.GP_SUCCESS); + }); + + it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { + question( + '\nPlease remove, re-insert, and unlock your SafeCard.\n' + + 'Press enter to continue.', + ); + }); + + it('Should re-connect to the Lattice and update the walletUID.', async () => { + expect(getDeviceId()).to.not.equal(null); + await client.connect(getDeviceId()); + expect(client.isPaired).toEqual(true); + expect(!!client.getActiveWallet()).toEqual(true); + }); + + it('Should ensure export seed matches the seed we just loaded', async () => { + // Export the seed and make sure it matches! + const testRequestPayload = setupJob( + jobTypes.WALLET_JOB_EXPORT_SEED, + client, + ); + const _res = await runTestCase(testRequestPayload, gpErrors.GP_SUCCESS); + const res = deserializeExportSeedJobResult(_res.result); + const exportedSeed = copyBuffer(res.seed); + expect(exportedSeed.toString('hex')).toEqual(seed.toString('hex')); + }); + }); + }); +}; diff --git a/src/__test__/e2e/signing/evm.test.ts b/src/__test__/e2e/signing/evm.test.ts new file mode 100644 index 00000000..6c055ca3 --- /dev/null +++ b/src/__test__/e2e/signing/evm.test.ts @@ -0,0 +1,670 @@ +/** +Test generic signing, which allows a signature on the secp256k1 or ed25519 curve. +We seek to validate: +1. Signature on data can be reproduced locally with the derived key +2. Signature on data representing ETH tx matches the ETH route itself +3. Many random signatures can be validated + +You must have `FEATURE_TEST_RUNNER=1` enabled in firmware to run these tests. + */ +import Common, { Chain, Hardfork } from '@ethereumjs/common'; +import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; +import { Interface } from '@ethersproject/abi'; +import { BN } from 'bn.js'; +import { readFileSync } from 'fs'; +import { jsonc } from 'jsonc'; +import { decode as rlpDecode, encode as rlpEncode } from 'rlp'; +import request from 'superagent'; +import { Client } from '../../../client'; +import { fetchCalldataDecoder, randomBytes } from '../../../util'; +import { buildEncDefs, buildEvmReq, DEFAULT_SIGNER, getNumIter } from '../../utils/builders'; +import { getEtherscanKey } from '../../utils/getters'; +import { runEvm } from '../../utils/runners'; + +const globalVectors = jsonc.parse( + readFileSync(`${process.cwd()}/src/vectors.jsonc`).toString(), +); +const vectors = globalVectors.evm.calldata; + +//--------------------------------------- +// STATE DATA +//--------------------------------------- + +const { encDefs, encDefsCalldata } = buildEncDefs(vectors); + +//--------------------------------------- +// TESTS +//--------------------------------------- +export const runEvmTests = ({ client }: { client: Client }) => { + describe('[EVM]', () => { + const runEvmTestForReq = ( + req?: any, + bypassSetPayload?: boolean, + shouldFail?: boolean, + useLegacySigning?: boolean, + ) => { + const evmReq = buildEvmReq(req); + return runEvm( + evmReq, + client, + bypassSetPayload, + shouldFail, + useLegacySigning, + ); + }; + + describe('[EVM] Test transactions', () => { + describe('EIP1559', () => { + it('Should test a basic transaction', async () => { + await runEvmTestForReq(); + }); + + it('Should test a Rinkeby transaction', async () => { + await runEvmTestForReq({ + common: new Common({ + chain: Chain.Rinkeby, + hardfork: Hardfork.London, + }), + }); + }); + + it('Should test a transaction with an access list', async () => { + await runEvmTestForReq({ + txData: { + accessList: [ + { + address: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + storageKeys: [ + '0x7154f8b310ad6ce97ce3b15e3419d9863865dfe2d8635802f7f4a52a206255a6', + ], + }, + { + address: '0xe0f8ff08ef0242c461da688b8b85e438db724860', + storageKeys: [], + }, + ], + }, + }); + }); + }); + + describe('EIP2930', () => { + it('Should test a basic transaction', async () => { + await runEvmTestForReq({ + txData: { + type: 1, + gasPrice: 1200000000, + }, + }); + }); + + it('Should test a Rinkeby transaction', async () => { + await runEvmTestForReq({ + txData: { + type: 1, + gasPrice: 1200000000, + }, + common: new Common({ + chain: Chain.Rinkeby, + hardfork: Hardfork.London, + }), + }); + }); + + it('Should test a transaction with an access list', async () => { + await runEvmTestForReq({ + txData: { + type: 1, + gasPrice: 1200000000, + accessList: [ + { + address: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + storageKeys: [ + '0x7154f8b310ad6ce97ce3b15e3419d9863865dfe2d8635802f7f4a52a206255a6', + ], + }, + { + address: '0xe0f8ff08ef0242c461da688b8b85e438db724860', + storageKeys: [], + }, + ], + }, + }); + }); + }); + + describe('Legacy (Non-EIP155)', () => { + it('Should test a transaction that does not use EIP155', async () => { + await runEvmTestForReq({ + txData: { + type: undefined, + gasPrice: 1200000000, + }, + common: new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Homestead, + }), + }); + }); + }); + + describe('Boundary tests', () => { + const runBoundaryTest = (overrides: any, ...params: any) => + runEvmTestForReq( + { + txData: { + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + gasPrice: 1200000000, + type: undefined, + }, + common: new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }), + ...overrides, + }, + ...params, + ); + + it('Should test shorter derivation paths', async () => { + console.log('DEFAULT_SIGNER', DEFAULT_SIGNER); + await runBoundaryTest({ + data: { + signerPath: DEFAULT_SIGNER.slice(0, 3), + }, + }); + await runBoundaryTest({ + data: { + signerPath: DEFAULT_SIGNER.slice(0, 2), + }, + }); + await runBoundaryTest({ + data: { + signerPath: DEFAULT_SIGNER.slice(0, 1), + }, + }); + await expect( + runBoundaryTest( + { + data: { + signerPath: [], + }, + }, + true, + ), + ).rejects.toThrow(); + }); + + it('Should test other chains', async () => { + // Polygon + await runBoundaryTest({ common: Common.custom({ chainId: 137 }) }); + // BSC + await runBoundaryTest({ common: Common.custom({ chainId: 56 }) }); + // Avalanche + await runBoundaryTest({ common: Common.custom({ chainId: 43114 }) }); + // Palm + await runBoundaryTest({ + common: Common.custom({ chainId: 11297108109 }), + }); + // Unknown chain + await runBoundaryTest({ common: Common.custom({ chainId: 9999 }) }); + // Unknown chain (max chainID, i.e. UINT64_MAX - 1) + await runBoundaryTest({ + // @ts-expect-error - Common.custom() expects a number + common: Common.custom({ chainId: '18446744073709551615' }), + }); + // Unknown chain (chainID too large) + await runBoundaryTest({ + // @ts-expect-error - Common.custom() expects a number + common: Common.custom({ chainId: '18446744073709551616' }), + }); + // Unknown chain - bypass set payload + await expect( + runBoundaryTest( + // @ts-expect-error - Common.custom() expects a number + { common: Common.custom({ chainId: '18446744073709551616' }) }, + true, + ), + ).rejects.toThrow(); + }); + + it('Should test range of `value`', async () => { + await runBoundaryTest({ txData: { value: 1 } }); + await runBoundaryTest({ + txData: { + value: + '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + }, + }); + }); + + it('Should test range of `data` size', async () => { + const { extraDataFrameSz, extraDataMaxFrames, genericSigning } = + client.getFwConstants(); + const { baseDataSz } = genericSigning; + // Max size of total payload + const maxSz = baseDataSz + extraDataMaxFrames * extraDataFrameSz; + const req = buildEvmReq({ txData: { data: null } }); + // Infer the max `data` size + const dummyTx = EthTxFactory.fromTxData(req.txData, { + common: req.common, + }); + const dummyTxSz = rlpEncode(dummyTx.getMessageToSign(false)).length; + const rlpPrefixSz = 4; // 1 byte for descriptor, 1 byte for length, 2 bytes for length + const maxDataSz = maxSz - dummyTxSz - rlpPrefixSz; + + // No data + req.txData.data = null; + await runBoundaryTest({ txData: { data: null } }); + // Max payload size + await runBoundaryTest({ + txData: { data: `0x${randomBytes(maxDataSz).toString('hex')}` }, + }); + // Min prehash size + await runBoundaryTest({ + txData: { data: `0x${randomBytes(maxDataSz + 1).toString('hex')}` }, + }); + }); + + it('Should test contract deployment', async () => { + await runBoundaryTest({ + txData: { to: null, data: `0x${randomBytes(96).toString('hex')}` }, + }); + }); + + it('Should test direct RLP-encoded payloads with bad params', async () => { + const req = buildEvmReq(); + const tx = EthTxFactory.fromTxData(req.txData, { + common: req.common, + }); + const oversizedInt = Buffer.from( + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01', + 'hex', + ); + const getParamPayloadReq = (n: number, val?: any) => { + const params = tx.getMessageToSign(false); + params[n] = oversizedInt; + return { data: { payload: val ? val : rlpEncode(params) } }; + }; + // Test numerical values >32 bytes + // --- + // Nonce + await runBoundaryTest(getParamPayloadReq(0), true, true); + + // Gas + await runBoundaryTest(getParamPayloadReq(1), true, true); + + // Gas Price + await runBoundaryTest(getParamPayloadReq(2), true, true); + + // Value + await runBoundaryTest(getParamPayloadReq(4), true, true); + + // Test wrong sized addresses + // --- + await expect( + runBoundaryTest( + getParamPayloadReq( + 3, + Buffer.from('e242e54155b1abc71fc118065270cecaaf8b77', 'hex'), + ), + true, + true, + ), + ).rejects.toThrow(); + + await expect( + runBoundaryTest( + getParamPayloadReq( + 3, + Buffer.from( + 'e242e54155b1abc71fc118065270cecaaf8b770102', + 'hex', + ), + ), + true, + true, + ), + ).rejects.toThrow(); + }); + }); + + describe('Random Transactions', () => { + for (let i = 0; i < getNumIter(); i++) { + it(`Should test random transactions: #${i}`, async () => { + const randInt = (n: number) => Math.floor(Math.random() * n); + const randIntStr = (nBytes: number, type?: 'hex') => + new BN(randomBytes(randInt(nBytes)).toString('hex'), 16).toString( + type, + ); + await runEvmTestForReq({ + txData: { + gasLimit: 1000000, + nonce: `0x${randIntStr(4, 'hex')}`, + gasPrice: `0x${randIntStr(4, 'hex')}`, + gas: `0x${randIntStr(4, 'hex')}`, + value: `0x${randIntStr(32, 'hex')}`, + to: `0x${randomBytes(20).toString('hex')}`, + data: `0x${randomBytes(randInt(2000)).toString('hex')}`, + type: undefined, + }, + common: Common.custom({ + chainId: parseInt(randIntStr(4)), + }), + }); + }); + } + }); + + describe('[TODO: deprecate] Test Legacy Pathway (while it still exists)', () => { + const legacyOverrides = { + currency: 'ETH', + data: { + payload: null, + signerPath: DEFAULT_SIGNER, + }, + txData: { + chainId: 1, + gasPrice: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 100, + data: '0xdeadbeef', + }, + common: new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }), + }; + + const runLegacyTest = (overrides: any, ...params: any) => + runEvmTestForReq( + { + ...legacyOverrides, + ...overrides, + }, + ...params, + ); + + it('Should test legacy signing for legacy EIP155 transaction', async () => { + await runLegacyTest({}, null, null, true); + }); + + it('Should test legacy signing for EIP1559', async () => { + await runLegacyTest( + { + txData: { + type: 2, + }, + }, + null, + null, + true, + ); + }); + + it('Should test a Polygon transaction (chainId=137)', async () => { + await runLegacyTest( + { + txData: { + type: undefined, + chainId: 137, + gasPrice: 1200000000, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }, + common: Common.custom({ chainId: 137 }), + }, + null, + null, + true, + ); + }); + }); + }); + + describe('[EVM] Test decoders', () => { + describe('Test ABI decoder vectors', () => { + const runAbiDecoderTest = (overrides: any, ...params: any) => + runEvmTestForReq( + { + data: { + payload: null, + signerPath: DEFAULT_SIGNER, + }, + currency: undefined, + txData: { + gasPrice: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 100, + data: null, + }, + ...overrides, + }, + ...params, + ); + + // Validate that we can decode using Etherscan ABI info as well as 4byte canonical names. + for (let i = 0; i < vectors.etherscanTxHashes.length; i++) { + it(`(Etherscan + 4byte #${i}) ${vectors.etherscanTxHashes[i]}`, async () => { + // Hashes on ETH mainnet that we will use to fetch full tx and ABI data with + const getTxBase = + 'https://api.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash='; + // 1. First fetch the transaction details from etherscan. This is just to get + // the calldata, so it would not be needed in a production environment + // (since we already have the calldata). + let getTxUrl = `${getTxBase}${vectors.etherscanTxHashes[i]}`; + const etherscanKey = getEtherscanKey() + if (etherscanKey) { + getTxUrl += `&apiKey=${etherscanKey}`; + } + const tx = await request(getTxUrl).then((res) => res.body.result); + if (!etherscanKey) { + // Need a timeout between requests if we don't have a key + console.warn( + 'WARNING: No env.ETHERSCAN_KEY provided. Waiting 5s between requests...', + ); + await new Promise((resolve) => setTimeout(resolve, 5000)); + } + // 2. Fetch the full ABI of the contract that the transaction interacted with. + { + const { def, abi } = await fetchCalldataDecoder( + tx.input, + tx.to, + 1, + ); + if (!def) { + throw new Error( + `ERROR: Failed to decode ABI definition (${vectors.etherscanTxHashes[i]}). Skipping.`, + ); + } + // 3. Test decoding using Etherscan ABI info + // Check that ethers can decode this + const funcName = rlpDecode(def)[0] ?? ''; + if (ethersCanDecode(tx.input, abi, funcName.toString())) { + // Send the request + await runAbiDecoderTest({ + txData: { data: tx.input }, + data: { decoder: def }, + }); + } else { + throw new Error( + `ERROR: ethers.js failed to decode abi for tx ${vectors.etherscanTxHashes[i]}. Skipping.`, + ); + } + } + // 4. Get the canonical name from 4byte by using an unsupported chainId + { + const { def } = await fetchCalldataDecoder(tx.input, tx.to, -1); + await runAbiDecoderTest({ data: { decode: def } }); + } + }); + } + + // Validate a series of canonical definitions + for (let i = 0; i < vectors.canonicalNames.length; i++) { + it(`(Canonical #${i}) ${vectors.canonicalNames[i]}`, async () => { + const req = buildEvmReq({ + data: { decoder: encDefs[i] }, + txData: { data: encDefsCalldata[i] }, + }); + + // The following prints are helpful for debugging. + // If you are testing changes to the ABI decoder in firmware, you + // should uncomment these prints and validate that the `data` matches + // what you see on the screen for each case. Please scroll through + // ALL the data on the Lattice to confirm each param has properly decoded. + // const { types, data } = convertDecoderToEthers(rlpDecode(req.data.decoder).slice(1)); + // console.log('types', types) + // console.log('params', JSON.stringify(data)) + // for (let cd = 2; cd < calldata.length; cd += 64) { + // console.log(calldata.slice(cd, cd + 64)); + // } + await runAbiDecoderTest(req); + }); + } + /* + NOTE: The CRUD API to manage calldata decoders is written, but is currently + compiled out of firmware to free up code space. For now we will leave + these tests commented out and may re-enable them at a later date + NOTE: You will need to re-enable `import { question } from 'readline-sync';` + + // Test committing decoder data + it('Should save the first 10 defs', async () => { + const decoderType = Calldata.EVM.type; + const rm = question( + 'Do you want to remove all previously saved definitions? (Y/N) ', + ); + if (rm.toUpperCase() === 'Y') { + await client.removeDecoders({ decoderType, rmAll: true }); + } + // First determine how many defs there are already + let saved = await client.getDecoders({ decoderType }); + numDefsInitial = saved.total; + await client.addDecoders({ + decoderType, + decoders: encDefs.slice(0, 10), + }); + saved = await client.getDecoders({ decoderType, n: 10 }); + expect(saved.total).toEqual(numDefsInitial + 10); + for (let i = 0; i < saved.decoders.length; i++) { + test + .expect(saved.decoders[i].toString('hex')) + .toEqual(encDefs[i].toString('hex')); + } + await client.addDecoders({ + decoderType, + decoders: encDefs.slice(0, 10), + }); + saved = await client.getDecoders({ decoderType, n: 10 }); + expect(saved.total).toEqual(numDefsInitial + 10); + for (let i = 0; i < saved.decoders.length; i++) { + test + .expect(saved.decoders[i].toString('hex')) + .toEqual(encDefs[i].toString('hex')); + } + }); + + it('Should decode saved defs with check marks', async () => { + question( + ); + // Test expected passes + req.txData.data = encDefsCalldata[0]; + await runEvm(req); + req.txData.data = encDefsCalldata[9]; + await runEvm(req); + // Test expected failure + req.txData.data = encDefsCalldata[10]; + req.data.decoder = encDefs[10]; + await runEvm(req, true); + }); + + it('Should test decoding priority levels', async () => { + question( + ); + req.txData.data = encDefsCalldata[10]; + req.data.decoder = encDefs[10]; + await runEvm(req); + req.data.decoder = null; + await runEvm(req, true); + }); + + it('Should fetch the first 10 defs', async () => { + const decoderType = Calldata.EVM.type; + const { total, decoders } = await client.getDecoders({ + decoderType, + startIdx: numDefsInitial, + n: 10, + }); + expect(total).toEqual(numDefsInitial + 10); + expect(decoders.length).toEqual(10); + for (let i = 0; i < decoders.length; i++) { + test + .expect(decoders[i].toString('hex')) + .toEqual(encDefs[i].toString('hex')); + } + }); + + it('Should remove the saved defs', async () => { + const decoderType = Calldata.EVM.type; + // Remove the first 5 defs + await client.removeDecoders({ + decoderType, + decoders: encDefs.slice(0, 5), + }); + // There should be 5 defs remaining + const { total, decoders } = await client.getDecoders({ + decoderType, + startIdx: numDefsInitial, + n: 10, + }); + expect(total).toEqual(numDefsInitial + 5); + expect(decoders.length).toEqual(5); + // Remove the latter 5 + await client.removeDecoders({ + decoderType, + decoders: encDefs.slice(5, 10), + }); + const { total, decoders } = await client.getDecoders({ + decoderType, + startIdx: numDefsInitial, + n: 10, + }); + // There should be no more new defs + expect(total).toEqual(numDefsInitial); + expect(decoders.length).toEqual(0); + // Test to make sure the check marks do not appear + question( + ); + req.txData.data = encDefsCalldata[0]; + req.data.decoder = encDefs[0]; + await runEvm(req, true); + req.txData.data = encDefsCalldata[9]; + req.data.decoder = encDefs[9]; + await runEvm(req, true); + }); + */ + }); + }); + + //--------------------------------------- + // INTERNAL HELPERS + //--------------------------------------- + // Determine if ethers.js can decode calldata using an ABI def + function ethersCanDecode (calldata: any, abi: any, funcName: string) { + try { + const iface = new Interface(abi); + iface.decodeFunctionData(funcName, calldata); + return true; + } catch (err) { + return false; + } + } + + // Convert a decoder definition to something ethers can consume + }); +}; diff --git a/src/__test__/e2e/signing/signing.test.ts b/src/__test__/e2e/signing/signing.test.ts new file mode 100644 index 00000000..3a66dfdc --- /dev/null +++ b/src/__test__/e2e/signing/signing.test.ts @@ -0,0 +1,35 @@ +/** + * Test generic signing. We will validate signatures using unformatted message types + * (i.e. `encodingType=null`) and then we will validate signatures using firmware + * decoders. As new decoders are added, we will add more test files in this directory. + * + * We will keep some stuff in state so that it can be easily reused by the + * individual test files. This is accessible via `test`. + * + * You must have `FEATURE_TEST_RUNNER=0` enabled in firmware to run these tests. + */ +import { initializeClient } from '../../utils/initializeClient'; +import { runDeterminismTests } from './determinism.test'; +import { runEvmTests } from './evm.test'; +import { runSolanaTests } from './solana.test'; +import { runUnformattedTests } from './unformatted.test'; + +const client = initializeClient(); + +describe('Test General Signing', () => { + it('Should verify firmware version.', async () => { + const fwConstants = client.getFwConstants(); + if (!fwConstants.genericSigning) { + throw new Error('Firmware must be updated to run this '); + } + const fwVersion = client.getFwVersion(); + if (fwVersion.major === 0 && fwVersion.minor < 15) { + throw new Error('Please update Lattice firmware.'); + } + }); + + runDeterminismTests({ client }) + runUnformattedTests({ client }) + runSolanaTests({ client }); + runEvmTests({ client }); +}); diff --git a/src/__test__/e2e/signing/solana.test.ts b/src/__test__/e2e/signing/solana.test.ts new file mode 100644 index 00000000..84ac9ee5 --- /dev/null +++ b/src/__test__/e2e/signing/solana.test.ts @@ -0,0 +1,127 @@ +import { + Keypair as SolanaKeypair, + PublicKey as SolanaPublicKey, + SystemProgram as SolanaSystemProgram, + Transaction as SolanaTransaction, +} from '@solana/web3.js'; +import { Client } from '../../../client'; +import { Constants } from '../../..'; +import { HARDENED_OFFSET } from '../../../constants'; +import { getPrng } from '../../utils/getters'; +import { deriveED25519Key, prandomBuf } from '../../utils/helpers'; +import { runGeneric } from '../../utils/runners'; +import { initializeSeed } from '../../utils/initializeClient'; + +//--------------------------------------- +// STATE DATA +//--------------------------------------- +const DEFAULT_SOLANA_SIGNER = [ + HARDENED_OFFSET + 44, + HARDENED_OFFSET + 501, + HARDENED_OFFSET, + HARDENED_OFFSET, +]; + +//--------------------------------------- +// CLIENTS +//--------------------------------------- +export const runSolanaTests = ({ client }: { client: Client }) => { + const prng = getPrng(); + + describe('[Solana]', () => { + const getReq = (overrides: any) => ({ + data: { + curveType: Constants.SIGNING.CURVES.ED25519, + hashType: Constants.SIGNING.HASHES.NONE, + encodingType: Constants.SIGNING.ENCODINGS.SOLANA, + payload: null, + ...overrides, + }, + }); + + it('Should client and validate Solana transaction encoding', async () => { + // Build a Solana transaction with two signers, each derived from the Lattice's seed. + // This will require two separate general signing requests, one per signer. + + // Get the full set of Solana addresses and keys + // NOTE: Solana addresses are just base58 encoded public keys. We do not + // currently support exporting of Solana addresses in firmware but we can + // derive them here using the exported seed. + const seed = await initializeSeed(client); + const derivedAPath = DEFAULT_SOLANA_SIGNER; + const derivedBPath = DEFAULT_SOLANA_SIGNER; + derivedBPath[3] += 1; + const derivedCPath = DEFAULT_SOLANA_SIGNER; + derivedCPath[3] += 2; + const derivedA = deriveED25519Key(derivedAPath, seed); + const derivedB = deriveED25519Key(derivedBPath, seed); + const derivedC = deriveED25519Key(derivedCPath, seed); + const pubA = new SolanaPublicKey(derivedA.pub); + const pubB = new SolanaPublicKey(derivedB.pub); + const pubC = new SolanaPublicKey(derivedC.pub); + + // Define transaction instructions + const transfer1 = SolanaSystemProgram.transfer({ + fromPubkey: pubA, + toPubkey: pubC, + lamports: 111, + }); + const transfer2 = SolanaSystemProgram.transfer({ + fromPubkey: pubB, + toPubkey: pubC, + lamports: 222, + }); + + // Generate a pseudorandom blockhash, which is just a public key appearently. + const randBuf = prandomBuf(prng, 32, true); + const recentBlockhash = + SolanaKeypair.fromSeed(randBuf).publicKey.toBase58(); + + // Build a transaction and sign it using Solana's JS lib + const txJs = new SolanaTransaction({ recentBlockhash }).add( + transfer1, + transfer2, + ); + txJs.setSigners(pubA, pubB); + txJs.sign( + SolanaKeypair.fromSeed(derivedA.priv), + SolanaKeypair.fromSeed(derivedB.priv), + ); + const serTxJs = txJs.serialize().toString('hex'); + + // Build a copy of the transaction and get the serialized payload for signing in firmware. + const txFw = new SolanaTransaction({ recentBlockhash }).add( + transfer1, + transfer2, + ); + txFw.setSigners(pubA, pubB); + // We want to sign the Solana message, not the full transaction + const payload = txFw.compileMessage().serialize(); + + // Sign payload from Lattice and add signatures to tx object + const req = getReq({ + signerPath: derivedAPath, + payload: `0x${payload.toString('hex')}`, + }); + const sigA = await runGeneric(req, client).then((resp) => { + const sigR = resp.sig?.r.toString('hex') ?? ''; + const sigS = resp.sig?.s.toString('hex') ?? ''; + return Buffer.from(`${sigR}${sigS}`, 'hex'); + }); + + req.data.signerPath = derivedBPath; + + const sigB = await runGeneric(req, client).then((resp) => { + const sigR = resp.sig?.r.toString('hex') ?? ''; + const sigS = resp.sig?.s.toString('hex') ?? ''; + return Buffer.from(`${sigR}${sigS}`, 'hex'); + }); + txFw.addSignature(pubA, sigA); + txFw.addSignature(pubB, sigB); + + // Validate the signatures from the Lattice match those of the Solana library + const serTxFw = txFw.serialize().toString('hex'); + expect(serTxFw).toEqualElseLog(serTxJs, 'Signed tx mismatch'); + }); + }); +}; diff --git a/src/__test__/e2e/signing/unformatted.test.ts b/src/__test__/e2e/signing/unformatted.test.ts new file mode 100644 index 00000000..7b6469a0 --- /dev/null +++ b/src/__test__/e2e/signing/unformatted.test.ts @@ -0,0 +1,168 @@ +import { Client } from '../../../client'; +import { Constants } from '../../..'; +import { getNumIter } from '../../utils/builders'; +import { prandomBuf, ethPersonalSignMsg } from '../../utils/helpers'; +import { runGeneric } from '../../utils/runners'; +import { HARDENED_OFFSET } from '../../../constants'; +import { getPrng } from '../../utils/getters'; + +export const runUnformattedTests = ({ client }: { client: Client }) => { + const prng = getPrng() + + const numIter = getNumIter(); + const DEFAULT_SIGNER = [ + HARDENED_OFFSET + 44, + HARDENED_OFFSET + 60, + HARDENED_OFFSET, + 0, + 0, + ]; + describe('[Unformatted]', () => { + const getReq = (overrides: any) => ({ + data: { + signerPath: DEFAULT_SIGNER, + curveType: Constants.SIGNING.CURVES.SECP256K1, + hashType: Constants.SIGNING.HASHES.KECCAK256, + payload: null, + ...overrides, + }, + }); + + it('Should test pre-hashed messages', async () => { + const fwConstants = client.getFwConstants(); + const { extraDataFrameSz, extraDataMaxFrames, genericSigning } = + fwConstants; + const { baseDataSz } = genericSigning; + // Max size that won't be prehashed + const maxSz = baseDataSz + extraDataMaxFrames * extraDataFrameSz; + + // Use extraData frames + await runGeneric( + getReq({ + payload: `0x${prandomBuf(prng, maxSz, true).toString('hex')}`, + }), + client, + ); + + // Prehash (keccak256) + await runGeneric( + getReq({ + payload: `0x${prandomBuf(prng, maxSz + 1, true).toString('hex')}`, + }), + client, + ); + + // Prehash (sha256) + await runGeneric( + getReq({ + payload: `0x${prandomBuf(prng, maxSz + 1, true).toString('hex')}`, + hashType: Constants.SIGNING.HASHES.SHA256, + }), + client, + ); + }); + + it('Should test ASCII text formatting', async () => { + // Build a payload that uses spaces and newlines + await runGeneric( + getReq({ + payload: JSON.stringify( + { + testPayload: 'json with spaces', + anotherThing: -1, + }, + null, + 2, + ), + }), + client, + ); + }); + + it('Should validate SECP256K1/KECCAK signature against derived key', async () => { + // ASCII message encoding + await runGeneric(getReq({ payload: 'test' }), client); + + // Hex message encoding + const req = getReq({ payload: '0x123456' }) + console.log(req) + await runGeneric(req, client); + }); + + it('Should validate ED25519/NULL signature against derived key', async () => { + const req = getReq({ + payload: '0x123456', + curveType: Constants.SIGNING.CURVES.ED25519, + /* Not doing anything. It is commented out. */ + hashType: Constants.SIGNING.HASHES.NONE, + // ED25519 derivation requires hardened indices + signerPath: DEFAULT_SIGNER.slice(0, 3), + }); + // Make generic signing request + await runGeneric(req, client); + }); + + it('Should validate SECP256K1/KECCAK signature against ETH_MSG request (legacy)', async () => { + // Generic request + const msg = 'Testing personal_sign'; + const psMsg = ethPersonalSignMsg(msg); + // NOTE: The request contains some non ASCII characters so it will get + // encoded as hex automatically. + const req = getReq({ + payload: psMsg, + }); + + const respGeneric = await runGeneric(req, client); + + // Legacy request + const legacyReq = { + currency: 'ETH_MSG', + data: { + signerPath: req.data.signerPath, + payload: msg, + protocol: 'signPersonal', + }, + }; + const respLegacy = await client.sign(legacyReq); + + const genSigR = respGeneric.sig?.r.toString('hex') ?? ''; + const genSigS = respGeneric.sig?.s.toString('hex') ?? ''; + const legSigR = respLegacy.sig?.r.toString('hex') ?? ''; + const legSigS = respLegacy.sig?.s.toString('hex') ?? ''; + + const genSig = `${genSigR}${genSigS}`; + const legSig = `${legSigR}${legSigS}`; + expect(genSig).toEqualElseLog( + legSig, + 'Legacy and generic requests produced different sigs.', + ); + }); + + for (let i = 0; i < numIter; i++) { + it(`Should test random payloads - #${i}`, async () => { + const fwConstants = client.getFwConstants(); + const req = getReq({ + hashType: Constants.SIGNING.HASHES.KECCAK256, + curveType: Constants.SIGNING.CURVES.SECP256K1, + payload: prandomBuf( + prng, + fwConstants.genericSigning.baseDataSz, + ), + }); + + // 1. Secp256k1/keccak256 + await runGeneric(req, client); + + // 2. Secp256k1/sha256 + req.data.hashType = Constants.SIGNING.HASHES.SHA256; + await runGeneric(req, client); + + // 3. Ed25519 + req.data.curveType = Constants.SIGNING.CURVES.ED25519; + req.data.hashType = Constants.SIGNING.HASHES.NONE; + req.data.signerPath = DEFAULT_SIGNER.slice(0, 3); + await runGeneric(req, client); + }); + } + }); +}; diff --git a/src/__test__/e2e/wallet-jobs.test.ts b/src/__test__/e2e/wallet-jobs.test.ts new file mode 100644 index 00000000..ad115758 --- /dev/null +++ b/src/__test__/e2e/wallet-jobs.test.ts @@ -0,0 +1,932 @@ +import { getDeviceId, getPrng } from '../utils/getters'; +/** + * Tests against the wallet_jobs module in Lattice firmware. These tests use + * the `test` hook, which is not available in production firmware. Most of these + * tests are automatic, but a few signing requests are also included. + * + * The main purpose of these tests is to validation derivations for a known + * seed in Lattice firmware. + * + * To run these tests you will need a dev Lattice with: `FEATURE_TEST_RUNNER=1` + */ + +import Common, { Chain, Hardfork } from '@ethereumjs/common'; +import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; +import bip32 from 'bip32'; +import { mnemonicToSeedSync } from 'bip39'; +import { privateToAddress, privateToPublic } from 'ethereumjs-util'; +import { question } from 'readline-sync'; +import { Constants } from '../..'; +import { HARDENED_OFFSET } from '../../constants'; +import { getV, randomBytes } from '../../util'; +import { DEFAULT_SIGNER } from '../utils/builders'; +import { + BTC_COIN, + BTC_PURPOSE_P2PKH, + BTC_PURPOSE_P2SH_P2WPKH, + BTC_PURPOSE_P2WPKH, + BTC_TESTNET_COIN, + copyBuffer, + deserializeExportSeedJobResult, + deserializeGetAddressesJobResult, + deserializeSignTxJobResult, + ETH_COIN, + getCodeMsg, + gpErrors, + jobTypes, + parseWalletJobResp, + serializeJobData, stringifyPath, + validateBTCAddresses, + validateDerivedPublicKeys, + validateETHAddresses +} from '../utils/helpers'; +import { initializeClient } from '../utils/initializeClient'; +import { testRequest } from '../utils/testRequest'; + +const id = getDeviceId(); +const client = initializeClient(); +//--------------------------------------- +// STATE DATA +//--------------------------------------- +let currentWalletUID: any, + jobType: any, + jobData: any, + jobReq: any, + origWalletSeed: any = null; + +// Define the default parent path. We use BTC as the default +const BTC_PARENT_PATH = { + pathDepth: 4, + purpose: BTC_PURPOSE_P2SH_P2WPKH, + coin: BTC_COIN, + account: BTC_COIN, + change: 0, + addr: 0, // Not used for pathDepth=4 +}; +// For testing leading zero sigs +let parentPathStr = 'm/44\'/60\'/0\'/0'; +let basePath = DEFAULT_SIGNER +const mnemonic = + 'erosion loan violin drip laundry harsh social mercy leaf original habit buffalo'; +const KNOWN_SEED = mnemonicToSeedSync(mnemonic); +const wallet = bip32.fromSeed(KNOWN_SEED); + +describe('Test Wallet Jobs', () => { + + it('Should connect to a Lattice and make sure it is already paired.', async () => { + expect(id).not.toEqual(null); + await client.connect(id); + expect(client.isPaired).toEqual(true); + const EMPTY_WALLET_UID = Buffer.alloc(32); + const internalUID = client.activeWallets.internal.uid; + const externalUID = client.activeWallets.external.uid; + const checkOne = !EMPTY_WALLET_UID.equals(internalUID); + const checkTwo = !EMPTY_WALLET_UID.equals(externalUID); + const checkThree = !!client.getActiveWallet(); + const checkFour = !!client.getActiveWallet()?.uid.equals(externalUID); + expect(checkOne).toEqualElseLog(true, 'Internal A90 must be enabled.'); + expect(checkTwo).toEqualElseLog( + true, + 'P60 with exportable seed must be inserted.', + ); + expect(checkThree).toEqualElseLog(true, 'No active wallet discovered'); + expect(checkFour).toEqualElseLog( + true, + 'P60 should be active wallet but is not registered as it.', + ); + currentWalletUID = getCurrentWalletUID(); + const fwConstants = client.getFwConstants(); + if (fwConstants) { + // If firmware supports bech32 segwit addresses, they are the default address + BTC_PARENT_PATH.purpose = fwConstants.allowBtcLegacyAndSegwitAddrs + ? BTC_PURPOSE_P2WPKH + : BTC_PURPOSE_P2SH_P2WPKH; + } + // Make sure firmware works with signing requests + if (client.getFwVersion().major === 0 && client.getFwVersion().minor < 15) { + throw new Error('Please update Lattice firmware.'); + } + }); + + describe('exportSeed', () => { + beforeEach(() => { + jobType = jobTypes.WALLET_JOB_EXPORT_SEED; + jobData = {}; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + }); + + it('Should get GP_SUCCESS for a known, connected wallet', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeExportSeedJobResult(_res.result); + origWalletSeed = copyBuffer(res.seed); + }); + + it('Should get GP_ENODEV for unknown (random) wallet', async () => { + const dummyWalletUID = randomBytes(32); + jobReq.payload = serializeJobData(jobType, dummyWalletUID, jobData); + await runTestCase(gpErrors.GP_ENODEV); + }); + }); + + describe('getAddresses', () => { + beforeEach(() => { + expect(origWalletSeed).not.toEqual(null); + jobType = jobTypes.WALLET_JOB_GET_ADDRESSES; + jobData = { + parent: JSON.parse(JSON.stringify(BTC_PARENT_PATH)), + first: 0, + count: 1, + }; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + }); + + it('Should get GP_SUCCESS for active wallet', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + + it('Should get GP_EWALLET for unknown (random) wallet', async () => { + const dummyWalletUID = randomBytes(32); + jobReq.payload = serializeJobData(jobType, dummyWalletUID, jobData); + await runTestCase(gpErrors.GP_EWALLET); + }); + + it('Should get GP_EINVAL if `count` exceeds the max request size', async () => { + jobData.count = 11; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + }); + + it('Should validate first ETH', async () => { + jobData.parent.purpose = BTC_PURPOSE_P2PKH; + jobData.parent.coin = ETH_COIN; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeGetAddressesJobResult(_res.result); + validateETHAddresses(res, jobData, origWalletSeed); + }); + + it('Should validate an ETH address from a different EVM coin type', async () => { + jobData.parent.purpose = BTC_PURPOSE_P2PKH; + jobData.parent.coin = HARDENED_OFFSET + 1007; // Fantom coin_type via SLIP44 + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeGetAddressesJobResult(_res.result); + validateETHAddresses(res, jobData, origWalletSeed); + }); + + it('Should validate the first BTC address', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeGetAddressesJobResult(_res.result); + validateBTCAddresses(res, jobData, origWalletSeed); + }); + + it('Should validate first BTC change address', async () => { + jobData.parent.change = 1; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeGetAddressesJobResult(_res.result); + validateBTCAddresses(res, jobData, origWalletSeed); + }); + + it('Should validate the first BTC address (testnet)', async () => { + jobData.parent.coin = BTC_TESTNET_COIN; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeGetAddressesJobResult(_res.result); + validateBTCAddresses(res, jobData, origWalletSeed, true); + }); + + it('Should validate first BTC change address (testnet)', async () => { + jobData.parent.change = 1; + jobData.parent.coin = BTC_TESTNET_COIN; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeGetAddressesJobResult(_res.result); + validateBTCAddresses(res, jobData, origWalletSeed, true); + }); + + it('Should fetch a set of BTC addresses', async () => { + const req = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, BTC_COIN, BTC_COIN, 0, 28802208], + n: 3, + }; + const addrs = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 4, + purpose: req.startPath[0], + coin: req.startPath[1], + account: req.startPath[2], + change: req.startPath[3], + }, + count: req.n, + first: req.startPath[4], + }; + validateBTCAddresses(resp, jobData, origWalletSeed); + }); + + it('Should fetch a set of BTC addresses (bech32)', async () => { + const req = { + startPath: [BTC_PURPOSE_P2WPKH, BTC_COIN, BTC_COIN, 0, 28802208], + n: 3, + }; + const addrs = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 4, + purpose: req.startPath[0], + coin: req.startPath[1], + account: req.startPath[2], + change: req.startPath[3], + }, + count: req.n, + first: req.startPath[4], + }; + validateBTCAddresses(resp, jobData, origWalletSeed); + }); + + it('Should fetch a set of BTC addresses (legacy)', async () => { + const req = { + startPath: [BTC_PURPOSE_P2PKH, BTC_COIN, BTC_COIN, 0, 28802208], + n: 3, + }; + const addrs = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 4, + purpose: req.startPath[0], + coin: req.startPath[1], + account: req.startPath[2], + change: req.startPath[3], + }, + count: req.n, + first: req.startPath[4], + }; + validateBTCAddresses(resp, jobData, origWalletSeed); + }); + + it('Should fetch address with nonstandard path', async () => { + const req = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, BTC_COIN, 2532356, 5828, 28802208], + n: 3, + }; + const addrs: any = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 4, + purpose: req.startPath[0], + coin: req.startPath[1], + account: req.startPath[2], + change: req.startPath[3], + }, + count: req.n, + first: req.startPath[4], + }; + // Let the validator know this is a nonstandard purpose + validateBTCAddresses(resp, jobData, origWalletSeed); + }); + + it('Should fail to fetch from path with an unknown currency type', async () => { + const req = { + startPath: [ + BTC_PURPOSE_P2SH_P2WPKH, + BTC_COIN + 2, + 2532356, + 5828, + 28802208, + ], + n: 3, + }; + + await expect(client.getAddresses(req)).rejects.toThrow(); + }); + + it('Should validate address with pathDepth=4', async () => { + const req = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, ETH_COIN, 2532356, 7], + n: 3, + }; + const addrs: any = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 3, + purpose: req.startPath[0], + coin: req.startPath[1], + account: req.startPath[2], + }, + count: req.n, + first: req.startPath[3], + }; + validateETHAddresses(resp, jobData, origWalletSeed); + }); + + it('Should validate address with pathDepth=3', async () => { + const req = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, ETH_COIN, 2532356], + n: 3, + }; + const addrs: any = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 2, + purpose: req.startPath[0], + coin: req.startPath[1], + }, + count: req.n, + first: req.startPath[2], + }; + validateETHAddresses(resp, jobData, origWalletSeed); + }); + + it('Should validate random Bitcoin addresses of all types', async () => { + const prng = getPrng('btctestseed'); + async function testRandomBtcAddrs (purpose: number) { + const account = Math.floor((HARDENED_OFFSET + 100000) * prng.quick()); + const addr = Math.floor((HARDENED_OFFSET + 100000) * prng.quick()); + const req = { + startPath: [purpose, BTC_COIN, account, 0, addr], + n: 1, + }; + const addrs: any = await client.getAddresses(req); + const resp = { + count: addrs.length, + addresses: addrs, + }; + const jobData = { + parent: { + pathDepth: 4, + purpose: req.startPath[0], + coin: req.startPath[1], + account: req.startPath[2], + change: req.startPath[3], + }, + count: req.n, + first: req.startPath[4], + }; + validateBTCAddresses(resp, jobData, origWalletSeed); + } + + // Wrapped Segwit (x3) + await testRandomBtcAddrs(BTC_PURPOSE_P2WPKH); + await testRandomBtcAddrs(BTC_PURPOSE_P2WPKH); + await testRandomBtcAddrs(BTC_PURPOSE_P2WPKH); + // Legacy (x3) + await testRandomBtcAddrs(BTC_PURPOSE_P2PKH); + await testRandomBtcAddrs(BTC_PURPOSE_P2PKH); + await testRandomBtcAddrs(BTC_PURPOSE_P2PKH); + // Segwit (x3) + await testRandomBtcAddrs(BTC_PURPOSE_P2WPKH); + await testRandomBtcAddrs(BTC_PURPOSE_P2WPKH); + await testRandomBtcAddrs(BTC_PURPOSE_P2WPKH); + }); + + it('Should test export of SECP256K1 public keys', async () => { + const req = { + // Test with random coin_type to ensure we can export pubkeys for + // any derivation path + startPath: [BTC_PURPOSE_P2SH_P2WPKH, 19497, HARDENED_OFFSET, 0, 0], + n: 3, + flag: Constants.GET_ADDR_FLAGS.SECP256K1_PUB, + }; + // Should fail to export keys from a path with unhardened indices + const pubkeys = await client.getAddresses(req); + validateDerivedPublicKeys( + pubkeys, + req.startPath, + origWalletSeed, + req.flag, + ); + }); + + it('Should test export of ED25519 public keys', async () => { + const req = { + startPath: [BTC_PURPOSE_P2SH_P2WPKH, ETH_COIN, 0], + n: 3, + flag: Constants.GET_ADDR_FLAGS.ED25519_PUB, + }; + try { + // Should fail to export keys from a path with unhardened indices + await client.getAddresses(req); + } catch (err) { + // Convert to all hardened indices and expect success + req.startPath[2] = HARDENED_OFFSET; + const pubkeys = await client.getAddresses(req); + validateDerivedPublicKeys( + pubkeys, + req.startPath, + origWalletSeed, + req.flag, + ); + } + }); + }); + + describe('signTx', () => { + beforeEach(() => { + expect(origWalletSeed).not.toEqualElseLog(null, 'Prior test failed. Aborting.'); + jobType = jobTypes.WALLET_JOB_SIGN_TX; + const path = JSON.parse(JSON.stringify(BTC_PARENT_PATH)); + path.pathDepth = 5; + jobData = { + numRequests: 1, + sigReq: [ + { + data: randomBytes(32), + signerPath: path, + }, + ], + }; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + }); + + it('Should get GP_SUCCESS for active wallet', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeSignTxJobResult(_res.result); + // Ensure correct number of outputs returned + expect(res.numOutputs).toEqual(jobData.numRequests); + // Ensure signatures validate against provided pubkey + const outputKey = res.outputs[0]?.pubkey; + const outputPubStr = outputKey.getPublic().encode('hex'); + expect( + outputKey.verify(jobData.sigReq[0].data, res.outputs[0].sig), + ).toEqual(true); + // Ensure pubkey is correctly derived + const wallet = bip32.fromSeed(origWalletSeed); + const derivedKey = wallet.derivePath( + stringifyPath(jobData.sigReq[0].signerPath), + ); + const derivedPubStr = `04${privateToPublic( + derivedKey.privateKey, + ).toString('hex')}`; + expect(outputPubStr).toEqual(derivedPubStr); + }); + + it('Should get GP_SUCCESS for signing out of shorter (but allowed) paths', async () => { + jobData.sigReq[0].signerPath = { + pathDepth: 3, + purpose: BTC_PURPOSE_P2PKH, + coin: ETH_COIN, + account: 1572, + change: 0, // Not used for pathDepth=3 + addr: 0, // Not used for pathDepth=4 + }; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeSignTxJobResult(_res.result); + // Ensure correct number of outputs returned + expect(res.numOutputs).toEqual(jobData.numRequests); + // Ensure signatures validate against provided pubkey + const outputKey = res.outputs[0].pubkey; + const outputPubStr = outputKey.getPublic().encode('hex'); + expect( + outputKey.verify(jobData.sigReq[0].data, res.outputs[0].sig), + ).toEqual(true); + // Ensure pubkey is correctly derived + const wallet = bip32.fromSeed(origWalletSeed); + const derivedKey = wallet.derivePath( + stringifyPath(jobData.sigReq[0].signerPath), + ); + const derivedPubStr = `04${privateToPublic( + derivedKey.privateKey, + ).toString('hex')}`; + expect(outputPubStr).toEqual(derivedPubStr); + }); + + it('Should get GP_EWALLET for unknown (random) wallet', async () => { + const dummyWalletUID = randomBytes(32); + jobReq.payload = serializeJobData(jobType, dummyWalletUID, jobData); + await runTestCase(gpErrors.GP_EWALLET); + }); + + it('Should get GP_EWALLET for known wallet that is inactive', async () => { + const EMPTY_WALLET_UID = Buffer.alloc(32); + const wallets = client.activeWallets; + + // This test requires a wallet on each interface, which means the active wallet needs + // to be external and the internal wallet needs to exist. + const ERR_MSG = + 'ERROR: This test requires an enabled Lattice wallet and active SafeCard wallet!'; + expect(copyBuffer(wallets.external.uid).toString('hex')).toEqualElseLog( + currentWalletUID.toString('hex'), + ERR_MSG, + ); + expect(copyBuffer(wallets.internal.uid).toString('hex')).not.toEqualElseLog( + EMPTY_WALLET_UID.toString('hex'), + ERR_MSG, + ); + const incurrentWalletUID = copyBuffer(wallets.internal.uid); + jobReq.payload = serializeJobData(jobType, incurrentWalletUID, jobData); + await runTestCase(gpErrors.GP_EWALLET); + }); + + it('Should get GP_EINVAL when `numRequests` is 0', async () => { + jobData.numRequests = 0; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + }); + + it('Should get GP_EINVAL when `numRequests` exceeds the max allowed', async () => { + jobData.numRequests = 11; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + }); + + it('Should return GP_EINVAL when a signer `pathDepth` is of invalid size', async () => { + jobData.sigReq[0].signerPath.pathDepth = 1; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + jobData.sigReq[0].signerPath.pathDepth = 6; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + jobData.sigReq[0].signerPath.pathDepth = 5; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + + it('Should get GP_SUCCESS when signing from a non-ETH EVM path', async () => { + jobData.sigReq[0].signerPath.coin = HARDENED_OFFSET + 1007; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + }); + + describe('Get delete permission', () => { + it('Should get permission to remove seed.', () => { + question( + '\nThe following tests will remove your seed.\n' + + 'It should be added back in a later test, but these tests could fail!\n' + + 'Press enter to continue.', + ); + }); + }); + + describe('Test leading zeros', () => { + beforeEach(() => { + expect(origWalletSeed).not.toEqualElseLog(null, 'Prior test failed. Aborting.'); + }); + + it('Should remove the current seed', async () => { + jobType = jobTypes.WALLET_JOB_DELETE_SEED; + jobData = { + iface: 1, + }; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + + it('Should load the new seed', async () => { + jobType = jobTypes.WALLET_JOB_LOAD_SEED; + jobData = { + iface: 1, // external SafeCard interface + seed: KNOWN_SEED, + exportability: 2, // always exportable + }; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + + it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { + question( + '\nPlease remove your SafeCard, then re-insert and unlock it.\n' + + 'Press enter to continue.', + ); + }); + + it('Should reconnect to update the wallet UIDs', async () => { + await client.connect(id); + currentWalletUID = getCurrentWalletUID(); + }); + + it('Should make sure the first address is correct', async () => { + const ref = `0x${privateToAddress( + wallet.derivePath(`${parentPathStr}/0`).privateKey, + ) + .toString('hex') + .toLowerCase()}`; + const addrs = await client.getAddresses({ startPath: basePath, n: 1 }) as string[]; + if (addrs[0]?.toLowerCase() !== ref) { + expect(addrs[0]?.toLowerCase()).toEqualElseLog( + ref, + 'Failed to derive correct address for known seed', + ); + } + }); + + // One leading privKey zero -> P(1/256) + it('Should test address m/44\'/60\'/0\'/0/396 (1 leading zero byte)', async () => { + await runZerosTest(396, 1); + }); + it('Should test address m/44\'/60\'/0\'/0/406 (1 leading zero byte)', async () => { + await runZerosTest(406, 1); + }); + it('Should test address m/44\'/60\'/0\'/0/668 (1 leading zero byte)', async () => { + await runZerosTest(668, 1); + }); + + // Two leading privKey zeros -> P(1/65536) + it('Should test address m/44\'/60\'/0\'/0/71068 (2 leading zero bytes)', async () => { + await runZerosTest(71068, 2); + }); + it('Should test address m/44\'/60\'/0\'/0/82173 (2 leading zero bytes)', async () => { + await runZerosTest(82173, 2); + }); + + // Three leading privKey zeros -> P(1/16777216) + // Unlikely any user ever runs into these but I wanted to derive the addrs for funsies + it('Should test address m/44\'/60\'/0\'/0/11981831 (3 leading zero bytes)', async () => { + await runZerosTest(11981831, 3); + }); + + // Pubkeys are also used in the signature process, so we need to test paths with + // leading zeros in the X component of the pubkey (compressed pubkeys are used) + // We will test with a modification to the base path, which will produce a pubkey + // with a leading zero byte. + // We want this leading-zero pubkey to be a parent derivation path to then + // test all further derivations + it('Should switch to testing public keys', async () => { + parentPathStr = 'm/44\'/60\'/0\''; + basePath[3] = 153; + basePath = basePath.slice(0, 4); + }); + + // There should be no problems with the parent path here because the result + // is the leading-zero pubkey directly. Since we do not do a further derivation + // with that leading-zero pubkey, there should never be any issues. + it('Should test address m/44\'/60\'/0\'/153', async () => { + await runZerosTest(153, 1, true); + }); + + it('Should prepare for one more derivation step', async () => { + parentPathStr = 'm/44\'/60\'/0\'/153'; + basePath.push(0); + }); + + // Now we will derive one more step with the leading zero pubkey feeding + // into the derivation. This tests an edge case in firmware. + it('Should test address m/44\'/60\'/0\'/153/0', async () => { + await runZerosTest(0, 0); + }); + + it('Should test address m/44\'/60\'/0\'/153/1', async () => { + await runZerosTest(1, 0); + }); + + it('Should test address m/44\'/60\'/0\'/153/5', async () => { + await runZerosTest(5, 0); + }); + + it('Should test address m/44\'/60\'/0\'/153/10000', async () => { + await runZerosTest(10000, 0); + }); + + it('Should test address m/44\'/60\'/0\'/153/9876543', async () => { + await runZerosTest(9876543, 0); + }); + }); + + describe('deleteSeed', () => { + beforeEach(() => { + expect(origWalletSeed).not.toEqualElseLog(null, 'Prior test failed. Aborting.'); + jobType = jobTypes.WALLET_JOB_DELETE_SEED; + jobData = { + iface: 1, + }; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + }); + + it('Should get GP_EINVAL for unknown (random) wallet', async () => { + const dummyWalletUID = randomBytes(32); + jobReq.payload = serializeJobData(jobType, dummyWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + }); + + it('Should get GP_SUCCESS for a known, connected wallet.', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + }); + + describe('Load Original Seed Back', () => { + beforeEach(() => { + expect(origWalletSeed).not.toEqualElseLog(null, 'Prior test failed. Aborting.'); + jobType = jobTypes.WALLET_JOB_LOAD_SEED; + jobData = { + iface: 1, // external SafeCard interface + seed: origWalletSeed, + exportability: 2, // always exportable + }; + jobReq = { + client, + testID: 0, // wallet_job test ID + payload: null, + }; + }); + + it('Should get GP_EINVAL if `exportability` option is invalid', async () => { + jobData.exportability = 3; // past range + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EINVAL); + }); + + it('Should get GP_SUCCESS when valid seed is provided to valid interface', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_SUCCESS); + }); + + it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { + question( + '\n\nPlease remove your SafeCard, then re-insert and unlock it.\n' + + 'Press enter to continue.', + ); + }); + + it('Should reconnect to update the wallet UIDs', async () => { + await client.connect(id); + currentWalletUID = getCurrentWalletUID(); + }); + + it('Should ensure export seed matches the seed we just loaded', async () => { + // Export the seed and make sure it matches! + jobType = jobTypes.WALLET_JOB_EXPORT_SEED; + jobData = {}; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeExportSeedJobResult(_res.result); + const exportedSeed = copyBuffer(res.seed); + expect(exportedSeed.toString('hex')).toEqual( + origWalletSeed.toString('hex'), + ); + }); + + // Test both safecard and a90 + it('Should get GP_FAILURE if interface already has a seed', async () => { + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_FAILURE); + }); + + // Wait for user to remove safecard + it('Should get GP_EAGAIN when trying to load seed into SafeCard when none exists', async () => { + question( + 'Please remove your SafeCard to run this test.\n' + + 'Press enter to continue.', + ); + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + await runTestCase(gpErrors.GP_EAGAIN); + }); + + it('Should wait for the card to be re-inserted', async () => { + question( + '\nPlease re-insert and unlock your SafeCard to continue.\n' + + 'Press enter to continue.', + ); + jobType = jobTypes.WALLET_JOB_EXPORT_SEED; + jobData = {}; + jobReq.payload = serializeJobData(jobType, currentWalletUID, jobData); + const _res = await runTestCase(gpErrors.GP_SUCCESS); + const res = deserializeExportSeedJobResult(_res.result); + const currentSeed = copyBuffer(res.seed); + expect(currentSeed.toString('hex')).toEqual( + origWalletSeed.toString('hex'), + ); + }); + }); +}); + +//--------------------------------------- +// HELPERS +//--------------------------------------- +async function runTestCase (expectedCode: any) { + const res = await testRequest(jobReq); + //@ts-expect-error - accessing private property + const parsedRes = parseWalletJobResp(res, client.fwVersion); + expect(parsedRes.resultStatus).toEqualElseLog( + expectedCode, + getCodeMsg(parsedRes.resultStatus, expectedCode), + ); + return parsedRes; +} + +function getCurrentWalletUID () { + return copyBuffer(client.getActiveWallet()?.uid); +} + +async function runZerosTest (idx: any, numZeros: number, testPub = false) { + const w = wallet.derivePath(`${parentPathStr}/${idx}`); + const refPriv = w.privateKey; + const refPub = privateToPublic(refPriv); + for (let i = 0; i < numZeros; i++) { + if (testPub) { + expect(refPub[i]).toEqualElseLog( + 0, + `Should be ${numZeros} leading pubKey zeros but got ${i}.`, + ); + } else { + expect(refPriv[i]).toEqualElseLog( + 0, + `Should be ${numZeros} leading privKey zeros but got ${i}.`, + ); + } + } + // Validate the exported address + const path = basePath; + path[path.length - 1] = idx; + const ref = `0x${privateToAddress(refPriv).toString('hex').toLowerCase()}`; + const addrs = await client.getAddresses({ startPath: path, n: 1 }) as string[]; + if (addrs[0]?.toLowerCase() !== ref) { + expect(addrs[0]?.toLowerCase()).toEqualElseLog( + ref, + 'Failed to derive correct address for known seed', + ); + } + // Validate the signer coming back from the sign request + const tx = EthTxFactory.fromTxData( + { + type: 1, + gasPrice: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 1000000000000, + data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8', + }, + { + common: new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }), + }, + ); + const txReq = { + data: { + signerPath: path, + curveType: Constants.SIGNING.CURVES.SECP256K1, + hashType: Constants.SIGNING.HASHES.KECCAK256, + encodingType: Constants.SIGNING.ENCODINGS.EVM, + payload: tx.getMessageToSign(false), + }, + }; + const resp: any = await client.sign(txReq); + // Make sure the exported signer matches expected + expect(resp.pubkey.slice(1).toString('hex')).toEqualElseLog( + refPub.toString('hex'), + 'Incorrect signer', + ); + // Make sure we can recover the same signer from the sig. + // `getV` will only return non-null if it can successfully + // ecrecover a pubkey that matches the one provided. + expect(getV(tx, resp)).not.toEqualElseLog(null, 'Incorrect signer'); +} diff --git a/src/__test__/integration/__mocks__/addKvRecords.json b/src/__test__/integration/__mocks__/addKvRecords.json new file mode 100644 index 00000000..a56f5067 --- /dev/null +++ b/src/__test__/integration/__mocks__/addKvRecords.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "0100d04ed4310d810055eb0c33ba04d9631dde8d79d0d92ee01c9bf716e06af3f44b77c2082b4862d02135a928631e1f54844a0f90fee7c79cde79e72eddb484b83777e60b450af882384cdbb1d173e1d01b9c405d7617d0da2932f66d90b80e3acfd78d290775cfcad12160b4b9cf586271475d047b033af9d03a6a69f52ce7cb02152c9b3f0f19aae2b30362352c07aa7fc23d464765cf7dafc40fb9d5657f8bdfcf0e23f7d8219327556ab684d3c6857ba9c4c7946d48e3977f05dab5aaaaec16e6011bf9ce98f8b0016de91da0ff89f6877a2c7f93f9830588fbede08635da18345e5a7a7bd0e85cfbf751f28269a1d47b90ad3e673eb9ba1b8676ae3f12aac74cbf20c32a11f812e10e59a612c5af770a9116f6a673fb62286c84c923610dd103d92ad713225912bd65c797243a9a70987b51729643761b7b3f8401ab062f72efc1d3d6a25708c8805538a8af0c43de7541c3ad384c09555e4015c7c008904a26ce05b38bff4cc7736e47bfec550ec66a64d3b0cb0f025f32aa8cc9f5d25c7fd0dbee81ec90136ae5a45fdcef180a779f03025fad97d035d02f2c2fa7f235f917992db038528f28b994e04af5b049ec275142d57b176346e3a97074fd94a8c1726ed86fe9f44e3db4b608948ea830d845f05100fa70e507af5b0b6a810548b23bf744ed140295525e667cf1a529645add1d02795f58b9b3ca6c47e40ec99ada4725d0094cc2fdd76448cf45f4644845f3c86f5d50643679c94aba63e6c78d877cc868701176cccb5930265c84858e7d5ea20a5f4ca35bfd4b28687bf6b67afea7d6c3aa7d73d586b074644d3469aeec086d9f91a56c40d3f5eff4466ef0c866f279b4c3d0d6d0cf7d35d052fd2e8626b9f2a966cd90efd49c8c9894778f06582a5f11994cb3055779dc1b09c401b622af9ff9797a254568425c93a06b9dac8f97482ad282e2d4f53497076952f7c4ebb39946a4bd360ede9472d6401811f2189418f5513cdeb898dffc463d0071a68a91a40740967a39386eb643519603ce2ba94725c61367ad31ee1e180d74148d81f52f6fca491d83af84d124459be161e259ea2088c4f5f0c157b54aaa0e84295acf0bcf42d079c7397c0712356c451964bb4f52c0b2881d7bae8f021e69f474bb92cc2e473ef564cac4570afdc57c6eb45ce4dcb18f4f8fec4c0ad29b8dc93044fc2c7c46495d0d9be6ff25b5531917b324b60311c982fc2de3149685d3ba4eecc567f2018cf90b7436bd0d3b3d29abd8babffd26df94abb39278e92b7f62d2c7bdfea7de442acdbdd578ba233768e512081bd148445c87704a44353e1dfd770d4aa1f0ef2194f085ecdbfd1cfe3acd46d8457f45e52d2e5e27607702f2261a51a91fb23ce0890ad0290166993ed4642cb040e6952b1f8c4fa50685e98264e41c8cc747dcc9f149d229b5462a5643fd240b01c59a1453c39795b619fcdf0a9bf16cb280fb27ab7fd9b2fc85d330211f4b4c224e59c1f69698bf38613f8ab6ecf868748fe57d7787b15f45871f1e9e893a57ecc29331147712c1be855526e5d036745ef75e154149d441a6c7ace5a3e787a97577b09993d7423ed08ea0eb9a654cbcefc1afc62abc88028241e77625b1489f7cede86e905a807a6833f1fa223f6a7a02cc3e927cfcf7d230b188717788190ddc716a6586688ed6d562890c6e5af8142f272709c8c3bb2221030ae6d1c8937972c32782d32c9a871723107c7e6b5c5cf610f4a77d8fa477b27f60beb67cf9361acd46bb7d7934e9705753eee8a7f02e9769e72785094c283a9c85a5002d05c2d57670194cffb0be4409608560bcb8fb8fe8eb1d3b1975279f9b76c36653276498210a388aa7fe8e312ffaf97d71ba0c190471b0efa79dea111150fd71bce2386811eecc4537d2942a24a2f83ab4e3e764da9864c5d1fb51ae342d9b289e1616fad4c6e23575b88004fc254beed53e474d8400b81cf13e208475fae3292cd7cf60dec5346b4bb4cba008d3ff52ac8d8f748331243821e86cc8addd96da026268e780f170189d4a57098ac7f474eda8d94cad1fb0967010e37ccb28603a21bed6efed3f9295cb6cc7406758a9ca0350535523d07c50b1197dbcea31db87c03f5ef3c9a5580c598483124d76ae7f38cc76fb94c07bbd236c7c7294fd9b80f280ee02102399eb8e4e0c66dc12cfd4f61137f9e7def0af4db1f88b40b1888a09f18b60ac17f2469f47e7d6eeb98e25638f89594b20a87217ab15ea9c9ac7530ce10af64d53601d15438f330afd80b55f717bc2f5d86d3811902fc4eb6ee8d4b1aa2d86ff2788d1b1833f6581bc5f1748579c2999aaa51e56364a3e5aad2172e7d5de74953e6ab1b5de74077c8267f92dec39abe2f1f31163cab9efbe1b5852b2ad891fe289ec68919bf422586dfc7328afcd5dc6a27f3d9f87e3f3e247d5857963f0083e2deea20600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066e17acd" +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/connect.json b/src/__test__/integration/__mocks__/connect.json new file mode 100644 index 00000000..3cc06c1c --- /dev/null +++ b/src/__test__/integration/__mocks__/connect.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "0100c7d11ffc00d70001048f065cf1beafadb8d15d31adc8d1f029e25b24dc9cda017cfd054a2a86e2b53eaabf9437cf69fa68f20fff3b80b2b5806e8fc6651890bdae7ffad2c4a8a43151000f00009d00f3d077fabeac89f0f0b2fba9c642630e3a1c1aa845f9e3c9e2c0234d6d05634b0d7bbf4c0de40a69336e5126392aa86976d2378cefd835659f22b1b7dc47c9f7731696ae1ba92c9d3011ad9c9cb12973b0e788a4d87d72f4a757e1a7e4fb41616d0790e90fcd0fe138b4e15170b77f76e2974e47bd275010fc70f03ed71692da4780422fba345bb787abaa91f8e9b7075819" +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/fetchActiveWallet.json b/src/__test__/integration/__mocks__/fetchActiveWallet.json new file mode 100644 index 00000000..8d11dd20 --- /dev/null +++ b/src/__test__/integration/__mocks__/fetchActiveWallet.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "01003bcd1aa00d81002787d6c0b1220a4b90cfa9e1a60a52898a7e93f11071d2c0aa0326334a22a757f1a60a5db6133eb0fa4e2abe2a76b2bcecc63fd04fff0faf216e09acda8fea4499773f0ab7eef76d1d622acc89bca480f214bd5f4f1f1fe15178e9cb4eddcb390b1cb58a8a4fef696366f93e898ef2513479a045534b4a8eb12f5dcc3e7fa32158b4e6c4d6117f0cf6985034bb16e4bc98c1f8618751c547b76b896c23255ef0a5c94a83a7b1cd2b6d80d9249e238cc72481d0e121e3d9eee8289ce1039a51e7549f057eb071cd987da5d930b584e9b72adb3c10a46ab7770340fb419ee7f4902203a4de8f8fb5d9e47fcf607f606ab696062eb606b55bb59c61351c34dd141184546603026825d410165f34c9fa5ddc767d19d87bbdb62ebb62d69fe28fc4382b56d86b9e6465144a39ef63dcefc249a7a774f586c949c6fa80662a6d5160ebc941a8c2175273133563ed62ede65a3f86db8dc88d8b265874b05e8cddf761889a3b0f88851d5ecb44bde41b80ab6b16da50ba2dcbab2547059bc739b3d72a65b2b73e4b1d213fe2845c3ddfe3a4b89f12b960efe3e529814e8af72d7870bb7463d94d5de6a248e07b9ab35abedc9d5ff9a56fa694f8a7c8b488b5d99d72f73695e03e9af7e168e25c8e623c5f6c2083522eaeb5c22dbdb96b86b4151db81749606b04fb5d90a36b2152c11cb969cb517eb82be5ef64080f21bcc9e0d8ab605284426e1ceed0c5bdd723a0684bff52e0aaeadd808ae34d5c9925a5d001aedf08450b3735c9163b6cc06c27cf799b9547fdc7394c823f646fc963b0157084da1f80229861c7505ea8f5b2632b466fb65dad5c14324c5bfa393eb680acc88826ee44d460f0e8a68f0327efdf4f6d6a9f3b84adc880d68b26bdbd810e4e4108c207b5ae16398a923ee99fce38ae919741d61b32b14eb7d2d93afc62c7b158838640b0c05166dfc336447db72a14486a2052654b91414e1c9770ef114b406c2da1362ef0dfad67d4596928a80203e37d55eb34140bfc08e8de3b08e6710a5d5dcaea4ba7218e9486d5b47ad21322cde46de690f28e1a9e65ee0f87ecf9f5677fca297aed8dc80d31b98052d23f3e98694aa1bdf604a07ce7e4c6f3003b8b05cd7f9d12834d46697128a938475ffdb959a5eb0fa8496063c583afc95f60adc837878c0253f48d0308a0b00f43deab2859e0f80b3371d565a26289d8fd4497959610871853a246eca4c4479c191fdd639591b5f6d30cd1bc43a361c1fe0552a5d0da0ed3bad45a315cd5bd22cec8e3d5e72cba511d648db4ccfa879693edba0c3be2dad2575e35572b8778358a7741266af08be09aadfa4fb4e1b319498177141456464f1205c9eba6ba70c1b54b62c9731e13e6b237c4a3054fa0e5e3c8c44d270313fa2bd983ecfbd39d9515ded9ab10229b88c3817325e4011ae523e7e8ef3c64155f7de97c49db23e2dc878e6a4323d33f386a7a30bad4115b6014f70045bf40a3ebf62018b983f2347d404d15b6f85efea7416cc96eb286191d6ae445000e888076019156b918b06924a11af86848559e786fcc32e8ec8ab78c768147893eac84f8c5768b934fbfa53cb51553c96dc96f55c17542501096b358d6c93991810aef3c3fea8a2acaee05460979e063d45a1c2f9df8af32d6d197b70e6baf0a1e1dd854aab30af389c0adf2e3dceb06c45be1c106991e63c2aa9d490ec14aef9bdacb4444065e42f934dab13d98232d4e3423edacfe0d45d21c275611e32216fd1d0f9b8bdff2220636436591ea1ec9aa9edbd8ce9918a05be052785233ea7a77cfcbc2cf99d78611369c1de30357f96304d641a36dd06a37648b22a0c71502952777b8dc6357378e6f7498b84cd0f3a995f427b7ba515bc747f95007181966da77989d1a12591ca642997b4ed8d5ac1e9987ece7795c3fcdb1537cc137a83dc2b3f92eabcf71062fab5954cb8209034655340420ddc738927122695d419588aaf17e474f4cf9a17b4bee303f199bbe6e8532f9676e4d661e1d723a27cb8a72ccb55b25c7a737fae013428318da1e431b45846ab17a44df40af30be3f1828a6a5fa94300b9073f9cb684b226919fe48ef8d4fd4d3a54962ab44641284e20e3f95942decba15fe4e317a44043bc5c688131af1c90878c4b3f606f7e470dbd554536bb4e782406737ebbaf895bd7c7e872cad1a69f5b8da0cbd4b42e5e3bff54dcf210cbf5a1f268346a4a06939e1c7387eb6e8feae01b29d0cec0825666479c989f5b6f87f5ecd9d5c019f6cd3fb0ff1982c4a524c8e6f27d538b3692940f2efb99aabe7de08144ad16bb2dc3fbb364d52d1d60d05358cf7e2f59fdbaf5b997913fe835effbf1559b465570ea5b2536cbd12e09c7bbc7a09a52947922c44f69d6fbeb77a138810f2296c890835bc29b7057a5e1aa01a71f6c80358106b80a596ba3383000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd784421" +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/getAddresses.json b/src/__test__/integration/__mocks__/getAddresses.json new file mode 100644 index 00000000..fc990752 --- /dev/null +++ b/src/__test__/integration/__mocks__/getAddresses.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "01008b93b3ab0d81002985bb78f76d77d49d48acf5442bdef94b128a2f8abeb7b00afe7f695f833d0fac418b85babdd26f23c1d70408f3bbeadd777167d9f7ec258a299e3b939fbfda6ebf61e1fba91a646aa0a54a81514adf813a1406f6244ec3f9b20cd2084a1087917b3d7497aee4aca9de756f54ae193b9f21621c57f87e6fe4464297ae13e02b0d342d3087b267558a9f8c02b10ca045afa501b4581642f8c4b26e9adb665eeedb4ff86cf230a9f72c0903d33bf6617c87dacf9c02cb68687d53961f202704930a9522392c61cd906681352c355285668afa2312d20e7e87ad7ebb50f486d48c437d9b6fff67c6ebee6dccba8763f3b1fa8037a25981baedb2a671b40db7ddb6fa96605cf1f6c6484782b7f7e3bb1ea256e3a01afddb303ad325462ed745b8e2b0cc3837b7616b9ad815bebd4d40b1539d319dcc01ae068da364d5921d1a364a69e4825eff47aaa10fe26cfaa676df692295f1dba4dece0634621b8e087352f06dff391c27d70b22bd788ab5e4ec90cd89ae264e1d2391180e31f6c8c457d10b7855fa4be125c4fc3cee903f707171480d8f9f4ca974a211aa43b521ad4d86ca8883d2ddef931203fff0af3989e3a18fa47b3efc63996fffecfa6c9bcf499fcb5cdf996988bbce91b89815eca134992d191ede6eede485e94a3a199b7404c26b5058d5552bf7e61654f8733c12de0b52f23d7c031a2b86e89d1af9b5a8d7212c6ee448ff2a4f3996920bcdea914c128833862cf6f54f42781d688f6d6f5c6e789363aa811ee3f1422b93e18dca729bae933f460313f5348667cde5e61e0a3c24c65e6969f1c4d80aa94f94d28a79821a47994ac45fc36d2ff7fc11948ab880b6d8c352f13336c707bcd108994f75dbb4481c8912a883d07a9f8678ab1a2e5124607b8a18c12b2e19e22c46ed48d374fd7fcb11d8e6f58028313c8784f13fe71c91f6daa3e9a32658f9e6c8230b31f973e6790e6cd5e53035bb1039a556ab9ad9f99e317ed84caade9e5d8c973371ee56b831600085c09a7233f088ae883f0037b5c3e7ade54be865bb8526e8b8973c3c34b96954bec66183acbd094a56840401b01f151fbf47b7c73887d45257307da30fc957ae0be98161d413d7bfeea6fe743f2a0364ff8c231b97bcfc4bc6f45b48018759e27167ba60a1a66382bb1f45747c73690d40bb09921585b4d11afa9827434713f5ca707be077b9e23a41774d535c83f9adaff7ff2bab37a344bcb4b3bd8049cd3281125e4d9376cf17572fe04bf8d32fc5fe1a274dc26493a940ca11ab7327a8eb3ff8fb3fac99a5a313b0ca3320070ce9946965cbf7538e18e3cd7f1955741ea5d1c5c669cdef304c4b2622123f2fa26b559103d9cd44e405fa35ed4748e0eb5a1991cd389f1da5224629ac8e585f9cf087db470385a5bebbd792088f9c53ba7f8db516b22b9adf7390f3d65479078d7f7b4dd6c42201e520a41766f7d0b5dc5cb0b352a0f05832badd947e5643acf84f2917da9168e29f3c2de45a06c9625ea48e447f2141cf488544ac025715a649f08252b515e6b9e3fb1559759a2985a6ab4c9fbdead8838e97c048326ab0f6438dad15eb8d3bdff5fa687d422e98461a04289df0591e7e318ac71fd10c94748e36598651906157cc73b8a24f933b9d281ed5d8893cfd5670a1549af10ecb0fb85b90a10523ca5c32de3f3409d5381acf42f63ad25817de6f9e55ddead7d887d0271448738fa464ed7483a26c9f46471dbda12faf81eb2e0959699d41ef52a077203933551192e2e5daa16cc24bac966fdba50097c37e686f74c2ad29b5b4e012ac6d5f41c92be365e0d3de30ed5dda205f098ea33e3d10dfd40847237745be12910f012fc1293ae62beff4086274a4fef3f945a742df1e36aa58ccc4e32e43ee6566bacc11815a5d49c1c1f9f813248951338a0db937aa81f4a06c49e4c91e1a18b892be88adb6d56fac8f76bf4e422b273f5671a64f842734c74d8db51e1e10cdc1929488ef84d4a0934644a4c594c89cdf3796d2c1a26321a8729ddf10d9fe706ff5faa5484ec518b9ca22f119d24cb66b5c2f185c97b6092c53181903baccc46d42165c568d9b10f8f1d1192e6eda80140bc6c05a0be04a08025fdf45a56d09ff4c392adb6942d825e67efc72f21c70a61562b6496e5593ee52d71fa3436b57a42b27215bf51d20f72d563111edfabd594d566bfa1be65567b9a6f2844a18a3c4a5c9df2cc490cc5edbee414cd8dff57bfc38fab0a0a4180cd4ae9c6bcf32ca3dfd792893301bfd3d29d1daaea8a7e96f6ed129f26e3aafd0088506bd411711ff3d1351fa97bc580e960775edfff52015d382e827a0ebdb1b2bfd104c8272ddfe6a9182bf66ec23a7162cb7aee10c83b9b3aa612612183a3613bb84ef0a59edbdc6b36b33a520222b5959bb39a30cad70a72456a6aae3d291509446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000327c4720" +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/getKvRecords.json b/src/__test__/integration/__mocks__/getKvRecords.json new file mode 100644 index 00000000..62fadf4c --- /dev/null +++ b/src/__test__/integration/__mocks__/getKvRecords.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "010092647efa0d8100347d04bc0f5c154535340722c1c2a7294131418e44d3010adcc9061dc46619741489df487aff8d3a998d3ce4578e959fb350d47d1afaff74fa88edf5e56592c20317ea62e0114c15c0342db2ebb684f8dfb7f16bf0229d20a043254f7aa032a5f1572811218c76b2e53c3ba12702deef12fb7d91aa8488bb7cc878faa9e7f310faac834fea46179feac05f7b63ba011485cef895c615ed3c21b42d09ba963ac83993f3ccc603c4d5a3d7c423d0b588cfdf4503cf1ac2260a2fd843d38713395ac7eecf60ef037e6191481310c10f912891bb4a82afd890f6b8a609a875d0f1c9102d05a1b2410d1fd39fb74170fe2aeeeecc3fa648fb9f9fb37c022fd68591a279f21537d33cdde63dc2408e298e0f001740e44f60c6178786ef82b0216c4a53495aa0b42b0ccd496f71e0f5bcd4994f13eac91e65e02195ea5b4adf29b02c25349f068006c73d03dfcc4f560340e5c8a35bf09052c458f7c2d62859259884659f91c3f77adf4c04c73d38c5f14e81189e21c01f83ae36653b4dbea4bf6ef52b8fa8b95bc990a2fee721556710113694ae4b70425c56371639a24cea27cbc81fb4f871da3d66ed797ad70dccf4d9f2fedfa1668dad76b6681d21ddcd1f0fa49abbefded15b5877e909df677036e38c56e680b6da88f87a43638914337eaa6c4475a17e59206c629c2c5f6baaf4aa7bfad96bb36000a9d792d0100d1b2d5d522f28e1902164a3234bf3242068d824d68cf597882d6833b39b301c8a7274e96e66350336dbffc1e84d5acfd39b289c4d901c7d2d233058dd2438d7cb03146faf7d6bb1a36f8608171e3f547a14e435778b1351de1c697ce0b45c7dd042b225559a56c26c544afe66eebddfa637f3d3ea9550df2a5b73b607b6e68bd4638ed40c2eafa1f20daefbf21fae12f69442e01fc9ddb558d90fa047e0761c59e56b2a367b827c44a134ccef8e59a43b5ce9b4ce0ae2cfbd60558eb3f76741ddde019c8b9964a5f9d9f1a5fbaf0ee2ee0434f38999ab373122eb6532cf6d4b2d1f2e9f37a53fa5348f47a2450c675e591a32b14b80b2fd930e4e33656f23839fc84cba96fa10cbd06841ee894606bdac7ba7260c4b86bfdd0bafe2d7f2bd0eff7e117b4239171745705b0fe8ca2d671f35a447dd5ab3ff0d2b2321e308c7b068abb71aea5b633129f8b2ab953c3081985ccbb095184f7523371ceb0aa94fd45b9b860de9da67da62113fe509d5b2d881ed0880d196d04d2ad44be299aa13528c09fcfa7e5da1c0489f8f3bd92a67ed11cf0555beeba875bf77b568ca978ddf61dc2b0b5807f5a161df6f408c668a4edb0d05d7d4fb4e017159722b126f635f0d93e7ca110b08dc2b1f8a527e0dca0868ecd76647d94b3c021b5ecd0d7626b940e17662f2df931dcd9e354b1d7d8bf271413bc6a4c1e89be5cfdd02af31a888314a13f51b4767705813fb6d8b98e4032473bc8ff6baefa4bdf6bf1f578134829a1ba4952a87e871ee54f36fb10f1d9bfe3279f2ef6f61e8af7b5bccfe8d86a68b0755cc8fc440e0ddcde5476df656b49a908815e20f8cb8a2ba4ae8bd447cd6535e044f7e4420b0bdd9289df6d91256d1cfae090afe25afcbd5a15fbfc146760dffd7538f70005b87d697f9c96f0e1672e4c1e8892517f4cee2c27faccf245d4f52e3874c637cbb10986a3970cc9d005c866b930972c200ae78a7fea1cb03ea33df8702542007d03f5406e9d4f93259b7ea8ce2f7d7debfeb10a71886a3d43866c98da548d2c716d104e31da89032056e2cdda4dca80267f28c6a943cbc21dc956d3887316c48c9f050a4181f7cf3b855d757fb11f9caed0adfab821afd0c512cf71cf6b2cfcc344912b937611d88581de96ab75b11121dc3be02c73d44181dd840b2a3968d79f0d7029dee4690d91ae1dccc739fdceb4612e070da018128a7556be8eef8930516c13b8e8d8d28dc5034cce953d017d02546ff7292b3aa284ab3c7894bf4f636e0a9c8b8c3473bb5b0086a29fe77fac6087ced1778f5eeb2def0d1790b802a9dee1b4683679b8c0235060e39a3ebf5a194e5583b020c2b2ecc53904e6a3dd281b072fd13fea08ce3e8b2d490b3c57402335c20bb4547e066d4166ff2728d720687818397d5dd0c30ff55f0b2b0f122a76c636c3334b26009f57b41ae33c2638f8ebb4408e95cf0bff7a6232075fd1dfc482d74e9ac8a6b0cdbd17d9e1daa75d72c3d26cd2c31046794d53000dd99ecdcf6574b9cdade232535ebc86044858deee8d5894989e9e0495702fa31a8bf0cf97f8d9a34d204818cf71996e1f07e20ec22b9c27ee74044c72733c055ffa8530527cdee616235ce4cb986bab91ff5bcaa5f5aa647a57e4e25194db9bcdf2b5392efc0ebad5db35ff8661bd9daf024619711f4a3941fdefc399c2d77b05c152ad243f314d7178da553f2fa6adb8a08d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de551a6b" +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/handlers.ts b/src/__test__/integration/__mocks__/handlers.ts new file mode 100644 index 00000000..67bcfad3 --- /dev/null +++ b/src/__test__/integration/__mocks__/handlers.ts @@ -0,0 +1,32 @@ +import { rest } from 'msw' +import connectResponse from './connect.json' +import getAddressesResponse from './getAddresses.json' +import signResponse from './sign.json' +import fetchActiveWalletResponse from './fetchActiveWallet.json' +import addKvRecordsResponse from './addKvRecords.json' +import getKvRecordsResponse from './getKvRecords.json' +import removeKvRecordsResponse from './removeKvRecords.json' + +export const handlers = [ + rest.post('https://signing.gridpl.us/test/connect', (req, res, ctx) => { + return res(ctx.json(connectResponse)) + }), + rest.post('https://signing.gridpl.us/test/getAddresses', (req, res, ctx) => { + return res(ctx.json(getAddressesResponse)) + }), + rest.post('https://signing.gridpl.us/test/sign', (req, res, ctx) => { + return res(ctx.json(signResponse)) + }), + rest.post('https://signing.gridpl.us/test/fetchActiveWallet', (req, res, ctx) => { + return res(ctx.json(fetchActiveWalletResponse)) + }), + rest.post('https://signing.gridpl.us/test/addKvRecords', (req, res, ctx) => { + return res(ctx.json(addKvRecordsResponse)) + }), + rest.post('https://signing.gridpl.us/test/getKvRecords', (req, res, ctx) => { + return res(ctx.json(getKvRecordsResponse)) + }), + rest.post('https://signing.gridpl.us/test/removeKvRecords', (req, res, ctx) => { + return res(ctx.json(removeKvRecordsResponse)) + }), +] \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/removeKvRecords.json b/src/__test__/integration/__mocks__/removeKvRecords.json new file mode 100644 index 00000000..8527892f --- /dev/null +++ b/src/__test__/integration/__mocks__/removeKvRecords.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "0100f506dfce0d8100f5382a032169e8a60db71d0cc125b75e03839d4a886fad4dff893c0edb6c6bcf908755bd667b09416f308f313c34dff3e696e08225615e29e75af7f2c5450ed7246e1c7aebe6a74834ce7d6c797575da65718d88d3349a8b370924059db3e38022816d0f968f22c9061f000cfd7e734bc4775647701ee7b640577b62e797630c7fb91bc89faf6783ab93b3d3f66b19f6bd5bf1eeb5dc6300f4a42391a592c7df2913654a4e4963e6ddbc07a215fd815d0ede1fbf31c81225a55825171b4f0d10ab0cd8ea1fe560961cbcd8fb6732fab742afdeaf92d79d91d06cf9591eabcc470e684080c861bb94b4c8b79977c69dc39804b91c18d257192412432aaefbbf546196d09c5586cfa5a951c7a4e1dbe908b82022225739884328dc44c6b60cc23f6f71ff506ad514761e14d0b94c742220e67ed15145cf2b82bb030ee560447bf421d65d97aa52fe97f9f8bf92d11acca19b3bca7d076fb36171c431491de93e105a598426d4fdc7d7e5e214ac22ccfbd89def4a0876d440492b6cb706d5d3698b44f9d2dbb7623cd7981575ad8f42654f36656dfe5b3fb606cfe134124e07320ac6d00b7f6d000036737439404b49df0ccaaff56cf60d93c18f253c5abc1518350d5c286862dd5d6f11d01e676fe32c0bb19e658ccb829136bbff6fe36b16a74929be6df7672c0bcf1b4f11fadc38e0bec43d5fee0b4b95c6d16d9e968f142392a0da4d138798d0f98747c771cd23c7bd81910139415a6d5cc894f312406976782c8ffc18d63d7797cda33e2d73d79e2d42dab4778fb1aef80b049c010045c898ebf1cc0da9a62a10a2c3f00e8fc7b03fd240a11262bec322b8b74680c06bd21f77044992b85877a9f7fc60763007d7e9929caf0c1f2a746e99c544ed3b0550f62b1cc99b4bb76c543ffde434187ae923971af02ee800690d999ab82c40c3cb926b41b90fa06d77d16b91bddfff24b0afc6fc31acd31a98fd7992af943d6e6e462cc53deaf02725ddb64056d9bd2a381ca1537f52ffc010cdeaf35f6b34ca2dc045d7f28a0fbff646ceeaf1ebfcea8951ebf3a84058d69f923fceecd35183f92f5e4c5b70300ca50bb304c0b6a8e91afbc06d6468a276f2ee5ae524320838a280e4c334b3e6fdeba302c3a767ae9989441493b6e4ee731ccd0641847f8465808cd5be7515e9bd406866970297e6b886e76251b62be2e22dfa2eaa1c0f53cde7884a345470ea7505ad0b618c3eaa469210bfe1b79d0bbeb0e477177e75ed0e0b7b1dacd00f2dcc05f5ad940e7cfd52f1417b05cebd26470b87ad8f278ac92bcff2a5f9a5f97b3a085ee6306e57ce3bf0df76ef34aec9ad7b9b3eb307d0948ee6157d27c433c49a8815e7d7391eb9b74a3421128bdb4b9699a3d3256dc769adf975d9fb0d517e25d5c2884c2a8d448b16c24d9c012a3f2c9ebec6a7f5ea99cef6fed3be6abd6df8e3b0ad4894350da4085446ed7ac9854242b5b296e83c39e2dcb74976b6a8c8da756e9897fad7db9c37f100d3fde0683f1dad72b3712705dcc4761884f2b8e88e08056f0c15bb9aed9e8f4bb113ee35487eb14c79bad5254869ebc69b1249ce8640425f3c7e0077ad3de5b29b43b506157f5ed17cdecca39dd6694e6aba9de524f34da16231c4ce991b5420dd4d77640d2af0b45bdc679d1894de07021aceca5547998be5c306bbb1a67d3125cc71f1286afd99f62ff8dc74815ba4a1136447aaff9599dffeda139de7c1f739171c17ae54306c6cc8c9a73e1437ec8c627384a2229d3be5992895922ef434e6a1db7083aabaf3401d3025f5f943a5bb39733a265782b783d8a746fd9bf0bf40bbea7c7bd963bb3a47a3117e831920dddd1393944a0eeb8a00a209e010c4f85eb6aa5e17dcb7af55aab9ff982395b5915b55db81d42facb1044c5453c0cec5cd6207920730258c22482237c318045a27638bb00bf7e89d3a6175aa18eab54a8ab7269f8718ead7c5ea04a879fc8eca77e58626d1f801bc6986c32cdbde57b3674e21152ffdeb8a582336ec9c14351f43964858d50265727b6dd8c55d292a45bbf81d224381eafe80957913dcf893f66ff7d3b4906b3a7b03769dd937c50080a9a9adb1b63bcd8c3260310a12808415faf955af4d4c2abb3978794b0d326138b77a8260349acf09cc8c9692872317070aaa67bc59fe7259bc2e27390f72527aefa2650a94f1f0c982ce9247fd945ef28501f9202928d2601fca9b88ac7c4438c3dc95478fe5d21747cfa3ea616bd7c054aa3b9ed856fad8cc239b374a0514dc1629139a1266bf479489a632fa5e0e2880f2e6ebce99e9fd0f1057c89882b8be3e7759fa5ff320c2d3ad0b749cc9fbf73bc1a555290c6561c60e7696372608caf4cebe3e9536c5d68f7e3ba6d4ea0e53d44fe2720c0bd59beab66914eba61fa7d9d41e44e059ba22821ff59a945d1900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077c76262" +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/server.ts b/src/__test__/integration/__mocks__/server.ts new file mode 100644 index 00000000..fadac07f --- /dev/null +++ b/src/__test__/integration/__mocks__/server.ts @@ -0,0 +1,5 @@ +import { setupServer } from 'msw/node' +import { handlers } from './handlers' + +// This configures a request mocking server with the given request handlers. +export const server = setupServer(...handlers) \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/setup.ts b/src/__test__/integration/__mocks__/setup.ts new file mode 100644 index 00000000..35819577 --- /dev/null +++ b/src/__test__/integration/__mocks__/setup.ts @@ -0,0 +1,7 @@ +import { server } from './server' + +export const setup = () => { + beforeAll(() => server.listen({ onUnhandledRequest: 'warn' })) + afterAll(() => server.close()) + afterEach(() => server.resetHandlers()) +} \ No newline at end of file diff --git a/src/__test__/integration/__mocks__/sign.json b/src/__test__/integration/__mocks__/sign.json new file mode 100644 index 00000000..f269426b --- /dev/null +++ b/src/__test__/integration/__mocks__/sign.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "message": "01002dde2fc80d8100f4467649112807f2691aba39712f8276c532ec605d258d952d7367d6cd31e9f4851885e13d318991756b371200687537752710471422eb48e56ce485886516ec7ac01ae2981880e504560d3a34e328cf1bcf0ca2f34ff9013cb5362973dd8987e077f79305ec32ca42e57438e4029ca11cdfe1c063a5bbcdc13e4e970767ff402e7edc665f7a607df7c8e19685b21ecb0286054c854a588e45b675a10d23212ec9afc8ac25380ca893c6a2d031a4154b778e1cc87c5dfb59d04afc9eb5f5a6339a0fae0c74c1ee877e21a636a2324c97c26f6f64f8749c389b0b78d7c1f4cb67e8aaa683d1b0440f1b2d334433fd92b3a6bcbeb05d19eb10ec2c90b4360fc180478402f5994a95e5b3d7b7a2037234e0c70a4746d87597a7a720b09bbd62ed8d13ff0e4522fc27b56e773e1d44575bca9ee313195d7bba55183a85dc3347fd21ae59105020fa366d9c9ee215f452b78acaa8ccaf2389d37f35832133ea08980c1a176646a01ac66f00eccd797b61691184b29e3749fa136a4f7aaaac9a035c48fe3c69d1671529ba5fb0123014092272821b3137313fb2cd2fce9cf98b95b979f56ad1f6acc1cbc060cd931ddde70769665a94d582dfb8b29bb8ae55a5f780110dfc82e33f3cf7f808836f6761214ac776e1087bf607259bf16bd3477116fda0ed2abdd631a8b0fe538afbf8b7c2f017eba763f59bb8d7f41d5a043389804c2bbdb8fe70830606beae34095b3d1f376e0dff3d65a4b012f7c5338bc17aa2ec4e376b9d50529d577ed199fb370c5d35e0c9b1b07589f80f5c344c9f02d2221aa8aa342160882ffc52a55fb557df7615c3e225f0b6188c95c862ce4f6f852dc7cf38f246599e59359a6c503e0cd17181cd4d44895df7a8397f0da8a9b4f1f0dbe1fc97a511069e4a6529698c12d25e842b670fec89c4131dd2877bf679a31e2ec565aaeebda19c22635a97a8d8e0e64879e7976fbd48f7babce745b59f5c6c97a9436292053200d829b6d1ab111b804c580a9b42454e232c83af4f4c0782b728674bda6964bbac10332cd0811e1a598e5b77f2ca865b6857118d3a50f633e46150d038342bf00fb1ff1db3085a29f7e9176c5da9a87bc374ad7a3b8245e650bf372ea2582bdc876e89e2ee1d4788d10d2336878db914f0ac76838fc822c9d57507cc6deaf1a75fd4608c241c92bcb4e5f3c038d5411d7a4d7e2dacedcdd089712a7dbaf4473ab00a3c8fbe3a134a967dfd4661b4548845bd2430c6fc45d41e6160e777c0431567bbeda0824c383c1dfb6b34cc86c97f398dd28d1e235ccc44707724ef2f85bd899523e3f72ce7fd8ba28ab32afff69a3477f7b110f11217e30c1fa0d381b2fa164b5ab7080aabeb728a3884add4d2154be53853b19dc7ee278f8a2c3de3a5813b3222cc703775949cf2242395a57471e89d2fbb105834c24da5cd97a3a455decf7ed777c16dba6bf53ab6cf9470f10cae1e0cf3d03228478f9ebded681caf39578893d049f735b636fc2aca25555193d32f705091b85a160fbc0e1557b4e08a7a0d53a9551f457250338f2a750a288901af01c0084c8c09565ba3d63e1773ebf6af0cd0c9bedc1273ff53558e9fcc3d0e9485b12fcd80916beecdeaa78ac913e5483380c1b42329eaafd952d08aabf3441e1f88f119abe5c302984bec72790ab182ee4247852d0b721b33fefb22161ead095bd6a2bcbb58e0cfbedd03a3a3d500312426e55e911f6ae79caddb148d18bf60e311caf14677edf8bad0a477052dc2ff195f61367e492911e5a4e7cbf55296eae45c3cd0d3eedc0f061411ea8af9e59f7e6a231d7fbe4171a63c15f1055978ebaa9dd0c51aad9600df64c328fcb929b108f480804c81d59415fb7a34a5e927efd9c46b4cbefc4fc6ee4c278384f887d6f4db98d13b0e2ee76df8c2a9caa39495e9c0c72506e535d6a3a621548adceb4890570b750e15a2ee6067a81d85b26899cb376cf29c4c273b59ab920be8889e93bdd5b3fd9e1e772e207a141f667c75070ea8422f1ef183a988a54c72781b0a25ff384379fb58b6257b8937a7e5586fe25954d01fa096e8961adb1ac6ac4d3dbaa2f39ce4230c35dfe17e3f654c2d2be6af1ef2c4d754bbd706622385b2d7fe08a1a6e4ddd97ad79e8348432b2994517c92ef577c4dbb9654a4b269b74690c4c671fb4280fdfa8451d1114a8ed4de40771ac07fe5af53a4caff6e4947121a4100e86cf70ebef0f13d2ec0f464a5b62ddfced450d16a391e9b3cbd5a29c02a329f467d9126bbb9c6277c83642b843e4e66ae7404e95350ed11bdf68808909c16da254eb419d358153bd3a77e92bc089e7e0f237ece80a271689685025cc3b8b8f0abbeef2809f4124a25188af345923aca679241b0235e5cb3bd305b6aa7f4054505c1fb0dff6cd2ed54070622d7acc41817913ea351d72f087e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a35cd3c2" +} \ No newline at end of file diff --git a/src/__test__/integration/__snapshots__/connect.test.ts.snap b/src/__test__/integration/__snapshots__/connect.test.ts.snap new file mode 100644 index 00000000..502f4ee5 --- /dev/null +++ b/src/__test__/integration/__snapshots__/connect.test.ts.snap @@ -0,0 +1,3813 @@ +// Vitest Snapshot v1 + +exports[`connect > should test addKvRecords 1`] = ` +{ + "data": [ + 4, + 150, + 132, + 63, + 137, + 108, + 211, + 160, + 45, + 140, + 217, + 174, + 94, + 173, + 120, + 106, + 107, + 6, + 152, + 176, + 98, + 63, + 184, + 218, + 213, + 94, + 200, + 209, + 193, + 243, + 118, + 153, + 91, + 18, + 178, + 135, + 106, + 42, + 146, + 19, + 136, + 34, + 250, + 92, + 11, + 125, + 98, + 30, + 192, + 42, + 108, + 60, + 249, + 169, + 235, + 114, + 54, + 55, + 127, + 174, + 152, + 13, + 176, + 45, + 195, + 227, + 91, + 122, + 178, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", +} +`; + +exports[`connect > should test connect 1`] = `true`; + +exports[`connect > should test fetchActiveWallet 1`] = ` +{ + "external": { + "capabilities": 1, + "external": true, + "name": { + "data": [ + 76, + 111, + 115, + 116, + 32, + 100, + 105, + 103, + 105, + 116, + 97, + 108, + 45, + 103, + 111, + 108, + 100, + 32, + 111, + 102, + 32, + 83, + 97, + 116, + 111, + 115, + 104, + 105, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 251, + 230, + 125, + 166, + 100, + 189, + 123, + 95, + 163, + 34, + 243, + 53, + 36, + 65, + 33, + 139, + 170, + 53, + 190, + 195, + 189, + 40, + 136, + 190, + 23, + 112, + 186, + 217, + 89, + 79, + 185, + 128, + ], + "type": "Buffer", + }, + }, + "internal": { + "capabilities": 1, + "external": false, + "name": { + "data": [ + 76, + 111, + 115, + 116, + 32, + 100, + 105, + 103, + 105, + 116, + 97, + 108, + 45, + 103, + 111, + 108, + 100, + 32, + 111, + 102, + 32, + 83, + 97, + 116, + 111, + 115, + 104, + 105, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 48, + 211, + 148, + 167, + 113, + 193, + 34, + 206, + 53, + 247, + 135, + 139, + 246, + 129, + 5, + 103, + 239, + 103, + 153, + 71, + 221, + 83, + 125, + 243, + 98, + 31, + 39, + 18, + 151, + 173, + 203, + 168, + ], + "type": "Buffer", + }, + }, +} +`; + +exports[`connect > should test getAddresses 1`] = ` +[ + "0x86060bb25df7b65f5153988840f88c13eed3a18b", +] +`; + +exports[`connect > should test getKvRecords 1`] = ` +{ + "fetched": 0, + "records": [], + "total": 0, +} +`; + +exports[`connect > should test removeKvRecords 1`] = ` +{ + "data": [ + 4, + 179, + 235, + 129, + 252, + 208, + 195, + 206, + 119, + 150, + 135, + 10, + 243, + 233, + 195, + 126, + 103, + 184, + 93, + 31, + 24, + 39, + 156, + 47, + 255, + 159, + 200, + 39, + 105, + 62, + 18, + 30, + 126, + 152, + 106, + 108, + 54, + 166, + 52, + 53, + 35, + 84, + 81, + 96, + 148, + 160, + 57, + 191, + 100, + 54, + 227, + 214, + 112, + 234, + 110, + 75, + 166, + 53, + 149, + 33, + 201, + 122, + 81, + 213, + 6, + 121, + 23, + 96, + 156, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", +} +`; + +exports[`connect > should test sign 1`] = ` +{ + "pubkey": { + "data": [ + 4, + 148, + 178, + 80, + 242, + 110, + 253, + 113, + 8, + 85, + 91, + 38, + 229, + 248, + 152, + 131, + 100, + 121, + 193, + 18, + 28, + 90, + 3, + 195, + 182, + 142, + 8, + 67, + 173, + 33, + 168, + 45, + 34, + 202, + 61, + 74, + 238, + 20, + 38, + 76, + 5, + 12, + 128, + 150, + 49, + 131, + 4, + 83, + 23, + 146, + 125, + 148, + 195, + 195, + 48, + 236, + 111, + 178, + 84, + 163, + 241, + 166, + 192, + 87, + 180, + ], + "type": "Buffer", + }, + "sig": { + "r": { + "data": [ + 252, + 41, + 239, + 189, + 31, + 64, + 165, + 251, + 14, + 121, + 0, + 78, + 133, + 209, + 235, + 51, + 137, + 1, + 133, + 23, + 93, + 218, + 198, + 179, + 81, + 43, + 35, + 221, + 242, + 10, + 130, + 207, + ], + "type": "Buffer", + }, + "s": { + "data": [ + 41, + 69, + 102, + 46, + 79, + 101, + 126, + 33, + 167, + 83, + 91, + 80, + 196, + 31, + 116, + 174, + 4, + 218, + 77, + 230, + 56, + 69, + 49, + 254, + 173, + 98, + 62, + 160, + 95, + 52, + 61, + 68, + ], + "type": "Buffer", + }, + "v": { + "data": [ + 1, + ], + "type": "Buffer", + }, + }, +} +`; diff --git a/src/__test__/integration/connect.test.ts b/src/__test__/integration/connect.test.ts new file mode 100644 index 00000000..5c3e69d1 --- /dev/null +++ b/src/__test__/integration/connect.test.ts @@ -0,0 +1,74 @@ +import { HARDENED_OFFSET } from '../../constants'; +import { buildEthSignRequest } from '../utils/builders'; +import { getDeviceId } from '../utils/getters'; +import { BTC_PURPOSE_P2PKH, ETH_COIN, setupTestClient } from '../utils/helpers'; + +describe('connect', () => { + it('should test connect', async () => { + const client = setupTestClient(process.env); + const isPaired = await client.connect(getDeviceId()) + expect(isPaired).toMatchSnapshot(); + }) + + it('should test fetchActiveWallet', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + await client.fetchActiveWallet() + }) + + it('should test getAddresses', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + + const startPath = [ + BTC_PURPOSE_P2PKH, + ETH_COIN, + HARDENED_OFFSET, + 0, + 0, + ]; + + const addrs = await client.getAddresses({ startPath, n: 1 }); + expect(addrs).toMatchSnapshot() + }) + + it('should test sign', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + + const { req } = await buildEthSignRequest(client); + const signData = await client.sign(req); + expect(signData).toMatchSnapshot() + }) + + it('should test fetchActiveWallet', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + + const activeWallet = await client.fetchActiveWallet(); + expect(activeWallet).toMatchSnapshot() + }) + + it('should test getKvRecords', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + + const activeWallet = await client.getKvRecords({ start: 0 }); + expect(activeWallet).toMatchSnapshot() + }) + it('should test addKvRecords', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + + const activeWallet = await client.addKvRecords({ records: { 'test2': 'test2' } }); + expect(activeWallet).toMatchSnapshot() + }) + it('should test removeKvRecords', async () => { + const client = setupTestClient(process.env); + await client.connect(getDeviceId()) + await client.addKvRecords({ records: { 'test': `${Math.random()}` } }); + const { records } = await client.getKvRecords({ start: 0 }); + const activeWallet = await client.removeKvRecords({ ids: records.map(r => r.id) }); + expect(activeWallet).toMatchSnapshot() + }) +}) \ No newline at end of file diff --git a/src/__test__/unit/__mocks__/decoderData.ts b/src/__test__/unit/__mocks__/decoderData.ts new file mode 100644 index 00000000..60ca4c75 --- /dev/null +++ b/src/__test__/unit/__mocks__/decoderData.ts @@ -0,0 +1,24 @@ +export const connectDecryptedData = Buffer.from( + '01049d09fb09e26afddbcd280f4ccb1e01aa5ae24015f89df2ccf6923915c0bf2537e3698946cdba580d492123a00bcb990b2bd53bf943737d1ec69f80ee94a6716a000f000086b7008c4e03f1e9faacb3e26c363a517248536eea190f22db2147249b38bb3b23ab8a68fb93fa4ebf1d23bc21b49c071631ca8be1085a096bbc3b3c6e483ba4f0a76ba4039938aeadcfe3581aa7097c8e20d6e3976b6522033978d0bdb6f39503024a84915178737c08e8704d83eba012d61c8e761d83767f6a92f4157a4b370622b625d4c47495e8fb22fd68e68055', + 'hex', +); + +export const fetchActiveWalletDecryptedData = Buffer.from( + '04908babf748e922906794d87371a3796d3a612a84a99edb4bb09e2648c1f48301032c0f0b00989c1f35038d8f146bbf35629274792c588cc4062947d80dec621430d394a771c122ce35f7878bf6810567ef679947dd537df3621f271297adcba8000000014c6f7374206469676974616c2d676f6c64206f66205361746f736869000000000000002d337479d775a93e2f67533de0dccedc52f3d2080cd3b1fd01cada670ea6f718000000014c6f7374206469676974616c2d676f6c64206f66205361746f736869000000000000005bfbdb8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 'hex', +); + +export const signEthDecryptedData = Buffer.from( + '04f6c6b42df23d098fb0e2af81922d6f4968b5030b6942aaf01a7910415e34dc6def6a4c3a3ef6661c54b6c4c82f0283119d2fbd8eed6e650e8852249d28bb2d600494b250f26efd7108555b26e5f898836479c1121c5a03c3b68e0843ad21a82d22ca3d4aee14264c050c80963183045317927d94c3c330ec6fb254a3f1a6c057b4304402207276976e6110ba46c4c08bb33ec06cc873a9bab060b849af0a6ac218004e925d022020b26a10ae192589cc45030feddf1f7abdebf6026a35912f125c138c1b78ce4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b15940e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 'hex', +); + +export const signEthMsgDecryptedData = Buffer.from( + '04372ed70d4105e57d20bb5b337ba8efc782e3bf9b7f706baaa9b4fb26e42b8a639e0591134c6b1e97643b294a278833b4365b4c4e6dbb0c1415560baddc62559f304402207db9e97fa8a2de98835bd320dc2a77fbbe1babe60f67cb405d0ba25c9d49ff3d02206fc01778bea900509bad56d262a7c7546d3cb2fb6d5a1236bb012cf68ea666410000000086060bb25df7b65f5153988840f88c13eed3a18b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa7cba450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 'hex', +); + +export const getKvRecordsDecryptedData = Buffer.from( + '04738154da07d35484f754e81d1782d1c71bd4eeeffed486c00af15b8a9c3b227a7eb7e89e1afc3e1e0826f22f6d562f97513df0e29fd6b38f6ecc5ab840304e320000000101340db5d6000000000005746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574657374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000207257d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 'hex', +); \ No newline at end of file diff --git a/src/__test__/unit/__mocks__/decryptersData.ts b/src/__test__/unit/__mocks__/decryptersData.ts new file mode 100644 index 00000000..2af1a1b7 --- /dev/null +++ b/src/__test__/unit/__mocks__/decryptersData.ts @@ -0,0 +1,7 @@ +export const pairEncryptedResponse = Buffer.from('df2c47c09e4eca4d6bd13c4a541769e9991076da24a154938e7d08685b6586f90719a915dddba32e01eebd375cb6f3163419194003db036edd684835bd1f59256fd828e1415441551192fd3232a5c08f79708ad487a121510bd12f615594016794ace8719518bb51065ceedda4e11a20f8073564240a231a1b8ed5958a1bf7a64d7487ca2297efdb27bf63014fb8a27050d5568a4c2b6d9c46b94dbae3e3d15e99473dadfa1ea017dedbde9d8362623083613589005366e7db17d8e1ca517fa08730910af03475f450da0b35cfc955d32892780fe6ca4205dc2c48c7d539668b13f889f740b69473f40c17042fa7798526cc54972f06ec61d414dc3d930262224d53ba531cccbfa918c07a6fad4c424e8f0060f89996dccbedfb765ed43431992b99822185e2d90dfa1c1916a87526a7486381aaf9c83189b26819f3d309b03c5f9814147b3346e137d671c0890b48bb52c13d04e4dea46281bdf892ddf67f2772e324937db042f63758268b3765ff0cab8841f55d7fbc5c70ae9a27e38c8061b017f22f4ecf1f0b8184c5ccc9e8b1edfdbbec142d9e6a9e05e0e10223606dd7127fe0a6ff02b2cb780c06c3fe9942c1248f3e923cc07f322752e84f94a201f3bdffebe568e4a9e54f92ef6cfff585a586407adfc05f2700fe721c8f8ecd18367054d25648625391235f22e638cc72acf826e613eb1c36445b845573132142a8b7d5d3f8e64173ceb14ee7ccb780c8c59029fcfea4c21117065f88ef77a7dcad094cf959c5a2a94a0e71dc1b4d1efc91dab0b99bc4f7f85b57df90c4be33c9ead9bf8ce6861f30f5ca36e191d1cfcad93d73fcc548356e7457c0e87d16d3d1d216576300157a6cdf73591e2e68ef1c73faa593150d42281a53cf74fff2d9f32e5eee31a046dc07ec490c078ca20945f90ab36d68787f97fc8142ba8cd69ddc197c9cce4fd2e6cba8d162ee42502ef66753e2170e7cb8be483942cce838bbbd339bd4b2d0f2adb38166e9079189b72707cd0908d719879bef5bceb4292c5151b4b2d5ffd17356479eb77c9393d9c7d8ae21752be7f5aa11154c67fe0ea7cfd3ceb0feb59e080155f49f19402ea67ac588d5b17d32be0f8059eaea3389b5bb752c8bb6770a17a83a9ad7c31ff0ba74ba8495b4d0a2ea2720e7dedd162eae470734a81c4d68d76e3efc4ed6ccbba533dcaa063e3306016ce798b305db44bd2edd4a5e5ce808c24b6261375ba12aca2f1a93f0b02b7121351af440a87efae00f74e1b460db2a22aab65e140199cde33d30f4fa24846c1de412939621f4001902654a90678286a9eb832e9130cdebd5b97d307eae32e9651471689f3903481ed496cdcca73e6af76001b699bdec5f339797983e0dc2edae525620a9e28791c8ab72da61dcd5dedcba4fbc4bd676640d1cee8b069adf3122f0585ee059f8223cffc3dabde87bd31856fd193113e384402ff3f7431440fcee0df2049a69e9ba619e32a5cc8e3b4faeac144d217b091a19353067d79854289a8a05f4b7b99e90eaca74640762d7b622869e82492374dd4be8448f4e6933f7b4ff42ffb4f954e140db3b8a41239b06c4b6a1dbb11f34ec42735f4e016e04c136160af24aa728583a353112dd73626ca1d9d431ed5aadfb503bcd79359a0f61c760bebe6674919403102cf86ab1b67b0904960fabfb4727a59a52ad4dbe6a1b783ed24c4532287f35c4c36851a9ad0b3df9ae9eb433390dcac15cd2273687b580d95099d04a28e9cb4d52390472d10a5f86be34de9f15217adaa00f14f24308b9cbd12bdd9033aea856efc21deaeb3d69611dd3138a4db08e739241a0399a710c4f739627ad4880af21dca3466e69673976e0ece1bf076ae1e5504b7d952ca0cfbbb3ede87718b9dd7d6a58f5b357015ee50fbdac846b118e87bcbd3b7ee869117ce8825c9f8115d944d2d11d43381950669f6e939988228144c80968e133645732023575a5e1e48518949337552ffe63a5e7e115ae632ae29ba4fb023f49cc5a8bebd7ad984b9b00208146e107a28050b104e48b4c82feb61f7069fdc353d9c40df8603502416c719491eb84d6ce2e25ca8806212ece559fa462f910863b8013dcb163009483b4b15ec3f9fca3609576bfddebcdfb91dba46f51a84451e8ae4d9b12dc769a1cf8f891bbf28ad01b9128acd82209ece379cccbe371ecc569fedf7c952a16e833647a8a0920d5fc9cf980c6547d297c636707ce56feefcfcadbd9f185c36b3d6676834f51f71eda91481865fb0dd8cb80345fdf8b68ebf389dbf1ae8cb5bc81e4fe4214046cdd8f0af3ee7ba9e9b8439778440aa62cf1fe9149aaf2fa88c5da2efc67beb700722d81dc4e6f0abbaa7735c0876ad4f7a6304e8e22828b51e4ac5638ddef3332b82d2d3d05e227f6bc8152d3be2d68c5fab24910b4e8711d605ba5cf5013f2b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') +export const fetchActiveWalletEncryptedResponse = Buffer.from('dfab5728d4b69329087773a8d742bf5c8ba5b4b48fe84e089694d04475cc6f94a3b3b386faeaabaab8fe0301591f89516562ad1599a37c151c394fcb93a041b1b91573b15ab54b9c9873269caa8da4246168b92c456056372526295d3ad05b2fc1c30ec7da9ff7e8c208abc4599cc8c7fc89b6701e8c74600622ec0ae08da291286fe3e4cf31b56622b808980de1a3f8a3b5d436eda9e8c47757c9a62f473ce99041294a8adffa65b5307036e22ff7ccf01e8a38326ddc6d81ee01582c26e5873a9b6d6e67c7979903ff1808695565fa6dfbc236c37aa20d524f341d3f46db5953c2040cc39792e7883282b8c037c4b1bea1c826322ced21aa9dd30dc7a7229159397e86763a9f17e0f2265cac5c29294187e8b9dae0ef4a85a4278a7dee051876495f13feeea1683f573ded70a9d6a52fcb7dc5afc24e18b484ca526d50f75b7bd29ca56dbffa8c3cf2a81eb4f3d4c52eae60f7bde0aa897aacad2fd93897551e7a9446a951b4376f76a76f00406941b53672e3879b5d0f8805e744ac6beea359b94023c05f985e1be9b9fa286c33a0e0bbf88b096afcbc5bdaa0f6e7ee9b643a0e44733e805359553663ac0809651948e6f10697e37fdbc33b3ab06c18f8d529a0965b938cab213f021a7e58d86c58c04198604355963ee34a2a8323452d6cf13d608b7253f925ba6d8ee31a38b0997a8fc4ca96e95d61c19feb589cd1cb6d437a4e378b1af19bc90cd3e048db422c0d0addb0190ffbb1a53a69344fe7ccd57b0f09fefed4b9b755a11c8aaa046d3ae3e2f2184efa597ab9dbc3e0bebff2f1f6563bbb2f23cd0942d2de8e98a9f4934999d8a3e70d8db5d8356bde8248522ebf2126182ad83cf398f324ce105adfc6662697c26756071a5d0a811646407cf3e4f7d79d61d14ee7dc7b8334ebb22174f318e9c4bfc00230a7ff7a497d6ad866ae1f08c37344cbc156c4883c68797b20b771a2528b9bc2bc2e46c322dd3e0426c54293ea87a99d5924eb72e08fa274564f27478e5b8567cacc3932f7b3ab1e471784de3ad4473075217efc827e6932ca890563e5a6d3b7d57519379c146211875c1c76c56174fb4909f690b2b130fc37b9434acad1fbe8f898e09c2282293548502ce6aa9fb8bb09708297e330aa13a736c7bd00ca7882317f26cdb1697b480ce1b2c5fcd1c6e9759d2b202209fd4b42705ffdfb9072e4389b6e7d544fdd4f9d9520aa2ca14c1587b673dc8227ff2afc2441af2f334bbd7240f7c0c1b74e7bd4ff670429ca472268f5aac75daf388142f0323c1f028f74a122ba259d86947de75fe1d651ea62faad6c00820286a916567d03acac157433d452f58d9dafe6f9fbe68de653cb87b867b1830e2c4262eefac0c278a55de8fb5cda3494ee78bfbdfe2eb58a14cd9de64da85e5bd341d0c85d12891bb65eca4b3509dca595de2ffb37874a2495bb5c258997567d3fbf5cee95a5c97d304fdc443a2ad64957ed1d1cfea9e9ddfda2d780f3b11a52520c0a57fa3ef068dd750c89621a0e766ae0f0ea91427c0fd33fa875f84a39b03633ce92cc571fb240c0a25de7c6d3a40a49ebee0ebb82642183d7b87f88ec8d7aea1c0b8e59b3079aef37151cbceee1a9a41377954cb8762478b158e2a1c9753e6463be27b9aa6001dd8d79761def1502ba3596f9ee684eb1c4f7ca7fbc3dac31806980073f9ae5f0e338c581f0d7b9e4d401870e735c4e017ac44a742183bb0148de98df81bd6d965e1232db506a27c63657b3f8a3857e4a4bc7289ba6ba64f4315e338eaffbe3f1c0b42a94beb813a46d911a2b3bbf12461f977ad26d772390320518868f2d76fe6d3a12732fffce38f70f8934b53d23ef9b0f80750770d9b72d50e8635e6421930fc8c50270e70f223a2d8733df11654e6b8a5f38857c7eb19bf85a23dfe6a7e75b6e95718087f03aaef84345b73e27555c374e1b8d0aa0ec82e31db4ef33a4225943040b9be1c10ea42d46082a76bd5c8c595e25c6fb004a05ef132a9580a799009c5e56de2b04031b70531800ec27fe7f1ed9880b9cddd063fa939d42eb829301745c46772788f132c7b4feb569fa5706d0ad8ed2b0dae1e8de752253a56baf91ba40a66ad9e66af60237b5cd16d9f829cd5a00e3e07120f05c2f7d1b1b11ec2a7a6b1631449cc08ef1cf5140ea7669773555254561893ad6177bd14e31473a17560d37666504eb46308da41aa745b2cdda9b06fff2d02dd6b67b92a46efad1748fad9669ab5cc17c260ae1b40de113e383cc5c28f83ade4b973c2d7adde11c28927e0edcc9fd641e5c54ca23c05b7ddb7d9fcbef0d0d857a4b716f7c77e14790ed3eb3e156e24b476d66bb7b8939bb1db0d63f7116755611c89e996bb5f41978e64528635a797e9ba179e37d99f0126a4f5987f35833d9cf5795d02115c186be398b5c000a51a7d6310c28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') +export const getAddressesEncryptedResponse = Buffer.from('4e286c492a7f8c81714d8afc1d465362e65d6cdee5ece9b2b4bdc5e841e74269d09859ccddbe7ed4835d3008b202e73b04813fe05a12518a4655eff1c47687d19a75a0f689fe5f15a0b2e1593f0b8b45b1039ab1b50abfbdadad2aef4e3d609beb1ae65d83c18ab3e335deadaafe79810762587b2fede7b7322057d85414da2e8b06af72a6f865c5d2edd5f2f09c180b88da41a04d54032435449a0c2c6276bbf668c4e04c85b7464826665fc23f1406d9df1d0e44b98934afc9330a459275d18055e117fd644d4054ee17ff9606d93c7a1a4e58259790a15d7fe9ceb4ffa40d041de6cb0f4b34edae4298eea9011f8e50f62a3ec146e00e36144e187bb7bd3590be9c71fdb3c8f18a99899d34fdd687721295080ef17dfb8fda5403485d4af4b250261e6d0d906619216aecbab0de081f5d0f375fbbe648ee6f37b13ab0c92209e14f0965c443cb89d5280d8e10d76f3a8b710f783ec10f4fb2b22b239416dd6182cf1439e25821c354b040fc23a61008221b931c773fc4daed7b8b61dda781ed03168028ab604d8d36eb5cc53f255cac32d56281823bbe20ea526643644c32a12182ff065b6f82be7932fe50f43db22b1b8ab25dd1a8cc75c0d7f80b53331f31d2c0552e6384807d8a76ba7bd4944504698c4de72355f9a41cc2e5acf632fd49c0134d4160376f12bde4e26bc93f866ccbfa75ad475d4d0364b7cfe41998fe8c94a7d94a485f56c9e95bce5761e2b1587841638ffece16d156290a5ffa2af42901bb3ab97c9818a67bc6eb6392dfd489c0af8d6df9fb5a684de477cf31606e2b5eec66efa4ec8f316c609462e1b2e0cf0679a3124d898928e7f998d940146ca73f11ae64a05668690fa864d30099b277fa3a129441ddbd0a49ab9ed7cf32d52d3e96d5964a634ce3946cdd2e24c90f47a4acae58002034affb80ce2d490701ecefaad0a09c03cbae3b8b24714e022bf353a57f21eb23c4554219c6530b5b774c8ad6d5286e67eb7ccf568629b7f056cb41f2ac520ebad72c284520364e1198683aba1d3c6b7116bc09e864bc4d1b2aaeb04ab96f65430e05ea91f91b22173a4e92e24523033bac388657aa9fe8d10f2b6745a26ef2c895c275398efcbf1a81f96e124a6601a76d6389204755652969fef1f440e4cb4408e3c1078588dd18e73b8b5e3c86984787ff5ec8e5bfb2ab9928445a14a16eaf3d84bffb2288bce18915b3de01a20d9bb801936edbf386933f60a0c7ee17c43cb2869ffab1db5456949d38c84285546a7059c9b619e50406218e73c59f0203a91f3829d804b168b6733b26353b4b5f6ce2e174b01f4108d08028b525ddbb64afd7e5d711639374c09387871795870cf0a921f5042f9caeaaac614d84d4196aef1363ac6c97554466fe8e1167b33e75bf41a27b8697f54dda778b8334a83b5b1fbbdc7dee6be5e45f7fd3bb5deb59df9a59cee638865a597cf53cb71bcbf38b2bc9d68ce325cf33db76b23fe307b2ad6025d5c6f4d3a5be3290a6a296b3f406af4cf46c5cc4bc63fadd63ea96a99e9a0a3cd9b418eec73e1f980c7d099f369a6ce28754b7fdc7bf98ff141b160f9b9c69c96b7b57942e80fd3a9330c8f2f585b0b98244fcca08b1b00f481f4a89fe08939f9a56f6bbd39cd8d6d4ca3de8ff3315377a268d2f521adaf93b71d6012d2ff018a0618695cc288fae4836d4bdb1b515dff86b1bd4b453048c6f6a48cf8605b5e0e213a48b3a09920784a78510cb0c3d530e8009df0cd8091adf128520f0cea9323b7605707e7d229694f609497a8f62b1dea08e6211c21703ca834707bcb8f584de7ed63b7b95e47c1f29540753130c6c06bedfb9c7b99227f52f627f1518eadbfce2e026aec160055447b13c6b9540210cfec9ac2fba395d071f80e02ebef4673d33a9a1c90d6e1732508de7f66c6d59f6d5fcf980285f9c7acfc969bdabca0e911c5e0ea02b18c0405f03ada74cb882f8870a4f2ed794bc0e076834e3142e47889fc0e0d7605ecfb4a1d020f3926fc4a51b9eab27bcd13358d2e0994ad07f6f12d2167de1b4448b4e340dd6f458821cbf54653822bc82944231071b161eacd5b8af0522697f8270e5c1e93ca2c873615e13ac85fa1e0ccdd834c4cad58c30a6b79eae6d522b1aa1193226445b37761019a4d95e5ae3bde97e5b44ebfcbbda005c5fdde16d64f2aa182475fba964d212dc143a4979d08d4cf71a5bcbbf6ee300e1fc64e84f6e8b5fc269d81cc5d7b5961732a314851e820536f11797e70383424504907d99d7f037816313e91ba6fa5b474d87c63e8432a17af4fd505016f2ea7dba90630246192af27892d4477ded1a639d63ec2eb12630a11bc7b6bfede1ed302b0f6b6586882f8adbb581591415bd29c4f0487d1b49ef04a913f9814584a7dd874bf9091795952a346f7200243c8d79e23ee221b874e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') +export const signEncryptedResponse = Buffer.from('98e7feb73d55b167408ad9d10a1e5e087882ed3d3f8196dbcd2575be8d5d4bb3dda7e13284c962bed6e731743805a6de5e6fe4c8af47f49f714e994618e01c366856d86ecf4e505fd4b646cff75634587104381267ca8e457cacb82bd2cc13df1bdde98115719f6b57eb2866dc6067627917a294f3bc12b603a3303bad5f4ba33821e9d2953bb06b1106e2255a22e90132e8aac8f7d63908a0e56d83fc8e74adf99cbbda9724165855d061f7c808238ce3e89191c14cdc0739c3e86b9815913b144cb8342ac9208a445df7c12320983fb46725d65485720790535f1c9d969d6ae46bd56324482786019be64ce710ee23ce2866e54208ba53a71c097296d145969414a9d0e4034394605c6008c2441bdb1a8c328c2c0e535e05279f97d44e1ed368789bf8a07a95fe38fe97e635316a16c541c8919898ab7525f04350312a9079069fe43df38fdb69b35400416c6c83411c0a5cd7b7adca9ed523d1c39522424bf12afdfa0b3034f291c2d5794882463779ec3ecfa64427de67f4f5b72ba249c8bb01320e367a3d6fc9b307bd325ce5918f8fce93ee23c83b5c383c46c35890bbd927595b3eb02785e0d196c655eae51c4e506052045c6add962ca8043a5fb4bc937812e0883528b2eb97173bd4bdb721879a7e593db94b84ad6f84e05e6edb1a3b398c854684b2224f6e545be9594022e37e2f72df0ed134c771d20adcb5aaacaa5e2bee920c7783c897b3dfb3298f4b545cf80fa1aaf671ce19e9457f55bb450f16ae1792269368da26b2003a4a8ec44f0f07cd6064f36406996fb5073d0959e6448b6c483ee45966eaf7ba9ea119eb1e39aba6ecb8607da4ea1da41dc22fb4f1ee3629b20988eccb03d31b6198ae655218311e6b2eabc8248ae716a671e3ae69b40c599f367bc15fdc092aba16ae8e0824921bd0c4dd8214ec2be5731b019afc2dbd080cce94bfe678bd39929ebd6dba83db9c27717b9d0f860607627b42be61815bda009af502034c1dc68539dc41fe9e7141ff976d6f8fb37829b3db250c4734c9755175d13849b27293d2b386f684c847f4d2eb2d13989059935f6c49c7da03aad2cd7a25120d772ae8532103ad03c2641352685497ee73ba11bc9bf5dd74906587936191b4262c190289c52d6aa21cefc2811d8d2ac87f1963c3f24895c4e1b460197925b9c70b52773b758c499168f66d5a8ac88a48aee0fbea1b26797015d3fc3a369c05ba581348969a9b9062edd41cdc8e6782fbb7d3ee2f1ed8c23dffd1fea996f1cea4856149fbaac0af2625f0291fca03fce284aef1f2478a4efa07daf72065b0207ef8f6657d5bfa5a5ec4eb53a86e713f74e6f6f21aecd1b406089f01a56ba40db03e1e12d710d7da0189a15c2519904515aa7b8ea59759ffe93f019be71c4b473e417806b8a3f923278d7012aae6727357ac560c4cc81d779870f58cf14e86ae08143a635f3ee2695fd311f22ed078167bc3e0002f27d534c3bd48015f841d8f25838a55c779d87a95c1b7a20cafd480057723cdc65d0a95b60cc35d67f0fc7de0e41a198e78c67841c7bdcc94bbbefc87eecb2c4b7d2fe874f8793aa1ddc1406494a737bf7c70c63dde19e236449c6293ed8ade10a2a7466f3d039c2e48f6b74650331fff965ffcc4e3b49252ee84d8d199823d989396ed4cbbc595262d3c52d958f4df3c596d264874e1b51c33582e537372fc0970049fd6ce4c8d00a2721bf6323952a4e4b8ef048b7c41e01ef30bd1fec303af74d776517f1d1a427f3a63cfe5c83fa80bf4b4da5edfed9c1394d66716c4ab49eb7c6c6cf969aedde85c5b2cc3e776c6147e4a16d436fba6ae99487a9e02fda81d3e102977f83a256ae3c914ca3e9a955b0cf16f655629816186410e61b3ee20bf3e06424e3e4af27d62b060dab14d108470d82a41859c882483523ee552124f76ff9c462f22dc55b25e4c2768e683ab8db3e86ef0ebdfc63ef15b874704eec77b0d6d24151fd3189c464191f4d078af6265b52b6ed5f4212fd16c1b0ac05fca251ea6151207daf5d6e04014b81fee104c5ca88ce45f739b47a1891634a5957a97941a2c5ff0ce9ff6b5390fa9384fb224607f1d0585a05714369953fea4fd83f77e27dc7c71e234786b528c08b8eebd829ecc59635fc1d7a0374b4b67ed98b24de4030e7a9f6f55d5d36d1076f505f4760fa5a7e008b57d30db4bbcc70eaffbaf26917b6ef3699eb123de6f7a1b8e2a5994465cec6c5d25aebe89c781312be5dd2a9280f6fcc428fe2aa8d59df8789ac58cdda25a60f9a1781a5618d8bb03a6d4153785eec77a72e140827f70c71d6867e9e84440c24a85ab7c8faf1c57214b02e4e6cf4f830930b599cb850ee2e5a32063ee44f9e258682c4e8449087bf812eb3e6bb2d8383a8c35eb8b36f042f01a452df1be90085f0997d217dddbddd4021c1586000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') +export const getKvRecordsEncryptedResponse = Buffer.from('6a241af2a0b2b698f962c4d42a1c28c49a7890cbb61f773b0a84c3e2e25b89dd0cd4529fc739fb01c537426e897107a47db645d82b601208c85977c78c65555d5b3b5af4b70a80550fba2ba27bb70d618c8c27f153470ec68ee6f8e7d9af82c7b49603ae9ef4099dbfb20cb636d45507b1f19b246482fa3cfa2555cf8baa8dce6d8e9fa34f22d799104b35583e05644e85a55158a8ab7743050e55a0868ed261fa61cfd76fe95f9b1887bf1dd3a2e3869b5dc3e61e30f6567ec766a4f359ffcdfe6f9043c1886831553014985312009af18b47dc2cb8c41c479bab204606b4914200993d06ea6b041a25f255748ca27beae3182a6d9b82cad2176b25c60f3c366af2bdab8f0c4526860bcbff8fde980faf0b1c4d4dbcd6486832690af2bfa7ec276f35c740aa5372922bec4142eebf246ba66876a104014ad6fff2f7a05f39701405c90c0ef30c955ebcc54f3581d8e8a5b32510623dd097d325a2f0635fc2f2cd2be2f473dafedf85886575df5c820defaf235a88be6dfcfc9ff28f62aa7737c01b4e2835e81ca66b97ecd5bf2df2ad0c09e981b28fb1ac354e947dca2a904f8d9ce122e18f36d3c67265c678be848195592ebb2c157c8b4b0d7129dedace3fd61bfd5696195ce081d2e80c83a336c7208a70db5b0354b7deca93c76e8096ee627f86b63789cf41f3e0c9e0f3db3cf439c919e2b738e1946918e6808d188734a3df858d1fb4034c5a60b903b24a0b71c0de117d99603fcb222354d07340baf4043a2f3295941bc6cef2aac803cd4113eb00c8092530f83c47802556d3e6f23a930c4c806060bd5a33b72f32218aae207b80e988207db3f228d9dca486f67a48c7633c37f6e1563c3721e42050ac22c1ae51daaa32993950360c215778fdfcbbc7104faff4b0abfb87e8d0e23bc5973c32d3fcff98f623c369f2826f85c677e75e8affc55c39b1bd90ec74a980014b130ae1d166c5cc49be022445d25efce114925454bf9ae6a469408b8a28a40bf06bc1ace31cf048de6b508bac842931156a67dcfe5036cd308f19eedf633b31bc43578379ef304c6c39272180fea5710384a7d7b6cfd9bdd8aa78c335e9d942565f24629116ff2abcac5d484da09beeca8b8247eebedb9eb5839b9d94f9e79ba564374416dd2e448549b7ca72f1e04531ee1a8e2900f99e849f882e9967ed0d817193c661ae82553502ef9fbd358800cef924e3d646d668cdf4731d1688000eab6249695500d41762053e1d65bf6ef83d09bea6890c7a666a4b1c5fc2e24a573522453d16d5eb335577ef49dccd68c96b752ee67b8dfcb07dddb9d2c662eed11ffe208d370937e636bb72f392987dbc0a2ce50389b1ea91624a7d3fc6c60d42bafd32cc6f2048475432937f948b049f46a29f324cb7df8851c6e1ddb945cfecdcdc92c9cd317cff09e2b13955ab610b0573b30021657d0c310a67087f81dceb0cc6db5517f9506b33b059fecb082d9f2063d85ca29d6c61cf396a52d8d4d79fc68e8ac268d1775e0da45843faa21ef03d62e24af39b6362f87dc7917038a3412413d5d5d302d60ee9b685ecd8504eb5c3c298df7804dcec869b283196ad823a8c7096fe43f35c5c95165e3e40ad6bfe5cc1934c10f6e93f93ee2776e7434064f66a7264b500258eb86b21bf94ef0cfbefbc6a9a997b6665e38fe4163dfd4ce689a72271a2ab87dad2ccaea0159e4e728d74b47f25f8469505aadc381beed90b9b5867ac7bf45d8177152fc67cdc7d7e56d54c11ac43c67a8bde937cb75b94543941f15a90acc51bb2da1b5a4ede93b0cb9542a3b46f20ba5c904c610457ac86cd2e32e82965bffbe9c085791a096ec634f77ddfe25a5ee847a65abb9cdd5e58d123c54ca0a03c96c9564677e410622936c2dd7427bc4182e71b6533398c490675c03a8ecc564c72a9e13420779cfb0e8c9261add79eacaa1598f7ba6b81466933724a35a1f3100f5da5b7f8d23718bf337e3d7066b12f07a8529786b012eef33a74b19426f36b51dd6ddedd5c61a408a349652cd2822547523ed57aa8bc8af24bf64f6af6c96927bb3fa6beb9d2b209fe56bb560ee42bd72d7c6049a2679320f00104fa6091718beb9c29dcff57693a533cfb396311aaf34828d219c992b5f90395799f454a747792a1ae508f7eec0d8939d47ccc4caf601a78abc9a5b64082abf0b70077c24e157d21e7effe0712798d3ce4672b682169c95708f89ba6da425f45a68325af231f5fa2d9c6f1ec86c3eae57109a309406de8ba8aae41a1f2cfe6b46ec8e958bf636da8b9ffa11ea5cd24d52fd35e4cc282757e485b27afaca29c9287478c89e3beec77076e6fe45b919b36aa4d5c5fc4c6b4dd6d5c7a37d419bae9348511ee50ee78a58717e01628cdb6c03c9c145f559ba975b8523fe60f23e26ca7f9f3ad907f04896328212932645796000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') +export const addKvRecordsEncryptedResponse = Buffer.from('4ff5d30b47dceef77406ed4abb6ea8a6e73150cfbb70090e5cf4cbbdd8b2b675b9594dd87919238401c15c235ded4ec20accd85b7752d7f204c6e38c5d0434bb9f83ee6649fbea479ebfc3cb3254dfd6d9a5091457d04e36f9fa16eaeaf81932fb31022a49b41bc5542941a293c5b467a44d7a6fd57ff71401538fe431585e72eed2dcbfd1c178552104cd0b7d18eb9d6533f34d54064f15cbeafde817854ef45d3c6bf110b32a8efbbbc1bce076a4d32ff73efb668aab0772554e0a311388ef6b097b337f1de6a31e947c4663e66b5aa494726cd6c3886ef7fba0d7b8adf57fe272f35cfda3c0aeebae26571974048d93234217d82e04e17700868880cd399a986142d14c26ab5267903e7b4ae9f7355a2cc71f1ca9d49e1c1e1f4c298f68af29cf7483d4f094aff97c5189074340ea3b310d56c7879efeb4b328ec8a4e1446c126b2adfbbea085d01487dc3ec2fc0fe4b9ff65137fe017895125318835523f59b0d729dd7bcc4c34a4956a6f6e4f28c08bd15302310f24fbfd3cc30b52040298cf0ef2e643bd962729d5626304b58eb8e1fce662e35b0824cd3cbf21e5701912c63dca5b72e376c6f35c3acf9aec2489ee1c1b5b4dfbe180fd8937ee4cebe74cff238f6f8b755144d23e8a53d2dbb05a6572c085c98d4f1c2627771bf07541c3d1a3e75257a4554761c026e736e42eb6786a8d744fd78b9ec0abd732c3fff175fc93dc4df15d910bf5dcb6848c9973d8edddbcc55799954c631e02df9ec5b2a098f04150d3c9a399a1f06ff925de8b3c70506e97202db9c4eba3469ca0d049b3abab116d4057782de9d0609b95434b65c952939769c6835ca4ca4b370ff172018bd14ed02af2d228c69a753230dae1637277d0614d2f341c10593a7330b823cb463434fd047b82e67f605d19ea81afa90eb3eaf010c4bf75b4985b586107cef2a7332356391233889db87d9ab2d56073ba43a8ecf23d5331733ada836d1fb849a4b56b2157fc2a0c63e8e2b71709277c2697e47f13c9e885b651aef099736687f904ee3afd77c159ed26f511147c6d3de6d73e3a2565972f3d8797317e82f2408fc0d3799b68e9f311ddfbf1eb0c4ee58bca3b0f50ebbff7230dab03ce3d44ba87487e9c22b89c070c9e3e05621d84715d21b54ceb5a483dd7a79888e6863995f1e1ee6e6a2cae0341f07f2b9cf9a64e44d544dce2eb27d891e5ad1f5197f8003bdfb2a024f04f15ca6cbea5df323547cb9ac68aa615b655526b9fff35ef9064938e57ee0e8336ab45afeeae0f91a6343b791b62f615dd93b4e6668a4733f14493f5a54cf412eee11a19e7b0485e8868f8827158b79738a8303109c9a0c817327ebb2573dcaba212d0623b494957578deb280c4960b8e5284f585576c74a9ccc992e9d39f58dfdee8d7ee58ed8a2583997b42176eed6af34135e83922d587b3db6a6fa26bfa3191788930b328b3da13665dba511d52b7513bba7523373636807a12aaaf7c9089069857f5069c934b1f44180e718982d539f12c726fa2b65177a514503f794048bdfffa0dcc381006479c22221fec94908124df67cc3e2cf26c75cfa23709d8597ed91b2969fef94c82f2fc2860c82b94dad626ef870b88033f43168279bb9a10b1ae36b82279cb051301fbbd3541aba25077685ac91981e6cc436db78365b4a67277386dcb9b62bddc89587cbcdb9ef5de3b37769bff4ad155e4916f4e7089f03688610edec54011d00e8776a27f7204f414943baa731f115a4fc868d2823a1fce0c3446ccb26777bc1b76a8c3ebcf18ef6ab75eed41fffb3b6a785ffa7147482efe37bc88559c1c47d38ea11459bc76879229754cce801c332b4321a7a15957a209d299004d18be1af74e8b2fad840c229067eb5ca8b359f959567caebdf8eb8fb2fe8ba496433a04743482b918ca84033dce4a7157583f5359a7d132c35a2b04cc27c1836c803a6a3773e799e2a851bf733356e6a39ce47fb4478815daf4b856dff1bab0bff47f234159efc36089e03206b70febea72857352a87c2eb97dec5dd692dbc1296301f5349930b0d70d06e15b94e38a52bfdecd5a3442e06e751440d81f6d1ba68de48afd5e92d5fda0aac1160659bdb9cae6df6bdba489d277bc097f04205afc2affe73774a9c8c2bd6951ef50a7e3d8a16977467bd73b988b9bf91bdc818a3aba9fcc2e7ac9502d263a225e0bf6a0a4339931f372d7d284b5faf73ef646f4450f1d85640035b981f133f3704e64b3388c4aaaf97659e50044462ff1183fde18b860068816609055fae1076fc9563fd42b6a64b15f40f27597936425aaeab2d8075c71ca3efb5e308253085134d79f8f40ebe2711647c21249eae3903360609817d2c9eaa7bb2bf42b084caf01467e4b792aeb6dd668b1d17080ca3fbf1a4be3f7ad5c55699d5ef0330c9a4535b2de4a37dca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') +export const removeKvRecordsEncryptedResponse = Buffer.from('728ec918b6a6b042974b0c451b601c34212d344a535991c98d70d96616dfbd2ee3c3bbff8b0e1980517e07429d9513c057e8bd75386f0a8fa436c1b6c348b00fe5f8c95dc64f6170ae8e7c933d5b3084f746a5bf5fac70b81b3bc37a414271ba2c0a4e7896442457ba9bc2e620335b81ec7fdfd5c06cc7b2f06c428f62e6e2d80002fb5e2712b8ea65f7c7802616b2c0a0e240ea23a11fc0105aa86e706af0e903f0cba4c7e5fcc99c66ad4bbd04a0e0c64fae21295b0ab2ef3ec7c74f238ba6e112cfe15728464c56ecde6c07d60f682f0e8dd40bfac3175b004a65aa9b886bf98f8a3cfdc1875d157fec2b78c35762e1008b6a26ae0e88f409371ab86be32ce1f3f0262b51a1a07e6cd36da5b6bd1e6ea848fcba1ce4d0f2abec03bfde024b6a30389828f02dca08ffe4bf61933ff25c28dbe8c91427272d74a2318c578f81d383f00c9062ae958444eec39d7a4510af835cf3fc86e2f06bd8301cb892b99c9021eb5f754127655bd4f6c038adb68c620c8986fc3bc6390d3428b5c95f9bf0400e7e49fd2e0f5822d678e5d9d8b5de65012e801758ecc4c2d9c07203565a1536857fd7438400d0ac848a727c411cc9e0da9545ba68b3da84916ad5d359d3ca255ad40893abf75d961f595e717d8d2dfb61ff2fab077792453b118370c6c84ce5628ca725218b2988581f8497ca9bb69e4596c709a73826548a84daca67c060d1acb016b5b8f7a2831da2f67a41108aa27ea6fb86034f8f50b1c3be5e5fa696da39d1bf48152feaed0dec94aa898ddd1b3f2d0439ed813b5c6d5fa67bf6d5244dad9da6f704644d8ea921b8c1197e4edf62bc4d96fb44522748068eb0b4457f3f0de1283303eb4ef2f388f7eea781d3aa349f42085f502fccbf12b0b8dc14c666a967f6ac6fe36c09ad555980b77c81ce33aa1cde9272adb292f8cae7b8150264af90ea8b4237a96a6f94656a01511c653af5923c27a6d2cc782af5d9b7402f483a3fbda6c87611fc600684f2838314cfd67396c7d1a3f84a0d1853b55f0557b278c38019cfc59b2702e3dae09dffd9c5c4ed04023929ee77619619800658b0b3eac0ffec51a5f7cf1e0bd72cbf5377814a4e137049a8dbd56681e4aa35886f62e32a7aa6d50500fa0327cd63bf5776afcf93590212d58b9b58ad733d1113e664677c089e649e0a62a049c332ca7353adeefe208a7117bee946c3a24f7ac374454c17337436241741ca64d3ddadbc511142daf743594cc50988225f5153abe7f223e3fcc72edbc16ae9b4488d645a13dcde897e28d8ff38b85ebba178fe5188ceac34d4190aff37949a1a3362f821891e86809836178add8f9a2954cc4c038eb3c996664227befe2e76d1689dbd68143c827142d880c72ba45b0cab47c90ef1f1ba211f7b62e64edf315bf8fd54a3fcb88e8a9c6f40e4185c5ed4b7f8b8f7f26f252c152c6bd1d26acb6f78852ef36f575bb63f507377a29bd6513dda90d5b690d953f992b58e1ff0114aacef7b379657be7a6eabdcdb2951cedb2d0a0b57be3fa486781d16cc68a050b1bc136c74e8838d87a3cb015a1d46cc0287f5d3580afee0e450ecb0a5b79dbea8951990ba934a9be55082c6c1b7db425c93be5a8e1e3f9cf50f669279783502a130901c7fd83f0f9eb552bd99cdb54f14e55ff1c6768962ec206cdc0b7a6355a6c338fd28d8d89318b6168f5f2617097399c3ca8e44457d490a727daad605be22929126e5b517085ee62b00740afe47642d1b7bef25573e5d61cde4ab80b436581d6085b229333dee6b56738f733a359a58e32eebfff15acc6c0e9b6bc3d91569990ea1781be4c73e1a9b6e1e89759bad99f57265bd4ac3ec59bd04b4cfc626be8900b7a69619f2950912c4ba57894259655a85bfe3d9a71224377a7aff4d6f6581187985285c345708ee1dc200dc6567bb04de14446e66d5b56b8c61169c18442fc791712875a9a2a9ea6d7f01dbcd04f0a4875dcac815030aa2c7555acc8481e56e0dddf445732fdc204fea641049e3a5e31d2d7cd1f60f23857cab492e62c843d589ec13655443fec0e7db8e12d3ef926bed89506aa5412379ec11684513f7d02e58932303095845402dc77d22527a7e474aa085244c8fffb1b51168494c250ba57e5fdc5851707d9888025cc7002fbb8a9b89c947715a0a6e9334ba1803e5266d476ad1672ee11bcdfa5d7a30faaac75a855fe23d7ef7b5565b63e7d72bf8a7ecfc60cbe05d46d6f0c1f6207f866ae7dedd9fdbadcede282418f47747903d135444921b128d7079a9bd0b7a3fd1b5d7d50e05696c39feced7a30c02d21d26bd30e8bc1bc072461018b422a94af48177746dccf791c79b5d8310793d3db2b51a8d08d8a7458be8014e6a5f8b1b27dd304d481d07dfe685184d33121a3369fa3333dc9965b2b6391fbe7e91983a336cf18a29cb71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 'hex') \ No newline at end of file diff --git a/src/__test__/unit/__snapshots__/decoders.test.ts.snap b/src/__test__/unit/__snapshots__/decoders.test.ts.snap new file mode 100644 index 00000000..b3588a6c --- /dev/null +++ b/src/__test__/unit/__snapshots__/decoders.test.ts.snap @@ -0,0 +1,3227 @@ +// Vitest Snapshot v1 + +exports[`decoders > connect 1`] = ` +{ + "activeWallets": { + "external": { + "capabilities": 16777216, + "name": { + "data": [ + 76, + 111, + 115, + 116, + 32, + 100, + 105, + 103, + 105, + 116, + 97, + 108, + 45, + 103, + 111, + 108, + 100, + 32, + 111, + 102, + 32, + 83, + 97, + 116, + 111, + 115, + 104, + 105, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 251, + 230, + 125, + 166, + 100, + 189, + 123, + 95, + 163, + 34, + 243, + 53, + 36, + 65, + 33, + 139, + 170, + 53, + 190, + 195, + 189, + 40, + 136, + 190, + 23, + 112, + 186, + 217, + 89, + 79, + 185, + 128, + ], + "type": "Buffer", + }, + }, + "internal": { + "capabilities": 16777216, + "name": { + "data": [ + 76, + 111, + 115, + 116, + 32, + 100, + 105, + 103, + 105, + 116, + 97, + 108, + 45, + 103, + 111, + 108, + 100, + 32, + 111, + 102, + 32, + 83, + 97, + 116, + 111, + 115, + 104, + 105, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 48, + 211, + 148, + 167, + 113, + 193, + 34, + 206, + 53, + 247, + 135, + 139, + 246, + 129, + 5, + 103, + 239, + 103, + 153, + 71, + 221, + 83, + 125, + 243, + 98, + 31, + 39, + 18, + 151, + 173, + 203, + 168, + ], + "type": "Buffer", + }, + }, + }, + "ephemeralPub": KeyPair { + "ec": EC { + "curve": ShortCurve { + "_bitLength": 256, + "_endoWnafT1": [ + , + , + , + , + ], + "_endoWnafT2": [ + , + , + , + , + ], + "_maxwellTrick": true, + "_wnafT1": [ + , + , + , + , + ], + "_wnafT2": [ + , + , + , + , + ], + "_wnafT3": [ + , + , + , + , + ], + "_wnafT4": [ + , + , + , + , + ], + "a": "ffffffcf00000031000000000000000000000030ffffffffffffffffffffffcf", + "b": "c30061dd487483415a220abf7212ed6acf005cca8843090d89cdf6229c4bddfd", + "endo": undefined, + "g": [ + "8905f76b53755c669fb732b7762251075ba95fc4fedb60179e730d418a9143c1", + "571ff18a5885d8552e88688dd21f3258b4ab8e43a19e45cddf25357ce95560a8", + { + "doubles": { + "points": [ + [ + "4d63c80e103b72385ef2f7c2c83f5495882e074effe2e6b808b0b650bc6fb805", + "4edf7b261efe21ff5c4623bb1580e9e3670c318eb0b6587f2f11bd652a23f9b6", + ], + [ + "c3da19630dd962c0e3d423e90f35a1550fbc6d849cba56d486d8ffa696946fc7", + "99d49ebc14d5e53c6ce581ff52305aa0704b7c2589dfca5e673fdb03cfd5d8b3", + ], + [ + "a20ed2a81fb81da328f7ce4795b95801d8b6001b5eeaacf6772b0e5ab4b35a24", + "a2414271b82f4f9160fd2640c2d97fd3ed7ddcc77ff50ad9f685cd44fec01e63", + ], + [ + "564bade87ac6218dfa4efa220284e7ae00e7f9d7d495d9e0f0165fce3779ee34", + "7f7ccb15e94b415a95f55ae3d684b9f4f5725fb671e9adf90e6312ac4708e8e4", + ], + [ + "e6e21359bd012f3093a15cfb9548c9b267e4ea169dc7035a7a8746a584c5e205", + "fef4e6219b962cb03990a6f345efb868af84d0455c241dcdf31cc6a8c8f936e6", + ], + [ + "f5d55f4511824ecbb471996cc81ecb0d7325cfe55c8c7ead9d0c8c4868af75df", + "94ad8a748e2a081ad5335bff94bb4955085c4c4f22038c6be3145411977a0ee8", + ], + [ + "cf9a2f2a9e414ec0a9097d7e1112357206828b5f24302067f99824f20151427a", + "c630fc5362dd09c14fab5bbd2b288e27e0734b6c01efee3dbdac9da279153564", + ], + [ + "953c50eabdf58e8d9d4a7caa785ebc8d0981eab56b372f0202886024147519ad", + "63ebb7f1eb288f2ffd9611022eb64cf72e9626ac4e6c9179d6361ccfd590f8f8", + ], + [ + "c47940a57762de4654a6876387d4d8f8eb7dc7f4d5d1957e27a6dbe305406dd9", + "40deabe2566e4ae502d37f3dac740e325380c565e793682be4d5b5d99b307781", + ], + [ + "5910a01f44c257f8b670dfbdc2b41677158c7e453ca2e87889f6d65533ef2177", + "9f8be4c4b812f580ed92e8d7ca23d8522245250c45e2acef336bf07cf88577d2", + ], + [ + "1682c10b34c008b5e77b21471de57c4a7b3ef5c752b3f638df275455922ac1c3", + "c092172a84e5d3ea1db0903c2a5089db6d1c08587b61c71c76824f04bd55d319", + ], + [ + "e4daa4ce1f115880d418c760c110f0539bacfe31e548e83cc7a64880a750c0f3", + "a444f6646fc6b7c285b2434d722df9446f147bc320531272733e7b55ffc69ff6", + ], + [ + "96e6d0764f144e18555e355723fd0bf426d2cf5ab7939a083f49167ceca9754a", + "3439dd70c302f9fa9d7e772b1b65e15155438158508e4d54768a8dd87880e616", + ], + [ + "b63b80c0c4fed547db595c763d4fc1e5eda799bd9cbd686c7913e91991724f36", + "1f37958fa86967a3628745f11a92ca5737708ba70f1c9646ea0fc697e5fb5166", + ], + [ + "a6b62d93571df20512d4b9324f68b49f888dfe7d7c241c9646f96796424c49b9", + "f96a765ef3dbd166281b3e4d53aa51f666f96322511fae281b4b26d179483cb7", + ], + [ + "f5e69621d1b667f7241cf3a57c62c8b0d5cc16bfa6234994f922fc516a0d2bb2", + "648f9177d6f0f7a14911b37071fdb523d20b44c709561925c15c70bf5a01797f", + ], + [ + "b1d093f3bfeaa84483bfdea85f4bdf0f2e400a02f142fe58af2010f5b343bcf", + "bb7742e5bf663647be92adb438f3a6e943e4c93dba10972ea01b95c70816030", + ], + [ + "4645d0c952da9cbac4ffdc6ed70f8ca5f5efd3ab1042e4f0db2fb5ed005832ae", + "15bfe3a904f49de7d4aa0d2e398a08452c8f0bbce1172059596f58bc9001d1f8", + ], + [ + "2aabc59c6a456703e3295a64e9692850426c4003ea8b6403e22a7b397acf4ec2", + "6908d03f6926367e216a665104152ba9a6168bdba3182edb929714c5f5942bc4", + ], + [ + "64232b85d0393a8f373c4a2e1a110329bc85a9b190fbc7de4050f1cf1c367cab", + "7fbd8ddb16543419baa94afe829348b1604f30124b78ab2f5577eb0167dad297", + ], + [ + "6beb87700f8ea281b1b80c854cfa0b5010ded8d97b39d00e5aa692a87dec0e16", + "2ae98927499e7419a09eea953479fc6a63d0e65308d394950d7f5313476cd0e8", + ], + [ + "cadd1a7f9b46a4f0b4df1ae7f54438afa52fc69b55768cca80d1db6f79588c00", + "9b5b7e0ef6e0c97df047d55382e4e16488e4fa495eaae35b40ea6b31803dd6fc", + ], + [ + "76ddafe49c24dbc852fe8409878218503f7d28bc095a8e7f92dda31be24319a2", + "e4d52a8f5169035bf81a8778438d2d5e43608890f1dbe4280cd54961d7a64eb7", + ], + [ + "589fb9286d5483140493334d5e7b5a4f460057229e54fab4fe7ee31b0e63d348", + "bb0696de2541c4eec904507100446520879094a025649e5aa70f5cc6583553ae", + ], + [ + "9d20f96125c728ef774bfa64ead6dc5e8c515fae7e223ce0f893a5dc8de610b8", + "842e3dac077282d1b2820974c304d4aa2eedb9493f2a7d77a1e0966098583ce0", + ], + [ + "a527e6b8d3a7006d8ae0bf092763f9e1f36e29cb3ba815020d3c982cf7d62d27", + "802786e9113e862798db37d167d726e1f1a520f5c158be5b4a89097581a85e38", + ], + [ + "11cac131502effb2cd86e47a6abd3af203900a72c0bc1f88de2b7bc453cadd69", + "b87d44a3cf751ee733f078f659798850e9f769139e0017e2d550242ec965469f", + ], + [ + "3c0440fd432b57a1dc756a8481732f4e6425194875a1a788ce9b6bfc360e25a8", + "97b3d282568ea397ed14b0edb052be72205910e7135e051c670b3f1d720281f6", + ], + [ + "c8ac9b3e684e125cce26309a20792dbb905f2c7980ab95496892c1f711b0eb9e", + "e568622aad1f3941626fccf1a8e3b3f60121fc15fe3fb24486ad8b6b40a24474", + ], + [ + "da4a7963132e92d002f9a91bd392a51bcc33f8d47c4e7603e0e5c9dd111f8ec7", + "58ffec2c4fe40b80a3a5082694e9e7854febac722e322511a0b0ae30bb1151be", + ], + [ + "d41f01728614554e15fd5c5caddb0a921e46f654ea990cac7f3a8f833f6746cb", + "d59e9577899a39a63dd20fe5a969b7f8055943584dbc204346f4434426ffb589", + ], + [ + "1d587d481d324f5fa96a5d5dd38706391c19ac32fdce86762a8c244bfe209256", + "a11fe133621efbd20f8441e05bab43e2384800763778b65e87673a2a37173eaf", + ], + [ + "44ed736b518152d224986631b82a0e226882c12fb8a9d066a7091c2e48fb8898", + "6a413e95787d78b3b256ebc6119e34da04edac9b4afefdc282f476fd86e27c75", + ], + [ + "c2a36096598e70c648107750926b86d7f33527c7ea50ca0c16c236e846e364f6", + "b4ef350f6cbb0d5c5c3ce7d66831790e0fa07a44db4afcaa6755e52f024e9245", + ], + [ + "20f2beb7472002162e9cf8e66eab95d9ea02f80e0d69a98ef0a3fecfa181e695", + "17a069c2bb2bef2ee3c7b510ff5f6ff12037720f1fa6d5d621c540a1df843618", + ], + [ + "693a1866df4fca1c1291a1fd4c2b6b50541e88d81fdb2580531fe1c63c4962c", + "1ed4e57020f52a7fedc20aac6212c44245f19625a99b8d0b2c4604e0117f203b", + ], + [ + "8d94f6bded3a2c375d426de96bc88ca56f7dd730541d5ccecaff541338d6e434", + "3e19d89e94500d7ff99b0ff95225151d575465a1b1867f26354a3bb2ef8279cf", + ], + [ + "27d09f8690a9ce4d5758e57db757a21c64387481ecf91e732670d2f7189e71f4", + "5cba11237ce5e030e94100917845819aac3acb420732b99846a308f38384a7a9", + ], + [ + "5d70b7651e095f37f3039f060c46124adf2c77cf987ded2488f1185ca8d9d1ae", + "3a7564e11d013289cf3d0b175bac36439d75ea70750d10582d586506260e70ff", + ], + [ + "10ee2532f7c985fe95bfdacce11fcb46f33696f7acd665ed433e50f6d3549cf8", + "485717b627317445b057e74d69fea72f7dfbebda58b357b65450fe17159bb2cd", + ], + [ + "26fc9c4cadaf57d8b301ec4578c3e6e573441c26c7bc863d3b3a13f1402b9d0c", + "3ef07f65725b2768aca2a8a6a8c608fd05d4b3ecaf8145696e71bfd7493cea35", + ], + [ + "b1adfbcc2449324f28d06e97d04e61f9c3a2dee54df0a4b263a2cfb9db3b3818", + "d2ae779c530f173b0ba1e14810ac7abee2be5c696daf7076ec1d9397e053a1bd", + ], + [ + "65ca49bf0a7c13ef2eff79b1cfc91732643672b3a2cd5e5e4ac8b33070d3aab6", + "5986e7c256da4d77e9ebbab3cf9a5308a5b922cd52f13415a8dda59b3efb9983", + ], + [ + "b2969045b265a9e125c2144fd1bf7fa1efd130a6f4c89a7b81d783e979f39254", + "df088ad922c38ab4aa7a54f403563f335c82e3173599d8aed8e9634b9db65b69", + ], + [ + "2dfa557bcc4f0697e158614f1b768d96faadebdb73d68e5949c9976e1337c262", + "c6ca5801140b8c61121353c8d694da124866c619504f5b9ccd6da17be93c6d61", + ], + [ + "8e13092c67609b67f22ca0ae7327afb842c7aa0603203e3f3b7963f4c8303203", + "77989cb63c4023444174474f63316273cc3e83157eca8c173b8fb62757558f1a", + ], + [ + "cfd57c05c8663bb5215d7f7bae371f5834d0ecb4adba2bc511053e453544774f", + "ee4d65bcde9b762cd44a08d07625f623b49fbb485587dc3ded2383dd6901b1d3", + ], + [ + "3f3e034d42ab1a8a406b8e6d9c87c197241afe447b266a56f8410ef4f8b16a8", + "97440f1067adc106097273ad8e197fa83b85f67bbad05f7f0309a804dbec69c", + ], + [ + "99ee566e1f344fa29f63e6315aaf9bdf079ffe0327b91d38303604f692ac542f", + "13889ee7faf8b1aa065118f3c74d9048c883bc6648ce41c8a1d661fd62191997", + ], + [ + "32811a7a8b06350290bc03fcc054de5cf638f557d2cf6ab25914f7881fdad909", + "dd099bebf8990c1801bb9e0a851d26676108a6fb40449742f00b3309bbd11ff0", + ], + [ + "a38783ed1bcf1fea48dca6c47e1bf65a56f46b3ebd057c2f431f462060b5f619", + "a0edc3fb687d732da87314d2d29d1875a7799863e0aeaf67a5d33a9da710718f", + ], + [ + "37dccb37ea7fd429c39e444249bc17e81a3e5d5efa1e1b075d9bc15adf7cccff", + "9fa4f71a9395be3564cfc66283a6c535daa6d97a372904da654873907fba12d", + ], + [ + "e0ace9782e666ef4f6dfaca487c21094482b8314231470e103c46e60ebcf7262", + "cf8daed9f025d8113dfa63aa57f334b1b1e83f1574944d23246a9d31f8d1f420", + ], + [ + "ffdfc7e6c2c0d588326522418c41671d19857dbbe6ddc05a0158eeae457a4773", + "d15002a444526917023bf42723bbfc8341b0869af02c3a83a3a525426ee7cda3", + ], + [ + "61bbb05f379b23f7efe5b1a4843b28e6df864682b1f96aedb567d6ac42bd6d29", + "4d88113363fdc900da06cf895fc8d370686c0cb28e6e39b6caf5f070a6a26b8", + ], + [ + "c41114d00cdf9436fb7262dac0362d1440b386b6327c0a7e3417bc035d0b34a2", + "477abf62ff929706d6cdd201e486c9c09b37a847d543622ba5cef1ad95a0b12", + ], + [ + "6605ecd5f7af643f8abc03d1454e41cf926407cc84fa840c37e2c2e421d3aa42", + "b337ce7e45e1d8c8836edb8040101021edb84f3d16b668e242341a6d6a5eabf5", + ], + [ + "4c9b20d3e4d54bc1bdd0a63176cde206cab71bd10b9407891213462f23f2d925", + "31469c612dd3db947f68e169308643403f8e616a06eedb03cd2d8aa9f2ac02f8", + ], + [ + "8d2fe571bcfd7c049d5bb197073a732a5db84d2fea34c93196860411e84e0e5b", + "8b4a422e30c78996659b65f8374c1108cb20ccc4dff8b5845775f36f3eb82fab", + ], + [ + "585113ba35850ccbbfc02523d8818be0a28ad7664e68c331083e2ea1f095615b", + "33ed1dee909df6bd2c34299552f00cbaddda07b8ab7e3ac7d935f0b30df8aa1c", + ], + [ + "9c02205e752baf4573257dc143ff9510e44a59ad63b89b702b37a952f41deff1", + "51ff946ec1b5b628057b1a21b2208462e6392c31d1502ac46c23069c4b7d692e", + ], + [ + "b8a4cbe8c005c26b6d5ab646863e9563cf11623a32a1f6ef306a3c8ee3c76cb3", + "5e56df6eb307fab30624a267923798dc4afaa5184d4b16fdcd529a59ce6bb278", + ], + [ + "be5ed0e3475c128cf06d66c530cb4f3d8772d34c381060380802dc91ec34f9e7", + "aec44147285bbcab92118c692a1b45ec63d2857c9ff6b4ccb9e3c1931e82b100", + ], + [ + "8910bd3beb38cbec4acd4c2e3ac5664e4f7fee8d4b63266b4e370af3aeac968f", + "890896b1f8314cd40884b7ffd5a5a1b15309569a97b40bf1c3ae50cc9c0726e3", + ], + [ + "881a03cc17042d2af55c345e1275627c4130fb30e58e8f9c52d8d8b6d55d6a4b", + "6a2e588196940b27ce4a2f5d770ea7440d7cf23e2a2c4f100a970a53238d3013", + ], + ], + "step": 4, + }, + "naf": { + "points": [ + [ + "6936a3fd6ff747e46ad77dd87cbbc98b027f849e87d81fbffac3f904eebc1272", + "5f06a2ab587cc06a88208311a2ee98e583e47ac3861fe1ab04c5c1fc983a7ebd", + ], + [ + "9079606490523c7d41cb5aad076c20c90ec6499d4b9537dbe1b8aaec45c61f5c", + "3a076bb9dd1e915c540a9877e7a1f6873c568ef75eb882beb309b4ae7ba4f107", + ], + [ + "3ba5119d3123e03e43eaab50c23bb082bd20213c23c00f70746354ea0173b4f1", + "aedd9164e2408670f933bdc77c941956742f2f17da67bdd2847d0303f5b9d4de", + ], + [ + "5b3081d0c4e16a4cc09c0444c8eb00abe6bfec79a7a84175c96e8f264e20e8e", + "86659cdfd835f9b2b6e019a88b12f1a56af7bedce5d45e31eb7777aa45f33140", + ], + [ + "e7090f1949c9072eff3a4158dac1ab59de407953e7fdfe0ea7d260a6245e4043", + "89300244125b88dac0daa891ead643d250f939e857f61c81a7685612b944e886", + ], + [ + "38477acc395b7594cbcd43f559e98110e356769156fd30dccc425634b2ed7097", + "bc0876ab9e7b7968cd06422bd1f5bc16874838f842ed2e335752b90c00ee17ff", + ], + [ + "2aa0e43ead3da090e337424e481937003cc23ed76e27e4b72bcd8b7bc60055be", + "42170a9079adf444efa6de778a4797d766355422a41b2540b8524f6383c45d2", + ], + [ + "1a35c0b2c7a574df0f139752cfe2dfff17624b5ec0a177b97091dcbd53c5c9dc", + "bd512271274c3cf4f4e247f0d1883bb0575bf30089cb80e227d314693e79987e", + ], + [ + "e545c291897c3fbc8842277752c41ac68363ab935e1a16efea912baa5659ae8f", + "720ee265d12597a95665e9be39508c15806244a0ba977c52d36e9e7dc4c696bf", + ], + [ + "cead9f5a16762fb8d2a506c5a3f3b3074e1b2646783f47d562e4cecc135b208e", + "86d5f289477fa2ba75023e7fac29a41b0fadbfc3bb3c61f29dd4b2e286e5b9c", + ], + [ + "f2cea7cb727bf4230825fa2a358406937c7a7e7fe2e1f6ef4f876532de45068a", + "3d0687c1077666ec8068e1371ac2f71e5fda49ba7299f4a0360a4fb9e4785a98", + ], + [ + "66742ebf5432a2e5395993332f1f3af6fc1b49e5d6b67b0a4a319acd837879f9", + "b948dc3c6f79967a2068859c9b731ee96cc6311d3f439504b8dc9feb49662287", + ], + [ + "f8aa54bbef7c769b9d2c9eb084ffdd7d36a42d71ebf7313042c2af497e2feb49", + "d431068f84bde310d97d10878eb4cbb3bd0c66fbdb7fb589200b7ba09895e702", + ], + [ + "266f95a28603d47b44a70270317b9e2f1be96392d9258805e5db46acb66e132e", + "798142a5a3be21b5a966939777c619f9047244772fb18a398db66735c2088993", + ], + [ + "48dc4f941fc87b3fef5689d3cf7600ddd3cf7e6b73017e6e2f73c696755ff899", + "38ae8923d7b47450aecedfd0c9803fc2d921ca1a8eb6028d9e9fe814ea53299f", + ], + [ + "3ec68692044b10c7c09c4ae65578ab985ceae7c1b68f103871514560f6645343", + "16c4304732f63c44909604f763f15745509d127a847d5ef6ac4832b3a8ec1f1b", + ], + [ + "a640b8702a3e5204b8e4134efc2b4c8742ee463633e76b7fd16847fdec67ef5c", + "ba90162abb47af804e4ab126b237af7313c300c347852d5653a01908ceb6aa92", + ], + [ + "763a387ffa394eba5748baea677d806b636458c5f178d5500467bc58cce08b52", + "8b36143b20088a8a63ebce51558462ce7adda3e1f20d850a12b448a7d3cebb65", + ], + [ + "853e4c4863186abb68f237d16fb36646f5ae714af0b9346a9d89488a059c1425", + "c0bc0e56919240847b864fae14e7b1c2ec4a76681828876e2d87d2363c52f980", + ], + [ + "8100a506b01614f5eca111539ce22716fdfe0b4df072822624d60492ed22e919", + "70bfeecf3884a7ad67732591d57d9ceb6f94d2dd87e9a47b6b0daa2a35c628ff", + ], + [ + "79c85db4db01994a7d9ad900574598180c5bfb4778873fa4ff23ffd248a7d061", + "7795f4fd5b2dda05e91cd3ba5e6a3184d82d052aadce5a8ba41b06261a6966c4", + ], + [ + "94f7d354d8232773b1e8ae057477f580032940ab46c6e181ee426ccd5cd79bfe", + "73acbfefcd9e6b4a72ef6dec7f80c81c5254469272b33a5c747cb96782ba21ad", + ], + [ + "b9699752ba78bfd2b20afec715af2c70a624fa8f6c83906283c7513caa760974", + "bbff86efdddfd2674819d515ded93d49b944e0febaeca13220755ccd921d60e9", + ], + [ + "bdbe608efb7db2b5f4cd0b228766127ffe70483b3dc690921950b421ff6acd3a", + "394077fc247fa357d78f592f7818ed826147d2724645b5a837c92285e1109e8d", + ], + [ + "20ebe0e2c3fa4430a1deb852f4318d4e20bc0b94e5edf3f508cec1c3b3f64c9d", + "731e38472f54c2cc9a5e23d82681c6261f1511b8e1a5f65370b4ea773241ea3d", + ], + [ + "c3a318e106634afb12e8beda8c8acd95f9c3fc3b2f2467997359638546c4d8de", + "ba1da5a33465282c155bcd2dcafe1973db82f6e622113f280167f41c31cb264f", + ], + [ + "cee8449f7b730dcbdeb0e4a46c814c131eea5beb7ef5be6258bbbf9e73056835", + "5e80140114cf3f4a2cf6a6880e518caee759f877e27a6b4eab495c5a0182bde2", + ], + [ + "13298312acf8ccb468212e3fd1eaf381bfeea5707385b293ec832e77acaca28c", + "a44c6c6d0017625f5ab2632c79b7a015748060ce661782ab909f2db2aac9e59d", + ], + [ + "c2bab1bcadd53b78b9727eaa2d17c362100d5d368d063d169d44ed65c46aa8e4", + "624998e6fb7a8ac651f7017ce477f8778afcd30837ebeaa084e90c15426704a", + ], + [ + "94a44a72b8335f9e1cdf6537eceb50a5955662119404f843667eb1a7f4c04cc9", + "d1bc780872bdbf3b6658466da44bba2473c5680eed4350dd7faf819dbeb9b690", + ], + [ + "763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe50", + "876a01d0959b7002bf7c8f91230de0ac98b92ff24e8197707c04d5383e76ba9", + ], + [ + "1628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b20", + "d096ac49f17474fbc90d98cf3e055d633cb76914a659f4666eb62f1b957b4a17", + ], + [ + "8218ad15de96a541c88362a891ea186c16d0c51c48a4ddd86f04d3b51f9c391e", + "d59d7ec8a8f62d8ee3ec728c30a96a005af456916620ae82c735ac12f33af7af", + ], + [ + "9d3ad05948efa2a8856868891e9ae0987986a53f61bfe259e5da11cc5e793474", + "d37b1fab46fbecbc126ac553a8dd1269bea0d0ec655d14f987b0687f4eb5cf66", + ], + [ + "d421b5e1a210364294aa89b40750d0149c7cb942c05804bf19f382e92aa7864d", + "74cc7b2e3786790c1f947e696cd0572030a119f8d4af1ec56cd001e39df36725", + ], + [ + "2dacdf71ef82fcdc94922ef17e29b1a2b34a7db596fb852ae8f8fe1eeb03d1ab", + "3972552daf82877e66d92525e82d5b3b871ba632405ca09db8dcc81f42911eec", + ], + [ + "22f8fbf442fd1f65123716223af72e0cfa8ca0d8a7aa6ab616d2c02fb760095a", + "4a1bde1f0c2302dc79807a770456a7e7be19f0dcd4437a85072758b78f3d0402", + ], + [ + "b15e4970d5baeb0cc30c6422b2f9c49719a87bd8a0ec9ce0a2193bfc266f85cd", + "54dc9d615105f9dab4f0c7877eb94ea4788522aae9fdbb283c3139be0d373218", + ], + [ + "ed556ab389327fc08f6428165f89e14dd306e29b5176f8ba40206d330ff0e925", + "75df5ecc91a421f207370c450128375097a54fee9227b16c2b1870af8321bb8b", + ], + [ + "beeb1bcbff18d2d097c711165c6e4c8e9d0af322ba3183d3a5d81fc63d5e79e", + "acf441a585bc1455bdbfdb9cf290d1fa02dbc41ffe5b29dfe657f130801937b7", + ], + [ + "f3086e93a243ca4387abebf2ab80485125d47142c67199a2c9ee62dc3363a22c", + "7f00132d7b64be47536a39db19c61265e9b1611c625aad75c52b051c64e09dd9", + ], + [ + "bfc845855e11efe96bf2f65ea65641aef617dff85af76773646b0dd7e1ee314a", + "59751e2f1cbaebeab0066ae1f282369ce91ee26f142811b998dfac18f1192b61", + ], + [ + "bd0204380826ca9e41252997f6b0670b856664a0d4b409b516329ff7b4d8b2c2", + "f49082675cff15708f439ab06e58e3ecd07bc342235d56c010e522661ddbcb1a", + ], + [ + "d88aca7f765b8048ea123446310eb5a62d51e294d54487dc1ee6264a7eabe67b", + "150f87ee211e4450ab49dd209f98f9a640388f7cb9fffefb7b284be14fb691a7", + ], + [ + "211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f8650", + "a70abf79c554ed3ba8a5b9b0b46a59f2354719f2237fc68d587138c63c92f694", + ], + [ + "581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d290", + "35ac466d54ffbb3bf6c1a78f9a2852f20b021c39f219dc582290e253d61f6d24", + ], + [ + "6a8f9ff1974291f2a127f2bcaa12d0d6684ad75bb346fd2263e039bb308cc407", + "f293fda5cd6f439be1b1cb5344455a165499c98dc5dbba0c802049b68aa19e43", + ], + [ + "1ae5381478181c6fe848e1d2566805eda8cdb77497e43f4dc90323bafceb64df", + "fbd470f63cf3e6974577f1f3260b76785f4d9c44b68b7e72dc7b8e69c70c77c1", + ], + [ + "c438ae254e65b06b50522fd4a9a3b17b1f1abb5ba7b43712d037bf83f9432b4b", + "a673fe094fcd659c3a3c2c7b98ff4b37ab58a3f35503e4631b57ea284693c044", + ], + [ + "9b1c239f4da499d8a610374c569a602bbe914d2d99cd026b7a96e0a4ea6fdf7e", + "4ce9e0b6ba8bfc6ca8a14644be7779373125181df21687cb5f6f0feadc19a999", + ], + [ + "51ec8733c3c386e67670e41bf619241d0a875e829f7f72c564bdda6c71f8d02f", + "429b1f8be1d3ed896fae60930a4f9245df79360186166f300aec19ee8bf7d171", + ], + [ + "80d5abfc5e03a86608ec1602b1d28fdcb11125ba2a9ba44de6ddcb77b3713906", + "3d6d112be9e512e7e346db071cbfc97c87057c96bce7fe5d5ec7bbbf5327839d", + ], + [ + "e206024cfce1a6f48f9cdebe9f6e8773571e4d0792ce3342ca0ba9c3796f4c7e", + "cd7e9424ea700c12008039e02de2ff12754e4254a7f687cb2159e08b76369dcc", + ], + [ + "720b2478548de20b7b092174df861f4fd4f61e461ae8d13aec63acbdd10edd03", + "fdaee396cab12c6bcd622baeb879899e7229d8906cd660daf419847ebf3df785", + ], + [ + "cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa80", + "9af0ace804d4730370adcc57148b1351cc0d4cdb23afa674b9c5438a67e2173f", + ], + [ + "34e0d07fa2b0d3a5c3a5ecb983538693289e86da0ec0d40a125e6c1b7ebcb887", + "1d8209da9f3a53d713cca90747f19ecfa6bcdb1186076b9e0d92e9a519333606", + ], + [ + "c3ff66248ecca6e1a2627c4851b5bc7f15b920f38dfce56ad19e039119f6cab7", + "95dd9d9689821b1fc8df855fe2f493756b76c56daa43b27b9dd2bf2d5f5b5bfe", + ], + [ + "bdbec7e29af29b0c890e8d54796883355a3bb1a29699e9208e4c4901b620dc4b", + "cdf7f856480ffe37dc33392fa67285c50cf6d118d91a35092750de73e51e1bc2", + ], + [ + "ed0b988757b7f55cbe22ba0f3a49fb4062afb7bbe314dde87af199e6cc473056", + "edf1015ee6ee702e7e814380f67b51417d29c63977b74978162cf502d653fd9f", + ], + [ + "1a8d419d77f10e047d2bf4f683b30d1d71602d4d0e5fe2014d7251a8c03e3f4e", + "e839cd8ae99505c0af4d4e193394872ff3184843a0a4996a4941a1e76a0ead7a", + ], + [ + "d7ca4d911e35486f783d1b6917e47255a71497178a5ea8c62ea859803b58b022", + "eb9041d09e788c4b870726c16e3e02ada04cc88ee17ff543f69b4d49b4d4324a", + ], + [ + "9fe23975b85b9ca64b76d2d1ed32559f72dab6c825733faaab54cfc93740130a", + "16d6af973febbc0a1dc5fac145ff0d52292393aa79f3ce2128b0d24bf2219f0b", + ], + [ + "5fe6a86a04a36cf5072a061ae619f2870e9016ccddfd92836e84bb6dee35b411", + "67592241be3c14b60a8879244f403f2fd1c4a969ad602d09ab6968bf60059657", + ], + [ + "44267faf7607090bdd5757b4774e5e2057dee05bfffbbfe45d8fadf89a6b23cb", + "326800b0561e5163e07a886ce2b1765b29bea9344097eacd254ac6fac739807a", + ], + [ + "79a858f5e2051145451e48e5c9a5a00d7af3ac73ef60c4144359ac0ee9316378", + "838260f2e5ea445c4f7b9d729fc39934d7bea67994a5062d32345065cfd0b21e", + ], + [ + "f6bcbca58d1258f333f2018e0c682b4bb397e437873506e97484c32e4d4b063f", + "1f96ddfc4b09a832a33b10eea5066615c523068fcb4b61497f470fd2357e496c", + ], + [ + "2cf34ebf3294d4053e0c36555031caa153be80ccab41bf59e57d734c45e97965", + "cb5d3be3a66340379ffe1c87f4b0fa6aaf70367c6e40faa17832c7dff583ebfa", + ], + [ + "e9cba4e4a2cce029cc11d879e158e9020a22a7fc165f53ab7fecb5e72d4ed339", + "4e52943b8c0dbe7352b4d839cea765fbc42febcc0bd77a81bbe8b81a018c44b6", + ], + [ + "9107ec9ff43caa9c60e95ac66e9882a856402502edd29cd123cd8a509b785f9f", + "4310217b33d10170a804b08f470ceec3afdd0f11ceb4b358f48fbb98b6601df0", + ], + [ + "3608e5ee5e86af288a557005a470317039c1b74f154a104e7319a1604954b44d", + "abf07caf2c90eac8ad29e49646bfa2392f3bdeb1887e5eb865b9c5b5925d28d1", + ], + [ + "838f777f417b0f3bb482bb8863b12d538cc5a15e867812f3f21dacbfeee0d224", + "c091680fff653a74ed128b6c8164faafed78397be3636a5d0a0163f5403b490b", + ], + [ + "a5dc1a0e219af09a448d7bdac761ea1bb41a9b457edeaf099af5cfefe873080c", + "2de55f8bb32112cb09ffd7cae9a00194186f17a951252d87508b4d10ba7df535", + ], + [ + "c3023743bb6f78181a4d820a3d14ecc875cf0f47893ec5bcab32d59bb31fe40c", + "d5c659338588f2a33f2483c9d371c05207de89e1a75c2a6f40f9faa82e132767", + ], + [ + "d6905d56096551d43b83bd7159b6e9fefc278a4db8ad0a0bfad3818b7c5ae8a0", + "62cfc407c7e0d779893d4a8ef04ad9280f4ad4aceada798f73cab34323069efa", + ], + [ + "db84b08deab769a892717d7b43d01f66fc8292b00267f2802b8ab7500d220610", + "13ef0e889e8ecd2fc3e759e1e3a8b1e8498b312caed21867bce6e253341e3244", + ], + [ + "eac1e2653fe435e09140c37d2cc8869e3cec6004d52c62f45922aede1b0d9f5d", + "1f815633409735b2c65b6cf8725993514bfd6e706eac893a7f219a5d5065970f", + ], + [ + "fe3ed11afa78891c88a5ac5357f517d58e56c30931b83b7a8d342dee31ab2199", + "4598b74c335dc57c3535f43a2ed141bb200d300896ea7b67ce350b93a299f465", + ], + [ + "790d90ae29b5a099f850164cbe3f98103e53ec1689e4964a5cf2f53fae06ebc3", + "71176511a964c799d6285a1e4812729a7614b526fab2ec6fbdfba2c032f07517", + ], + [ + "902d5cc2c25882cafdd5f8a955ce45844aed8c445b860e07370cdcfeb6f06d6c", + "f54e3fdd9e8dce6dcfe87d283b3f2495e025cd84b44ff84a8a4ec69cfe28f37e", + ], + [ + "5f8a63949cdc5ebde4d655a15c4e26843064b46a031ec7dde2e3b75e4a7de454", + "3a4fb3a228766b569ff7c51c64e6eaff3f67cf94a6a27c2f66f0c9cc2fa2cb91", + ], + [ + "d8a890854bd470cecbe139277f1b401d4a7dad3b1d0a8ce7c112439562ba9528", + "734a68e5fd22f287f872eadbaf2a7a43fb96a11834a72658224fa8f727866ce2", + ], + [ + "efa9e0f5d2793f66963d4f38f067d12a5403f8b4c9cef95e91bab76bcc86ad25", + "5d026e4345dc30fd6c0ad805776542fb15bd9e01affc45386b23ba8a76e5e252", + ], + [ + "aefff396bd77d0e880012da1bc27c04c3c9dfb265ae272b25d4d5b50752e7c6c", + "ef2c4920e92271d83e62404489dca02da28f68fabd5f9b995294ff5bf975acb9", + ], + [ + "ccf314e35a3ed0cfcbf3bea9ff7a05729cac5da54af5d694c642278cde85d863", + "d3a956674f3d2a0beff5a871a2de65bd3920214cf0a60e74a2cdbc7483911e29", + ], + [ + "93394d39948e690d99c4406fd357099eb62ec3f600a4b6b4a2e77a8f43dddcb2", + "c0d43037e46561b3c98d5943ed6bbd2a5b23d70692b02f9ba27dd7466f61b38e", + ], + [ + "b5eb3a4d78085c7b90dc481cc2969771b767268b157eb61e4e632a472f863625", + "71b327f25320dd4697ce7b79ebdac8729c5fb6f523a1e1c4562fda0ea981b91e", + ], + [ + "7e3af404cad404876be9e05ee43bdaee94ec19a2801db99029fc41ca24b5f7fe", + "95f8616620b6d8eb1bb4adfb4fbd595185ec506b5886469bb294c1967ad20aae", + ], + [ + "782c9527388645288d5c495bd650082b131b783802067f87f3b4dab9f6527ef6", + "d9083fbaf4ceb380984d4d2e0115e0450f8b874ded2c23f20645c0bbe9cd7813", + ], + [ + "e6471befe06abab386131c757c17902235b7e70f54fc52fcda0b99e816307d26", + "4409b44b11f94bb3b3e520d4e95a091f98adc48b03cdb8354ed8cb5c3a40c180", + ], + [ + "f1cc8ec50125e3b6ac0566f68e8eebf3801438b96668d24451eb127f00de2e0d", + "4063f4fcba783c75b06d77b13bf412b820b57b862de2f0a097156c43df7d0404", + ], + [ + "b071efbe60caed27f2283310f9d10a32d1ae5bc41ca01511abca512c00a3ec5a", + "3eee05ed6bc72b69bfcbdd786227be678b388a5d5b9fc549aa897239c20d6899", + ], + [ + "ae7db982d4f0a659cf820598c7af3049b94110955a405a9d5adf6deffd64de6", + "2094381461872fc63829e08c1060c6b92862f92b4d00ae40d0dcb43c7fdece00", + ], + [ + "debe929e4b66f572efab6a0eb1108c009529f15dacef129cbd7accf35fab9ee1", + "c4b92fc6d6afb9303ef606f45cac02fb5b95f16e8f15b7ee22771d982228ed78", + ], + [ + "c6e769600a990e69ae044e1e2093c6026761e7c2a9b0027451421f22aaf72bf5", + "462aeb6eeaa4adfa0f25af16c4d82a637f44fba28fc836abfd9b953ba0c0a274", + ], + [ + "ca934a2d3495d0f66bbb23c02196ebdb5a45e0190abfb921db2583523bf16c5b", + "f476019b88519372c0a6b7162ed0ef6143518b25d419bcc94a3973b97a7a75cd", + ], + [ + "4d7fbc0359a2e5284f2eb8ccf1a7dc0cd8ce2b3ba2cd72713832c69662e97daf", + "fb516b9b34a973f26c734b24cd190e44fc9ce29147b868822753cbb1381e6a44", + ], + [ + "466ea7325cc7b232bb7eb63585137d776498eff02f03468a513cb983b07bd140", + "ed16392501cbaabb60ac38e3e74a6fcbc49f32cf1571614e01d9523ec7c62995", + ], + [ + "b48fe9f6fd3c9eec88dc130660d979a240b3b3a385fa633e5ca2589f9ff5a7a4", + "c90e8859b8957724b6b8bad35b878a2ac9b2629e2fa0c9df0ab66cf0f9862254", + ], + [ + "466514a7a9d03b7c1abf76113ffe5ec1c3b6728324f29cc250f01c4204328158", + "9282b4909dd9c6eccf2d7dae6f143b3acf49f67338a2ffa7c35fa68fb0cbd9f0", + ], + [ + "5cdf52fa3b8b82e89d77d795f87004b60e10c8597d73937350be567c85ab647f", + "5a4de7c2b4b88b436c5054585ca177e41387d8f81a840d2654ad701064cbbbd7", + ], + [ + "cdf63c541eaea53866acb6e14b47dd9bcb17624f2d249f03a56282911b747ebe", + "8e417c93f2d5fcd8570f6614da11b209de92e9bd6f1a07238ab47f80659f5195", + ], + [ + "729037f4bc7d5fb3a7d668925e5cb185d1289b7b40b2b70a479d917eb6f2dba3", + "ae7aede59916a46e5693ac79c08449158b57076acaa7875fd8c5d2d8cc97b6d", + ], + [ + "b65d579609241f97e25aac1f44653c5e39533bb0ddd1e847dfbb6c0a6df520e4", + "d0fa4c6749a18395989b17423ead44d2674b77dfbbda12aedb34f5f8648ad7ab", + ], + [ + "48ceda741571fade05c516ee9250d943861ac23d58c8d98716d2c381ac9656d9", + "7bcaf9dcd71912aaba6730f4cd7f66afbc80efba81089b54fc7b2b0db5ee1098", + ], + [ + "a80bf3d0eda0ecfe84ecd021bbe5f094ef507bada5303f6cdd121a7a4da0512d", + "7cc3bd65dd117df210e4295c3de245aaca6374f4f15bf97e834cf7977207aeff", + ], + [ + "5ef1ce3c04a93733288d3500f5fae25a094af089e29c51b687cc90c9ebec0d78", + "b6eccb055419d489ce84b2f9541e5e17886a320366fcbfca4b6ee055e671536d", + ], + [ + "bdfc8c2a9c758132ab45d6008b33f849a98ad7458be85a6928b83f56a7928e34", + "958e9f764a8e2d660cd76f5261f4a1452d969877b58cf4ec25dda94fe42b52b3", + ], + [ + "882444fa746eb36d6a11da19e8b432df1d84a3a86fa266af87bc5ad5f28c7814", + "796e9656678b223c0ce37547cd166bb55d9db9d5a9f97f5bf07c383c7010fbe", + ], + [ + "1dcc27c4a32ab23336fed139a84560699854dcca0125229bc572366625fcdcf3", + "b4c852aee55f47793fa58b2c59733738cf9f548f7f2db89c1bb6b28d0c74d67c", + ], + [ + "3df276679157683a7dfef4891905168c6455359ceec934ff9f5d6235e0833b47", + "93d2fb9e1e5c93681c4006a8a37b4f552b52cdcf508f08d17a22c379e58cc1f6", + ], + [ + "2acba700d78c82100edd1eab6bb6fdb52b72e91fcbaa1d870ad14e478a414b21", + "fde2be6ecee9be87a8463f594b6104ac423d4207dee8c5e8fdb75e81458fa142", + ], + [ + "d0b9db0bdd54a9332b0ecee615717a3314ab8b1f0a558ccd342772ba208937e8", + "7efbe614f1f485d19e3b6e4ec4ec6d833c8931bf8a1afe715209b1771a6db886", + ], + [ + "11754aa57586d353b78aec2ba5ff74a132386a3ae5b1f5b28f1c5850749f50f7", + "1a7ab0ae4c09ce75207c33a2d8da7345bf37c090346333dc2385603c92d5178f", + ], + [ + "44754a6815579f571392ad87a1b381b026d81bde30f0a99c481bb9a9c7c0b4ad", + "8964c0179d0dca2cb4efe824d66bcec6add44776bc8d5b4b02e68377d8f660a7", + ], + [ + "2ffff6d3750eb1bbfc47aa11e9ac3f7e4c19c524c99037bd14a7d4ed85221e57", + "4c20577c4dd37c57675dc40e5be466a70a430a674ce051885e5c154b5acf60e0", + ], + [ + "2850571f7320cd7c61f9607ec4da1ca7944fb907cb01791cf4bc889e301ad05", + "c37f4402beeef81caf71a68c220710fc5455e14d924620b5f28f104d2915739c", + ], + [ + "2a5dd6ccd0a0e81828ff62755e0a04326f6677500b1f6a62c19d407951c9dae6", + "163484cfb773ed5599acd6994d9dff5a66dadf910eea589a7410810a33f4118b", + ], + [ + "6e06bc3e7c491657f0f9eaa420c372cdad48693e800400db3626b376a14abf26", + "4d831e2867af8bfd2c3ea7530406b65c70afa058d88bdc6a8ec8d58d43ace093", + ], + [ + "3c82201a7c993739fc8f84507d345f7a8a30826cbfb1c75ddffb87cd2ea70b4a", + "3f58817306733cf86b05b93165ed5ca3fa73346f93120de3861a478e52c633c", + ], + [ + "b5281c2ba403956e02ad857b33face5239ac55426f45aa057ab12a3984e3fdc8", + "eeec087c83d0a1fc623fbb15ad7d1cb6da18f72cdc9bc0594e5c07608eae36a4", + ], + [ + "bf9a33535dd4fa5c1b721c8aad80c7f66e222f6d02e658089563b16e5eb7376c", + "f04660901baf8ca31fea41d1cdf54283d98f8ad9cb46440868c6a6448415259a", + ], + [ + "228e388d34880b176b2acc791b00b68a50cf163575f7cdf8b1ca80abfaaa2377", + "726f0537a0a053a813b2f6eeddc89686dd44e82e2f8e1b1587ab652445c587ef", + ], + [ + "2a5e7e0f736943d1ed6b9d1d8e3318247cba79fc6d3b2cb6eec90dd7ac2b219", + "1ec12d1d708601cc1890f6dc48529723420a8a084ad8871d880838d4192bf29", + ], + [ + "ff8852e0794f94517355bf343f4f949947de6d18a4aa0a73574daa9aafa4264", + "181a69ff2ef44fd33578393e08b005393b55bbcabb763fe04a7835ef6b226dc7", + ], + [ + "d7f42391b54e94ff9a73fb5c90926c8159930c63157fc8153c55500d5a120039", + "b585aed8f4b006a94ddbc782b9cce10323da0a851d5a1a137c3e7616d95d5092", + ], + [ + "b4941424324b82295a3f3a483a17e4a37772bd49cb5a5be97dc759973ee3a46f", + "26679012b32e3fd97b308e923c80c397d10aabbc8ca9ca5672a65542cf3d3d96", + ], + [ + "aab7f885a0da5f925100ef697e0fa4003a1b36cf8c557c1e111f348c06526e35", + "7b5e685c7df49ae10acdfc5134422d58d834fafa2309bef08f5bab01dea81ebb", + ], + [ + "956c539c1fcf417c065bc7dc41d5df32413095d83381e172be805298b669f5c4", + "925131c0a9b9db53ceefe86f023fd6045bbb9b7506205b28c0bbb286a8d8ade8", + ], + [ + "fd040961b88e7200e0cf46d46fac51954b21383c54221436a627dddb07d1121c", + "ca274a9bf179df93bd797cef614f744a840edb47a210d38057de43c8f5c5358e", + ], + [ + "53c79177d3b8d45797b8523564aa4e790e8cad79197b71fbff5fe52f84091ed4", + "441ee53b17ee62477458629ca251b9ecfc46a577a597b57bfd43b90fbfdf6212", + ], + [ + "cca0dd3e7c7ef94c4c45b9211e6234f263f030e5e843bfc667027d0343d4e8fc", + "7c7f160632d1d7edb0b101bac8c8c53be8b495d9eb2f6029ddeead776f095148", + ], + [ + "29ed75ebcd9f70a14258a8124e35c368d4391b5b7218941d1c91f1c120dce7d6", + "a7804a86ee39b10f2f29fc6c18dde73aba5edbd28532ea5f03c6819bf8ca726f", + ], + [ + "b3b75f584b324b225ddbf091b0ea79588eb9b02507d92f43c51b9caa763b25b8", + "cb5b8c0be5431a3a277c8501b8a9c3d28d1c54cd5a9fc16bd41110447d614cf1", + ], + [ + "7aecb4f00176fc81fdcd7753902e0feafdbfe9bf7723bee1260cb930f070a59a", + "a27e53802455462812f85101a5003e2bfb0f9433ece1c1534b9a600823375e6c", + ], + [ + "112edff9abbb4b58c61460041df09d88dd6117b67b9eef5b523048577e0d21f2", + "22eafd3db8c1e4fd59e5c3ef6d0c516381a068193c6c67e457faa3766dace753", + ], + [ + "7abab5b048dcd71f4f371a290cd4da8b606b5a2f283bb5464936cef01950ca41", + "48a3cc6668828316619ae5ef449bf0981cefb8c96da794523f2f36ba752bcb4a", + ], + [ + "32987a5739a5f73bdb4d57f6e746650d7ddc4dbd7e99bef3d058ae32625a68ea", + "41bd2f0902afe63a9716896e532ef82645c434d2c31d0047fd19d729bc4c404", + ], + [ + "5cbf3f8fb41cbca8e67df1dab618489525482e679e515c076991a74be462c16e", + "7958efd63180913370dc394aaa681b16b152001f436d1b165999e5a103329422", + ], + [ + "1c4f772f55d0b0b71d84d2fabc18a7b834d36fc4c18c090b69d5f55cf8821206", + "fda67f40cdf8a8ef15b07f796cea6221a159c3ac41ebdc97412b01ccf43e2317", + ], + [ + "1b06e398fc1c6ff9d51bfbf284a754f75be7b7ab97a56bc2df216f3d41e53a9f", + "a56523ead65568d7a0536fc122e2d304c02e084dd050290dd8df02d92087b877", + ], + [ + "9fff4fb8198076ed4a27ce7b49ece2a1b0e700beece331931bdebb2c57c402d5", + "413675f157b97748b9f62359a9c90d6970299098b9c4c64d55b028978b7dba6a", + ], + [ + "3cac5ce5c05c7261ed6beb6e2d937d37eb81fe30aeb17d64e81e867b9af7ffc5", + "fd686e4d34b1ed6b11afabe06dda1ed1f9d79c550224531cc18782ce53c2bb33", + ], + [ + "bcbef5fed80f73ba72e470b94bf0e09b4835d45f2296d3e84a6a3d0d6b4fe238", + "40b4d8f03028f54cc88f792bff4f908b155a2ba4a75a985d994b92a8296a8383", + ], + [ + "90e4e50182a5d0f87053928e4349b71db6179d49f92513b41531477b0f9f08a7", + "567036f3f0c5766db2b82a4174e01d3b35f49249c1c3afb30adde2a5de1c9ef6", + ], + [ + "1cf3298b4935a253fa1dad937780396e733db859b74078de99b78b7a9e048235", + "ab53206221af31b11a380d3e0e825ccd569903d8348116846988f609e4e61946", + ], + [ + "ce309b8b24ed6d2539931aadbf08abb698f8bdd01a54ad83a7150c44e939a62f", + "48a7f71125296c28ca3ba644c277b6c64ff18bed0b97d8299ec09791ef6564e", + ], + [ + "87a70ae066b1e7766fceba2c647cfa89ace118ab86ae1122b193ac85d0cd878a", + "4fb290de7f3e1983463fa56afafb9650f321d886d016b477ed69d37f0aeaf5e", + ], + [ + "722d6df1356b47693439d4391e6e15be038f51c35e43bf384d753bd9995ffcba", + "f53b4dc97fcfd3fa96a0cc605adafda593cf9a204d74f34727a4fa8a09e0ca4c", + ], + [ + "2e70717d39a8b7597d5a84a4af0e31ecdb96f5038d5f76da521291496bd45b44", + "7c8d4e4a8197f6ce50037a07d50e4d4405ebe3b1a9a650469137c7279782ef7d", + ], + [ + "ef65fa2a9411a010d7d9084e7f393a986ecc1f6a5fd3cec6209475fde097b9f8", + "355cff9b9c6df0f206f8e0a158d3dc095f02495f52463288f746ab9425fe3000", + ], + [ + "574e7392da2877a79b4cdd8de8b4af24a7438edfa3ed4380ebee9529d19cbb0d", + "ffcbef26e34eb670ac9f24576ffaefdb377f34c2b0a2ac03cb838ae741081539", + ], + [ + "2f373d93f91d307e2984b04b7fe14e0785ebb70377e1bc2faf2c8c8dff4e4dc0", + "16273c32b347066eee8a617653a2363adf364861756bc7e04744cb9f5ca09850", + ], + [ + "77ecb20010909247c8832ce8a6317a175b41106a4949495f047c1cae8d79c5a8", + "7335d7e635eb5b042dfcc3782757770867c4b1d7c77c3cedfbbbce5cc0ae8c8b", + ], + [ + "1747e44afe684538c5b2f9268cc21052584f7a392f50da5d5c4e870d4db628e9", + "4de3445d1cc1350a9d8a6fa701593d1a6567334a1bf4df989cbbe459ebe0fbb3", + ], + [ + "4a29ad2c04497d01ff9c2e51103c239ab48c67726eb9c2e331e9a1399721da1d", + "8983a5812bd036829615651b4036e27ec1243e426a81da469058e8cebdb093ab", + ], + [ + "356fdaad83d41cd5ff03aca2229d6fb1d190b8cfa574c267373d43feea92463a", + "acd689f6efd4946aa801b4fda580a7232e67353666211dc1858bcf4e399bbc0a", + ], + [ + "6e09a101dc78cb4203c61dad3ed9406c939f775af42ec44d4389299f7674569f", + "1d87b1955df44710fa886efb5d78a5080d333350ad06d5e545ccb80688fdeedd", + ], + [ + "fd38823cbe64fc2682062ef7cd5a1a0a029d697144cd0bb5b372794f8d97a216", + "24cf175047adb90e33d8d7b286d1d455ea182321ea1fb4ae3dc61a57242fe934", + ], + [ + "60b775dc4ee86b77d38807d693a5443d732134893390176d333d7bf47cdc6d77", + "93c47c61aa0e7870e63f31e4ef8bd76bdd4b101e7bf9741eba9ab6fa0fe96842", + ], + [ + "b40a6ee9856a28ec0a8209ab723a7e4fc4e6b0648b4a01634ce32e936836a3d0", + "fac790b5a621fef9ccce05dfd2207075072cadb4123cfe0adb8ad9684f2df645", + ], + [ + "994ec07d5b5f5bef7951ac80b0159081bad041a8adf6f496189867b4dc3dd5e2", + "981c9a0f363dc171ac7eb5b048b9a97b0c7f4fe8c2a62b9f721e522a0c219817", + ], + [ + "5480b7bad4c4b395afae8330cc708ce5061d6d141efd7647a2a0aef8b9ef3b0f", + "28763af8ba113d69faf112857f08041549c30db5e50ea22e197b71469a18260b", + ], + [ + "f4c1342fcf15c0667cf6d7a730531076a9273aa241513b1a94b2a0d1d5c6ebdd", + "52ebdaa64ba9aa53ec58c3333835ca6fd2e3b915a87e9e9760343e74b51c2fae", + ], + [ + "548c0bf2f5fc58fe4fc985566c27eb6084d81d2195b6e467529b36903e6f237", + "c2f61888686c943370ea9aac4d06fb56ef815c825705d970f960f0bd316017f", + ], + [ + "f6459fac1a61e6d0b855f503132929451cf0cb9edfd80639c8c77e58e11a6b6e", + "986a39b90cf6aa465232d3de968a40f171741fef1585724d7639869b284db18a", + ], + [ + "6c8a00a852cb8143d9231927565fae50c603529c252bcee0b5d0aa1b0c3a6a44", + "58ce144ea47aa385798c61800ff9f715aa88ac4237674ed1cbc6cd270a7b1df5", + ], + [ + "8f6631784ec5e9c83df2460e35fdc368cf428c1d3b9cb1871d340fe1ca582c25", + "9c94358ada87d279080f99e8a905165499bb8a23e57a1e0dbb6141f6494e3efa", + ], + [ + "42f9a49a42aa274bd2f4e0d6d66dcd9b65b347240480be7d8e49ad381bea9313", + "c1c0d5627a07ad66912e4a50eb3aab494a77298f7dc92c634404741d65121ccb", + ], + [ + "d6d30a5ea29da273117c47f49efbdba91f17eb17ce376eeef3905f97866a372f", + "c0a811e6f4044e25ccac5f80c0d907c39b6092e24fd110e239838e078694bc21", + ], + [ + "bd1c2de94a9374a6878c19a3cd80d08095ded1dc9da3ba2832b7b3715c8c9c80", + "de66d10eb6461e5281ecdae2926c600b93451c2663dae2393a31be272c73c52a", + ], + [ + "efae94cb8978033345804878274261d47d170d586f43caf19cb790f6e3bd857c", + "84b6248ddf8e5334b396d4ece230e1042164f68166e6d9af768a0667876179ea", + ], + [ + "4315bb8f8a20e5d5ed2119f8ad3f050412f7211ed8d236db9945d32b84f9ca19", + "ea8db502fa18ad151fef44f09c990407f33331cacbd39acffc4d53e3bfd88da", + ], + [ + "6aa4f90bb3e5ad19c366c71d48b6e4c9339f405f136ed47bc47f99839537485", + "e70cd6a5074bcb248f4a573d2d7622112ff9d85f1e375c821da09d92fd6cba96", + ], + [ + "f0036797381c0e04b07edcf23e8acf1e9a96b07ef7a4ff98f5fbe31ca70481fa", + "93824446d63c286351b58b5da00205d69681991d87919eaf3bf1cb8a621dcfae", + ], + [ + "7a0f8b3a6ba88d833ba55d6bc20365681e05ccd775b86bb77d48b3c9c89f5918", + "dc8702ca3d0699e1c24bcd6bfe18e5f1388e64ff17362874aa1f46ef8208e67", + ], + [ + "5ae4ae38713b8a8f7c463e1adea5e22b58fa5c842ae0ca22f411fb8397f46869", + "806d407d3d722d5444129d9b13894d6be2387d821e1da7491725b2cec99a575c", + ], + [ + "2d608c17576d9bdb224d81bd7cbc817f32d9f5d80c404ea2b8b06ac17b7a5c8d", + "e115578fdbc7d7c849805db41610201b88e701ce36ca1fc0cf635847202aad14", + ], + [ + "2d3242a87c0983a1f4841d536bd37a6e506d28bedf98248e5a28270403aa3678", + "d5c333490d053031b7df96482ba958692d8a389133256455380dd8bad660fc05", + ], + [ + "e2f1058b4ae91537e8b89b57cb31b574e05178d59b0e9a4f3d117f6838a6891c", + "604b72ed0ffbf93aa46abd0942d0af6a202a56a4d09925a8f8f8a87f74aba596", + ], + [ + "7424a95e24340f9f2cc2c24923c26755ec6c6ee6834eeb24671c97bd42f88df6", + "9a13337362d65ced5addce9c2ec3802768323c261dbda9f76b9fd506ac0ba9a7", + ], + [ + "35d059f5178f221a82e53f468b5665255c66a2aa3f93e8c0f9e2c1b0e14e5e76", + "6d166afc7b54e92a979c366f23ee6a81d31a406fcf95037712939718a3b1cac5", + ], + [ + "5a5a87ec9fb811978ae54e4801fd0f51ebea7c441054deb2ab3a311c61c47759", + "8903b381e441f196501d52dad3a9b48cd3001d40fdb815d46d92f505fa1ada6e", + ], + [ + "bb0a7625d93b5bad03aff5a379bc3e153dc06fac9acb57161a8b2fa1dc5eee42", + "bfa79c6edd895c0ce51853b41e9062556fdb5d70128fdee938423eb30f6d3c9e", + ], + [ + "beaf1502a87c545ab4e5988a7ac14b61262616698c1bc2c71e457f7e6052c6fe", + "cb23034d03e8817a5b2ccc2c514875389908bc35e3ccbce06a5ea7800708f99a", + ], + [ + "4fd6d97f2d7a286989e49031b1ffe85e4ee79180cb26b41519c0b6c40c26aea4", + "5c7bceea88c5399a59a472f13fd171be7955de670184ced64422b3def50b173f", + ], + [ + "239ad917e34e3262ec95e0be3ff95302066a4164958ddb50f6883bb44a013cc8", + "685521fa6384fd4ae7eee908caf9bcb476f7218b137a153e0113315b55d67a6c", + ], + [ + "8a4a7fe9227d5e463139ae9257cb8aad5e15b95ff8e9a95cdfa99cd33139944e", + "24e3099b622852a33cadbc1935fc40c90082981142c43e9a9aafffe3f2396b05", + ], + [ + "36d3c4f77bdac327c33bd790919bbd3ff5e68d8df73ade27f4079b060f54881c", + "bc6e3cdec1612936087afde0cf43cf517a235e33aa5775c78351343838242a05", + ], + [ + "de5163ad1ddec505da78dd63bce1f9258825a24652382e4778b3a26e8746691b", + "9c52a0952519839516d7d5168a200ffa335e00d5276d0ddf01e7b2107579ba67", + ], + [ + "c4d134429ae77a25663d952d1e691510e2c985b9e7067fc8c27615649700dc56", + "3e1e5398dc6de01bd29b280d42b31c7b9087f225d6ef738540c58ac4a8780650", + ], + [ + "f89465120a513c010682722945177add988af4dad5fbf46789e5ab4e182cadb9", + "241d05ef2a5358f019215c52c06c6e15c02e79c717c6528472d3f755985d899b", + ], + [ + "7db89b3cacb56ccf60c2aebdfaf0039786ca8649679966d626574049bdc52a48", + "a1dca9c08b9ab5d845b7464f704dfaf0ea77af694efaa74f2234413dae404b42", + ], + [ + "65dca7d1cb7629c859c5c0caaa207bb050b1961977b55bac86d1f61137ee5839", + "84322623ee243e73cee370734d973ca0ab4e7701b7003ffe43b2d3055c806227", + ], + [ + "52c80093de0d3b767575db5443ab35523d3ef2b9457fbdeeeb76c1ddabce91d1", + "d8995d8f08213bbbc4e6fd25b339e55eed705036754c4ba6329b2c1e73820e08", + ], + [ + "e32763302d6e45f40217991fb89b059e6eddd6e8c5a9f92b00f74f5e6ceb529a", + "1ba1351ac5dd63fee0fea6a2d8d51bf646410ea304d3799db903af12af19a84c", + ], + [ + "9ba9f0ef6f74c10571498dc6a36801c7137fe2c278c7bf7e190c004248d44734", + "21ebd94ea36060990c2852bae42e4d5b9cd15a5b8d1bce67214dec907af9cf3f", + ], + [ + "ebf3d3dce55624d3ca8945dbca8d4cb5212729f7c72137d921e22a6eb6880071", + "215340f28f7a909941d4d0071a00ad9460ffa364f7c3b8f18e95bbfea4eddd9f", + ], + [ + "c6a12aacdc5b533eb38685d9982c58ae27df21396264f1708ff5a112250e054f", + "f2579c783e06d660065c25f8635f5d7a3d24eefd821deb8600ac0220b45cecdd", + ], + [ + "bf044494899155f6a79b21b488a6c9376afabb168f7a0d096ecf3d4371b5afa7", + "375ecad0fe735f6504ae1e2a8e3aacc77f78cb4b7bf414080e8603e7c6a22afb", + ], + [ + "b50b25f6e1471390c609599b40ecf3ad5821eaeb86ef418dd5ccb6a629a40c14", + "c791be32fdcbd4597f1f2cedbf44421f679f2355a4c0eb58e321d17144779ba7", + ], + [ + "e0daefe3cf7c80eaaf6060a29a479d0bed09c4b0781edb14f89e9cd54adb961c", + "6bbdfa110bf4422c4ca62887fa833921043778aaf2e0be1b33aa4b1967311ae3", + ], + [ + "ccd2673b7f83f1237c581ec937491063374d275ebde0ce4ec2d16a23ad03c6e4", + "c4cfdae7398004bec4edad11f095fe617448a3c8ea7fdcce603a114c921efda8", + ], + [ + "b3d0790727409620147edc4acf62298f8b63e592fd472c2e8bdd72b11a47b237", + "2d26ea2df48616ab0362efcc349de51e66a6612ddad6044341a72b9628075862", + ], + [ + "b2af722d2de67b9bb4f1341de23410e6fe2c98b02caab2f15fec0ae929897bee", + "dec50599145baf908d4701c675b99ae6783eb1d2a16289bf5622ec455247408a", + ], + [ + "5cce103792fdcbc17b33294d33e5e70e5db269b16332ba4324e849df66ebaa70", + "f4ae27fffa0647466a1ffef9c92eba150d866651e6afd1eb303f851a168f7f60", + ], + [ + "f6a04fa59dbded32dad425e8a336499d54046445891c5a4c55352909f86c9ee8", + "48672d5f6b46522e36a1a191d6443a688f840f41dd87662d28d3b6f3a4bac89e", + ], + [ + "533ffa63c10b3e1ad3f451f256ff51e4f565d34f6bcf1078d11b474c54fae86e", + "98932d6f3449684586157d9d78161acfe9a4445a74cdc4594c4dd82cf8187912", + ], + [ + "d0cec6ae66777fd5d0267f1010b2e5f2a7d1b39af830a2ea20ebdcfbd0a4819", + "1b6a72086e75a009f95061dd813df2eedb38d7a7f9c14ecf90ed0e2094b22113", + ], + [ + "c1940bf55de0ad6860125595d324376c8c7b9c4588ed5fa2f9032cc0b4634a73", + "d1af01874f518c5f6834f1fa7db4a5012e7808b26762ca92625f90c3d3b572e", + ], + [ + "3e2ea2a1ac81eecef5052405ae7c19bc3e4f6cb3244760660d3e915608b49b9e", + "807a9451fa4383f03eedd91270395561992393c2183462593d62f92063e1db21", + ], + [ + "4ecc00841343febabc6ffe42ebb182eb81412e6c639f646bca91e697ad47961e", + "115208bfdfbfaae8ac5509437114d4dd00dce0f7b7fb9476dc253884c91d11cb", + ], + [ + "b229f3e5492457ceb6ecde9f1d94e3640570b744654f28253267f1c5186eb086", + "f5df13af68d0045730fd55f5a65ec3ac7aa008a3c1dd32086611f6d15787bfc3", + ], + [ + "ef52321dad0bd70c5eacf5fe0b88d7dd598c61228941e96a40f43ce68bb03530", + "306572b7f7e793fed646cd2d6d0662f34d70bcbdb528bc567120bc4a8ac2fcf6", + ], + [ + "53ada5a97a1e5029b5e508ed15f3ef8bb877e03ec02fe9f80f085e5b11c50706", + "e816f86ea89d76ddf62e8482ab18bef55fbbd3c3c488898b7a763c1b90b4e4a0", + ], + [ + "85c0c7cf4327e2b094b9836a236fa18c3219b0d53b6299c12ae3e45cff326a6", + "a6350c1702151a637c41e8ad33d4a06ec10fb1e1c47957492a1aaaeae3330377", + ], + [ + "5a86cc01d413f0fe7fd99f84561396ef5801b67799fbb0fdce64124afc811780", + "f9bc2377d94b0d0844b5f73e1bec03898d50313870bc8da7c277496d068a51af", + ], + [ + "e9446986fd9d821604375b215f6c0cc23843110a49c57b89e44d9a33bbb47ef9", + "f903a5866ffa4003a2822ecf675bc4ece198b19a8278a8e084ebc938cd26365b", + ], + [ + "931023043f72fe92fd1054ac258027a6189b27bfde419d3f3fcf971b882d803c", + "a2f1633be311b180a3b948f228f9890cc8329b168df378eb4b1d5423496ed69f", + ], + [ + "88dd670c5172f45d6bae9ec2398facc8d190911fca5ccc557608e77a104b3103", + "150679dca5613f2fe243b616b6fba17a0aa5423e1bd30b3923375d72190661b4", + ], + [ + "527a08c04b082351d6cd6a325fa179ded4946e61adf081324633565f510111d6", + "cf326120e5647168c4dfe70190367009dbfc3cf39cdfa8d6bf6b1a1f8cdc3700", + ], + [ + "245ab3c7cd4e321b7038b84306ef3388aebb7ae979906a59644bcaa9e9624378", + "13e7b8776ba8847b1e8f0178ce9c7475b22c8e18d3129492d8bd2a81e25437ed", + ], + [ + "cd8d386e32b3aa0a162713f0132bb8c5c16ab52551c883d611d7774a1b717797", + "58f75aef687bf5b3a815948726a2f75598c3c4770435f31789bf3be25f1d9834", + ], + [ + "7ce9c275dc2b666a75053f1fa95faa65fb17c7bf8b6f98cfae6a1a6377b61c61", + "3ba269f49d6c0543a05cdb852255c66c089c33a50bcc54c89f6f987a7c1c252f", + ], + [ + "2eea1cf7e84e1c25827673166d079224a8d0b95b77aa33acfa844c758b144700", + "516b79ef40ecb3f9baf21d633d78dcf04205b1d8f8ac57f6e357a3a271adbd19", + ], + [ + "77996dfa88cf24f9737f0ee0d04bc7dbf60e90b40d97021918cfa7dde0157688", + "d2e6e79acb50486eb69c7d66a84c01f655ec79a8a802aebea693ea69846359d", + ], + [ + "f81a78fa659881b83929b450d0e20fb331159ef177b5cb2f8dd5390a73efe1c8", + "3cf3311b87e92324f7b8082582b5e41ea974c3b9dde7e1c69cec5ab4a056ff0b", + ], + [ + "c98b85f862e06434659f1df85d3e7e38594e149f3f13d304f3e891f3606c0120", + "84c17b0ba12ac6c604cd7df9730cea23be262653bfe1eebcf50f473b6b7938fc", + ], + [ + "114acd065db23f2548bf6c9dc44d784a77ec0d6cd1aede4818a4286886c8b4bf", + "4037aad1939c87160255f83406ab71d7c976c5520e07748694c0df06388f6197", + ], + [ + "a0ead262a05e05b7c5f4535e8d411f57808fe1cd685f151192a558626b6932e1", + "1ecf8be537c10bfcc081365f8c22528ce1069c8aff66f8a614c4b73d3ea760ff", + ], + [ + "4359f66b328b5673e84e74a34484af029e2bb7d58b8619f97aca360c3831210b", + "a449965d72acf15a2f96dc1edb4514f0dc1760b186c69c7a94c429c24cc606b6", + ], + [ + "ed0d0bc1a56f564429d3d9593a67f1c8cb20f350bf21ebfb650f02020d6a1edc", + "7546fc45e9b435ff72489e70d97bfce095130edbde950fe47487b7e7a30f1ed3", + ], + [ + "20ccc55b4589916dcad49babbdbdb7b11a2a4f5e03eedeb0e712a11d3643d754", + "3001dd2e023d6012bff277868ab76868190b7e5ea23bac0d7fd355a43258c003", + ], + [ + "962be577a12de93517e3af529a7f9f1418ed67edb3689c983f4dfda54a989b0e", + "edf5436756e82f3364020f779110f4b81563a0ccef16f5539c1b917f6f81b43d", + ], + [ + "12fd3aae244511d1aee6e36a4cf66a817c651cf5e593f2049c0b8cc611046357", + "fae87ceff286b67bd0b7165f9e786737aca905159953f2f916fa124e94aa5375", + ], + [ + "2c771366df12382b4db6e0560edabd64dcbe9ac2c797088fab07ec19cfadf737", + "c7ddb28eef6e8f4cb80ce8c77f45c2d0ad8d2429a47d49d4fe62798128148d64", + ], + [ + "1d66f544336bd5d9852483bba3f2b62d19e488f5c7241b5e9f2f7acf40b225ae", + "e7e0747a3935daf8abd8fa0ef92b69c65752d6a4e84e6e9223a8ea7ffb99e601", + ], + [ + "1dba405b7c93788f6fa0d577a9259ef7ced6135ca208cca60af9422859d32feb", + "872ae49affce0eae5b32682eb9ac1a6e00de4159b51b2a6767c57de829c0ab10", + ], + [ + "428bb2679dcf56487eeb9032811b0755a57ba584d6fd7bea2281c9a6b5f53dff", + "acf85ca0b227a9fef2db4a8d3f3f3ff331c8e74a017e08078facf61702fb36e", + ], + [ + "c3678ebba3f877a2368c49c3e4bd97ba7442ed5fb3ea0b01f180363c4894f26", + "71696dbc33ca8b3ce29edc43edb36e398fe33b792ffa873209b564e3654adc03", + ], + [ + "a3712ded20a1278416771efe64e866f2520ad37688032a8b427a18949aa1845c", + "e89ba2bd38e33ff556ad75f15cbf956e979c42a6abbe3f16e706343fc32e7495", + ], + [ + "fdec7765390233ca120387ad52b9eb6a6cb3c0a8e20f774d781b86092a2979e0", + "e69aa72a787e910c8a90cc1c635ce59e735350aa036a98a8c4ee76d6f13c04a9", + ], + [ + "2d28feae6984cd005b7c60b1ed3180fb45c27eb6d019c1e33e19cd756dd29585", + "78ee06658f8b497050f3903d431ef5eed7caa928db6bf72a2cbf95e78fe8824c", + ], + [ + "781d979642494721d8787d16892645cc35a0d45cf851078d24975f9c544d56f4", + "298a5e5551c6a50217c46534fb7b2b42ee651e8c23a52fefb731b1030472fc2", + ], + [ + "88ba24cb187999626dc34bfae6b7723039975f1ee90944aa1f53e81089c565e2", + "2ed64e517c713940ba364fb63699f6f1e36fbc20005a4fe1ff9b53d2547a3357", + ], + [ + "fed990a78ebf44707005daa26956b31ecf2f56075ee1bd02cb663f06273582e2", + "ed4e2ed8bc96ee46b40453770ffbe3a5929a357cf17ab3bb1b6441a157da6fbe", + ], + [ + "58346b480d70e2d3e563a1c1cd8875224bdbfa43959ec23126c565a776b6af63", + "b587d8f6aa132e8045bc61ae69ab49d119db2b79ffbf729a78a208f36b99f82", + ], + [ + "c559f89058bc4305f643c307f9bf895e3cb495ab424ed0f0b4f6aee6079c17f8", + "1e3334e21f2995cbb55a151ecfb2410b6227e9eef1fa31cbf525109695200921", + ], + [ + "e3c834e83833b3143120eb0aa39976f6ec1c648d3b3c22d705b21c61c1b0ca96", + "e2ccb324a98802031f8f1900ea78e4b13244b8ff2dae76abb48a0d1c2369726a", + ], + [ + "90361173f7b9b3f53e2e885d1db670468b0bfae8bd41508800c45ac17200cdc8", + "bf017dcad544c01920e4894fee5e9e51a231a991ef8fa1288d6724664afc3050", + ], + [ + "af3bd22f49abda95fef9bfda631d48f490e755a44bb10d00e46511bfdf5f4778", + "865e8d12b4b97497aa6521217ee89276e5ef25dacc286c23a36fd84fbc6c42d2", + ], + [ + "8fed14cb83c0054b6c67352beb4915412b61bb67f76d734b0740c97d452f9d1d", + "1223f5bc52fd5de8e82e2103196aac8ad2dbab942643cdf79c78592c5a687ad2", + ], + [ + "766b999c1dd26529c6c69b158d82f87bd8edcc380702fed65d2c8055546b457c", + "9396c547742ff3a286fb20c54aa87a83c189b53d851fc5d4081cf7ae3feb8bcf", + ], + [ + "803161cebf9b950267dc739b56bcb9c7041339fdd68b44917fe16b24fbb44024", + "9dc73dee3cfa2ad839433e568d52ede738edebc88f47f69d01d68bc9d7ed027d", + ], + [ + "606e5ba902cf1fb853be0574ac28fd6bffee9872c7d31b62943db25430227ac5", + "90091f9db0978bb82e97f133983fdafc7eb8b57e467122b7bbc70765fcc49e7c", + ], + ], + "wnd": 8, + }, + }, + ], + "n": "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "one": "fffffffeffffffffffffffffffffffff0000000000000000000000010", + "p": "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "red": Mont { + "m": "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", + "minv": "f00000000fffffffdfffffffffffffffffffffffeffffffffffffffffffffffff", + "prime": null, + "r": "100000000000000000000000000000000000000000000000000000000000000000", + "r2": "4fffffffdfffffffffffffffefffffffbffffffff000000000000000300", + "rinv": "fffffffe00000003fffffffd0000000200000001fffffffe000000030000000", + "shift": 260, + }, + "redN": "8648c209fe30feb0c0166ce652e96b789b10543d3fe99319ad169483335f5689", + "threeA": true, + "tinv": "7fffffff7fffffffffffffffffffffff8000000000000000000000008", + "two": "1fffffffdfffffffffffffffffffffffe0000000000000000000000020", + "type": "short", + "zero": "0", + "zeroA": false, + }, + "g": [ + "8905f76b53755c669fb732b7762251075ba95fc4fedb60179e730d418a9143c1", + "571ff18a5885d8552e88688dd21f3258b4ab8e43a19e45cddf25357ce95560a8", + { + "doubles": { + "points": [ + [ + "4d63c80e103b72385ef2f7c2c83f5495882e074effe2e6b808b0b650bc6fb805", + "4edf7b261efe21ff5c4623bb1580e9e3670c318eb0b6587f2f11bd652a23f9b6", + ], + [ + "c3da19630dd962c0e3d423e90f35a1550fbc6d849cba56d486d8ffa696946fc7", + "99d49ebc14d5e53c6ce581ff52305aa0704b7c2589dfca5e673fdb03cfd5d8b3", + ], + [ + "a20ed2a81fb81da328f7ce4795b95801d8b6001b5eeaacf6772b0e5ab4b35a24", + "a2414271b82f4f9160fd2640c2d97fd3ed7ddcc77ff50ad9f685cd44fec01e63", + ], + [ + "564bade87ac6218dfa4efa220284e7ae00e7f9d7d495d9e0f0165fce3779ee34", + "7f7ccb15e94b415a95f55ae3d684b9f4f5725fb671e9adf90e6312ac4708e8e4", + ], + [ + "e6e21359bd012f3093a15cfb9548c9b267e4ea169dc7035a7a8746a584c5e205", + "fef4e6219b962cb03990a6f345efb868af84d0455c241dcdf31cc6a8c8f936e6", + ], + [ + "f5d55f4511824ecbb471996cc81ecb0d7325cfe55c8c7ead9d0c8c4868af75df", + "94ad8a748e2a081ad5335bff94bb4955085c4c4f22038c6be3145411977a0ee8", + ], + [ + "cf9a2f2a9e414ec0a9097d7e1112357206828b5f24302067f99824f20151427a", + "c630fc5362dd09c14fab5bbd2b288e27e0734b6c01efee3dbdac9da279153564", + ], + [ + "953c50eabdf58e8d9d4a7caa785ebc8d0981eab56b372f0202886024147519ad", + "63ebb7f1eb288f2ffd9611022eb64cf72e9626ac4e6c9179d6361ccfd590f8f8", + ], + [ + "c47940a57762de4654a6876387d4d8f8eb7dc7f4d5d1957e27a6dbe305406dd9", + "40deabe2566e4ae502d37f3dac740e325380c565e793682be4d5b5d99b307781", + ], + [ + "5910a01f44c257f8b670dfbdc2b41677158c7e453ca2e87889f6d65533ef2177", + "9f8be4c4b812f580ed92e8d7ca23d8522245250c45e2acef336bf07cf88577d2", + ], + [ + "1682c10b34c008b5e77b21471de57c4a7b3ef5c752b3f638df275455922ac1c3", + "c092172a84e5d3ea1db0903c2a5089db6d1c08587b61c71c76824f04bd55d319", + ], + [ + "e4daa4ce1f115880d418c760c110f0539bacfe31e548e83cc7a64880a750c0f3", + "a444f6646fc6b7c285b2434d722df9446f147bc320531272733e7b55ffc69ff6", + ], + [ + "96e6d0764f144e18555e355723fd0bf426d2cf5ab7939a083f49167ceca9754a", + "3439dd70c302f9fa9d7e772b1b65e15155438158508e4d54768a8dd87880e616", + ], + [ + "b63b80c0c4fed547db595c763d4fc1e5eda799bd9cbd686c7913e91991724f36", + "1f37958fa86967a3628745f11a92ca5737708ba70f1c9646ea0fc697e5fb5166", + ], + [ + "a6b62d93571df20512d4b9324f68b49f888dfe7d7c241c9646f96796424c49b9", + "f96a765ef3dbd166281b3e4d53aa51f666f96322511fae281b4b26d179483cb7", + ], + [ + "f5e69621d1b667f7241cf3a57c62c8b0d5cc16bfa6234994f922fc516a0d2bb2", + "648f9177d6f0f7a14911b37071fdb523d20b44c709561925c15c70bf5a01797f", + ], + [ + "b1d093f3bfeaa84483bfdea85f4bdf0f2e400a02f142fe58af2010f5b343bcf", + "bb7742e5bf663647be92adb438f3a6e943e4c93dba10972ea01b95c70816030", + ], + [ + "4645d0c952da9cbac4ffdc6ed70f8ca5f5efd3ab1042e4f0db2fb5ed005832ae", + "15bfe3a904f49de7d4aa0d2e398a08452c8f0bbce1172059596f58bc9001d1f8", + ], + [ + "2aabc59c6a456703e3295a64e9692850426c4003ea8b6403e22a7b397acf4ec2", + "6908d03f6926367e216a665104152ba9a6168bdba3182edb929714c5f5942bc4", + ], + [ + "64232b85d0393a8f373c4a2e1a110329bc85a9b190fbc7de4050f1cf1c367cab", + "7fbd8ddb16543419baa94afe829348b1604f30124b78ab2f5577eb0167dad297", + ], + [ + "6beb87700f8ea281b1b80c854cfa0b5010ded8d97b39d00e5aa692a87dec0e16", + "2ae98927499e7419a09eea953479fc6a63d0e65308d394950d7f5313476cd0e8", + ], + [ + "cadd1a7f9b46a4f0b4df1ae7f54438afa52fc69b55768cca80d1db6f79588c00", + "9b5b7e0ef6e0c97df047d55382e4e16488e4fa495eaae35b40ea6b31803dd6fc", + ], + [ + "76ddafe49c24dbc852fe8409878218503f7d28bc095a8e7f92dda31be24319a2", + "e4d52a8f5169035bf81a8778438d2d5e43608890f1dbe4280cd54961d7a64eb7", + ], + [ + "589fb9286d5483140493334d5e7b5a4f460057229e54fab4fe7ee31b0e63d348", + "bb0696de2541c4eec904507100446520879094a025649e5aa70f5cc6583553ae", + ], + [ + "9d20f96125c728ef774bfa64ead6dc5e8c515fae7e223ce0f893a5dc8de610b8", + "842e3dac077282d1b2820974c304d4aa2eedb9493f2a7d77a1e0966098583ce0", + ], + [ + "a527e6b8d3a7006d8ae0bf092763f9e1f36e29cb3ba815020d3c982cf7d62d27", + "802786e9113e862798db37d167d726e1f1a520f5c158be5b4a89097581a85e38", + ], + [ + "11cac131502effb2cd86e47a6abd3af203900a72c0bc1f88de2b7bc453cadd69", + "b87d44a3cf751ee733f078f659798850e9f769139e0017e2d550242ec965469f", + ], + [ + "3c0440fd432b57a1dc756a8481732f4e6425194875a1a788ce9b6bfc360e25a8", + "97b3d282568ea397ed14b0edb052be72205910e7135e051c670b3f1d720281f6", + ], + [ + "c8ac9b3e684e125cce26309a20792dbb905f2c7980ab95496892c1f711b0eb9e", + "e568622aad1f3941626fccf1a8e3b3f60121fc15fe3fb24486ad8b6b40a24474", + ], + [ + "da4a7963132e92d002f9a91bd392a51bcc33f8d47c4e7603e0e5c9dd111f8ec7", + "58ffec2c4fe40b80a3a5082694e9e7854febac722e322511a0b0ae30bb1151be", + ], + [ + "d41f01728614554e15fd5c5caddb0a921e46f654ea990cac7f3a8f833f6746cb", + "d59e9577899a39a63dd20fe5a969b7f8055943584dbc204346f4434426ffb589", + ], + [ + "1d587d481d324f5fa96a5d5dd38706391c19ac32fdce86762a8c244bfe209256", + "a11fe133621efbd20f8441e05bab43e2384800763778b65e87673a2a37173eaf", + ], + [ + "44ed736b518152d224986631b82a0e226882c12fb8a9d066a7091c2e48fb8898", + "6a413e95787d78b3b256ebc6119e34da04edac9b4afefdc282f476fd86e27c75", + ], + [ + "c2a36096598e70c648107750926b86d7f33527c7ea50ca0c16c236e846e364f6", + "b4ef350f6cbb0d5c5c3ce7d66831790e0fa07a44db4afcaa6755e52f024e9245", + ], + [ + "20f2beb7472002162e9cf8e66eab95d9ea02f80e0d69a98ef0a3fecfa181e695", + "17a069c2bb2bef2ee3c7b510ff5f6ff12037720f1fa6d5d621c540a1df843618", + ], + [ + "693a1866df4fca1c1291a1fd4c2b6b50541e88d81fdb2580531fe1c63c4962c", + "1ed4e57020f52a7fedc20aac6212c44245f19625a99b8d0b2c4604e0117f203b", + ], + [ + "8d94f6bded3a2c375d426de96bc88ca56f7dd730541d5ccecaff541338d6e434", + "3e19d89e94500d7ff99b0ff95225151d575465a1b1867f26354a3bb2ef8279cf", + ], + [ + "27d09f8690a9ce4d5758e57db757a21c64387481ecf91e732670d2f7189e71f4", + "5cba11237ce5e030e94100917845819aac3acb420732b99846a308f38384a7a9", + ], + [ + "5d70b7651e095f37f3039f060c46124adf2c77cf987ded2488f1185ca8d9d1ae", + "3a7564e11d013289cf3d0b175bac36439d75ea70750d10582d586506260e70ff", + ], + [ + "10ee2532f7c985fe95bfdacce11fcb46f33696f7acd665ed433e50f6d3549cf8", + "485717b627317445b057e74d69fea72f7dfbebda58b357b65450fe17159bb2cd", + ], + [ + "26fc9c4cadaf57d8b301ec4578c3e6e573441c26c7bc863d3b3a13f1402b9d0c", + "3ef07f65725b2768aca2a8a6a8c608fd05d4b3ecaf8145696e71bfd7493cea35", + ], + [ + "b1adfbcc2449324f28d06e97d04e61f9c3a2dee54df0a4b263a2cfb9db3b3818", + "d2ae779c530f173b0ba1e14810ac7abee2be5c696daf7076ec1d9397e053a1bd", + ], + [ + "65ca49bf0a7c13ef2eff79b1cfc91732643672b3a2cd5e5e4ac8b33070d3aab6", + "5986e7c256da4d77e9ebbab3cf9a5308a5b922cd52f13415a8dda59b3efb9983", + ], + [ + "b2969045b265a9e125c2144fd1bf7fa1efd130a6f4c89a7b81d783e979f39254", + "df088ad922c38ab4aa7a54f403563f335c82e3173599d8aed8e9634b9db65b69", + ], + [ + "2dfa557bcc4f0697e158614f1b768d96faadebdb73d68e5949c9976e1337c262", + "c6ca5801140b8c61121353c8d694da124866c619504f5b9ccd6da17be93c6d61", + ], + [ + "8e13092c67609b67f22ca0ae7327afb842c7aa0603203e3f3b7963f4c8303203", + "77989cb63c4023444174474f63316273cc3e83157eca8c173b8fb62757558f1a", + ], + [ + "cfd57c05c8663bb5215d7f7bae371f5834d0ecb4adba2bc511053e453544774f", + "ee4d65bcde9b762cd44a08d07625f623b49fbb485587dc3ded2383dd6901b1d3", + ], + [ + "3f3e034d42ab1a8a406b8e6d9c87c197241afe447b266a56f8410ef4f8b16a8", + "97440f1067adc106097273ad8e197fa83b85f67bbad05f7f0309a804dbec69c", + ], + [ + "99ee566e1f344fa29f63e6315aaf9bdf079ffe0327b91d38303604f692ac542f", + "13889ee7faf8b1aa065118f3c74d9048c883bc6648ce41c8a1d661fd62191997", + ], + [ + "32811a7a8b06350290bc03fcc054de5cf638f557d2cf6ab25914f7881fdad909", + "dd099bebf8990c1801bb9e0a851d26676108a6fb40449742f00b3309bbd11ff0", + ], + [ + "a38783ed1bcf1fea48dca6c47e1bf65a56f46b3ebd057c2f431f462060b5f619", + "a0edc3fb687d732da87314d2d29d1875a7799863e0aeaf67a5d33a9da710718f", + ], + [ + "37dccb37ea7fd429c39e444249bc17e81a3e5d5efa1e1b075d9bc15adf7cccff", + "9fa4f71a9395be3564cfc66283a6c535daa6d97a372904da654873907fba12d", + ], + [ + "e0ace9782e666ef4f6dfaca487c21094482b8314231470e103c46e60ebcf7262", + "cf8daed9f025d8113dfa63aa57f334b1b1e83f1574944d23246a9d31f8d1f420", + ], + [ + "ffdfc7e6c2c0d588326522418c41671d19857dbbe6ddc05a0158eeae457a4773", + "d15002a444526917023bf42723bbfc8341b0869af02c3a83a3a525426ee7cda3", + ], + [ + "61bbb05f379b23f7efe5b1a4843b28e6df864682b1f96aedb567d6ac42bd6d29", + "4d88113363fdc900da06cf895fc8d370686c0cb28e6e39b6caf5f070a6a26b8", + ], + [ + "c41114d00cdf9436fb7262dac0362d1440b386b6327c0a7e3417bc035d0b34a2", + "477abf62ff929706d6cdd201e486c9c09b37a847d543622ba5cef1ad95a0b12", + ], + [ + "6605ecd5f7af643f8abc03d1454e41cf926407cc84fa840c37e2c2e421d3aa42", + "b337ce7e45e1d8c8836edb8040101021edb84f3d16b668e242341a6d6a5eabf5", + ], + [ + "4c9b20d3e4d54bc1bdd0a63176cde206cab71bd10b9407891213462f23f2d925", + "31469c612dd3db947f68e169308643403f8e616a06eedb03cd2d8aa9f2ac02f8", + ], + [ + "8d2fe571bcfd7c049d5bb197073a732a5db84d2fea34c93196860411e84e0e5b", + "8b4a422e30c78996659b65f8374c1108cb20ccc4dff8b5845775f36f3eb82fab", + ], + [ + "585113ba35850ccbbfc02523d8818be0a28ad7664e68c331083e2ea1f095615b", + "33ed1dee909df6bd2c34299552f00cbaddda07b8ab7e3ac7d935f0b30df8aa1c", + ], + [ + "9c02205e752baf4573257dc143ff9510e44a59ad63b89b702b37a952f41deff1", + "51ff946ec1b5b628057b1a21b2208462e6392c31d1502ac46c23069c4b7d692e", + ], + [ + "b8a4cbe8c005c26b6d5ab646863e9563cf11623a32a1f6ef306a3c8ee3c76cb3", + "5e56df6eb307fab30624a267923798dc4afaa5184d4b16fdcd529a59ce6bb278", + ], + [ + "be5ed0e3475c128cf06d66c530cb4f3d8772d34c381060380802dc91ec34f9e7", + "aec44147285bbcab92118c692a1b45ec63d2857c9ff6b4ccb9e3c1931e82b100", + ], + [ + "8910bd3beb38cbec4acd4c2e3ac5664e4f7fee8d4b63266b4e370af3aeac968f", + "890896b1f8314cd40884b7ffd5a5a1b15309569a97b40bf1c3ae50cc9c0726e3", + ], + [ + "881a03cc17042d2af55c345e1275627c4130fb30e58e8f9c52d8d8b6d55d6a4b", + "6a2e588196940b27ce4a2f5d770ea7440d7cf23e2a2c4f100a970a53238d3013", + ], + ], + "step": 4, + }, + "naf": { + "points": [ + [ + "6936a3fd6ff747e46ad77dd87cbbc98b027f849e87d81fbffac3f904eebc1272", + "5f06a2ab587cc06a88208311a2ee98e583e47ac3861fe1ab04c5c1fc983a7ebd", + ], + [ + "9079606490523c7d41cb5aad076c20c90ec6499d4b9537dbe1b8aaec45c61f5c", + "3a076bb9dd1e915c540a9877e7a1f6873c568ef75eb882beb309b4ae7ba4f107", + ], + [ + "3ba5119d3123e03e43eaab50c23bb082bd20213c23c00f70746354ea0173b4f1", + "aedd9164e2408670f933bdc77c941956742f2f17da67bdd2847d0303f5b9d4de", + ], + [ + "5b3081d0c4e16a4cc09c0444c8eb00abe6bfec79a7a84175c96e8f264e20e8e", + "86659cdfd835f9b2b6e019a88b12f1a56af7bedce5d45e31eb7777aa45f33140", + ], + [ + "e7090f1949c9072eff3a4158dac1ab59de407953e7fdfe0ea7d260a6245e4043", + "89300244125b88dac0daa891ead643d250f939e857f61c81a7685612b944e886", + ], + [ + "38477acc395b7594cbcd43f559e98110e356769156fd30dccc425634b2ed7097", + "bc0876ab9e7b7968cd06422bd1f5bc16874838f842ed2e335752b90c00ee17ff", + ], + [ + "2aa0e43ead3da090e337424e481937003cc23ed76e27e4b72bcd8b7bc60055be", + "42170a9079adf444efa6de778a4797d766355422a41b2540b8524f6383c45d2", + ], + [ + "1a35c0b2c7a574df0f139752cfe2dfff17624b5ec0a177b97091dcbd53c5c9dc", + "bd512271274c3cf4f4e247f0d1883bb0575bf30089cb80e227d314693e79987e", + ], + [ + "e545c291897c3fbc8842277752c41ac68363ab935e1a16efea912baa5659ae8f", + "720ee265d12597a95665e9be39508c15806244a0ba977c52d36e9e7dc4c696bf", + ], + [ + "cead9f5a16762fb8d2a506c5a3f3b3074e1b2646783f47d562e4cecc135b208e", + "86d5f289477fa2ba75023e7fac29a41b0fadbfc3bb3c61f29dd4b2e286e5b9c", + ], + [ + "f2cea7cb727bf4230825fa2a358406937c7a7e7fe2e1f6ef4f876532de45068a", + "3d0687c1077666ec8068e1371ac2f71e5fda49ba7299f4a0360a4fb9e4785a98", + ], + [ + "66742ebf5432a2e5395993332f1f3af6fc1b49e5d6b67b0a4a319acd837879f9", + "b948dc3c6f79967a2068859c9b731ee96cc6311d3f439504b8dc9feb49662287", + ], + [ + "f8aa54bbef7c769b9d2c9eb084ffdd7d36a42d71ebf7313042c2af497e2feb49", + "d431068f84bde310d97d10878eb4cbb3bd0c66fbdb7fb589200b7ba09895e702", + ], + [ + "266f95a28603d47b44a70270317b9e2f1be96392d9258805e5db46acb66e132e", + "798142a5a3be21b5a966939777c619f9047244772fb18a398db66735c2088993", + ], + [ + "48dc4f941fc87b3fef5689d3cf7600ddd3cf7e6b73017e6e2f73c696755ff899", + "38ae8923d7b47450aecedfd0c9803fc2d921ca1a8eb6028d9e9fe814ea53299f", + ], + [ + "3ec68692044b10c7c09c4ae65578ab985ceae7c1b68f103871514560f6645343", + "16c4304732f63c44909604f763f15745509d127a847d5ef6ac4832b3a8ec1f1b", + ], + [ + "a640b8702a3e5204b8e4134efc2b4c8742ee463633e76b7fd16847fdec67ef5c", + "ba90162abb47af804e4ab126b237af7313c300c347852d5653a01908ceb6aa92", + ], + [ + "763a387ffa394eba5748baea677d806b636458c5f178d5500467bc58cce08b52", + "8b36143b20088a8a63ebce51558462ce7adda3e1f20d850a12b448a7d3cebb65", + ], + [ + "853e4c4863186abb68f237d16fb36646f5ae714af0b9346a9d89488a059c1425", + "c0bc0e56919240847b864fae14e7b1c2ec4a76681828876e2d87d2363c52f980", + ], + [ + "8100a506b01614f5eca111539ce22716fdfe0b4df072822624d60492ed22e919", + "70bfeecf3884a7ad67732591d57d9ceb6f94d2dd87e9a47b6b0daa2a35c628ff", + ], + [ + "79c85db4db01994a7d9ad900574598180c5bfb4778873fa4ff23ffd248a7d061", + "7795f4fd5b2dda05e91cd3ba5e6a3184d82d052aadce5a8ba41b06261a6966c4", + ], + [ + "94f7d354d8232773b1e8ae057477f580032940ab46c6e181ee426ccd5cd79bfe", + "73acbfefcd9e6b4a72ef6dec7f80c81c5254469272b33a5c747cb96782ba21ad", + ], + [ + "b9699752ba78bfd2b20afec715af2c70a624fa8f6c83906283c7513caa760974", + "bbff86efdddfd2674819d515ded93d49b944e0febaeca13220755ccd921d60e9", + ], + [ + "bdbe608efb7db2b5f4cd0b228766127ffe70483b3dc690921950b421ff6acd3a", + "394077fc247fa357d78f592f7818ed826147d2724645b5a837c92285e1109e8d", + ], + [ + "20ebe0e2c3fa4430a1deb852f4318d4e20bc0b94e5edf3f508cec1c3b3f64c9d", + "731e38472f54c2cc9a5e23d82681c6261f1511b8e1a5f65370b4ea773241ea3d", + ], + [ + "c3a318e106634afb12e8beda8c8acd95f9c3fc3b2f2467997359638546c4d8de", + "ba1da5a33465282c155bcd2dcafe1973db82f6e622113f280167f41c31cb264f", + ], + [ + "cee8449f7b730dcbdeb0e4a46c814c131eea5beb7ef5be6258bbbf9e73056835", + "5e80140114cf3f4a2cf6a6880e518caee759f877e27a6b4eab495c5a0182bde2", + ], + [ + "13298312acf8ccb468212e3fd1eaf381bfeea5707385b293ec832e77acaca28c", + "a44c6c6d0017625f5ab2632c79b7a015748060ce661782ab909f2db2aac9e59d", + ], + [ + "c2bab1bcadd53b78b9727eaa2d17c362100d5d368d063d169d44ed65c46aa8e4", + "624998e6fb7a8ac651f7017ce477f8778afcd30837ebeaa084e90c15426704a", + ], + [ + "94a44a72b8335f9e1cdf6537eceb50a5955662119404f843667eb1a7f4c04cc9", + "d1bc780872bdbf3b6658466da44bba2473c5680eed4350dd7faf819dbeb9b690", + ], + [ + "763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe50", + "876a01d0959b7002bf7c8f91230de0ac98b92ff24e8197707c04d5383e76ba9", + ], + [ + "1628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b20", + "d096ac49f17474fbc90d98cf3e055d633cb76914a659f4666eb62f1b957b4a17", + ], + [ + "8218ad15de96a541c88362a891ea186c16d0c51c48a4ddd86f04d3b51f9c391e", + "d59d7ec8a8f62d8ee3ec728c30a96a005af456916620ae82c735ac12f33af7af", + ], + [ + "9d3ad05948efa2a8856868891e9ae0987986a53f61bfe259e5da11cc5e793474", + "d37b1fab46fbecbc126ac553a8dd1269bea0d0ec655d14f987b0687f4eb5cf66", + ], + [ + "d421b5e1a210364294aa89b40750d0149c7cb942c05804bf19f382e92aa7864d", + "74cc7b2e3786790c1f947e696cd0572030a119f8d4af1ec56cd001e39df36725", + ], + [ + "2dacdf71ef82fcdc94922ef17e29b1a2b34a7db596fb852ae8f8fe1eeb03d1ab", + "3972552daf82877e66d92525e82d5b3b871ba632405ca09db8dcc81f42911eec", + ], + [ + "22f8fbf442fd1f65123716223af72e0cfa8ca0d8a7aa6ab616d2c02fb760095a", + "4a1bde1f0c2302dc79807a770456a7e7be19f0dcd4437a85072758b78f3d0402", + ], + [ + "b15e4970d5baeb0cc30c6422b2f9c49719a87bd8a0ec9ce0a2193bfc266f85cd", + "54dc9d615105f9dab4f0c7877eb94ea4788522aae9fdbb283c3139be0d373218", + ], + [ + "ed556ab389327fc08f6428165f89e14dd306e29b5176f8ba40206d330ff0e925", + "75df5ecc91a421f207370c450128375097a54fee9227b16c2b1870af8321bb8b", + ], + [ + "beeb1bcbff18d2d097c711165c6e4c8e9d0af322ba3183d3a5d81fc63d5e79e", + "acf441a585bc1455bdbfdb9cf290d1fa02dbc41ffe5b29dfe657f130801937b7", + ], + [ + "f3086e93a243ca4387abebf2ab80485125d47142c67199a2c9ee62dc3363a22c", + "7f00132d7b64be47536a39db19c61265e9b1611c625aad75c52b051c64e09dd9", + ], + [ + "bfc845855e11efe96bf2f65ea65641aef617dff85af76773646b0dd7e1ee314a", + "59751e2f1cbaebeab0066ae1f282369ce91ee26f142811b998dfac18f1192b61", + ], + [ + "bd0204380826ca9e41252997f6b0670b856664a0d4b409b516329ff7b4d8b2c2", + "f49082675cff15708f439ab06e58e3ecd07bc342235d56c010e522661ddbcb1a", + ], + [ + "d88aca7f765b8048ea123446310eb5a62d51e294d54487dc1ee6264a7eabe67b", + "150f87ee211e4450ab49dd209f98f9a640388f7cb9fffefb7b284be14fb691a7", + ], + [ + "211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f8650", + "a70abf79c554ed3ba8a5b9b0b46a59f2354719f2237fc68d587138c63c92f694", + ], + [ + "581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d290", + "35ac466d54ffbb3bf6c1a78f9a2852f20b021c39f219dc582290e253d61f6d24", + ], + [ + "6a8f9ff1974291f2a127f2bcaa12d0d6684ad75bb346fd2263e039bb308cc407", + "f293fda5cd6f439be1b1cb5344455a165499c98dc5dbba0c802049b68aa19e43", + ], + [ + "1ae5381478181c6fe848e1d2566805eda8cdb77497e43f4dc90323bafceb64df", + "fbd470f63cf3e6974577f1f3260b76785f4d9c44b68b7e72dc7b8e69c70c77c1", + ], + [ + "c438ae254e65b06b50522fd4a9a3b17b1f1abb5ba7b43712d037bf83f9432b4b", + "a673fe094fcd659c3a3c2c7b98ff4b37ab58a3f35503e4631b57ea284693c044", + ], + [ + "9b1c239f4da499d8a610374c569a602bbe914d2d99cd026b7a96e0a4ea6fdf7e", + "4ce9e0b6ba8bfc6ca8a14644be7779373125181df21687cb5f6f0feadc19a999", + ], + [ + "51ec8733c3c386e67670e41bf619241d0a875e829f7f72c564bdda6c71f8d02f", + "429b1f8be1d3ed896fae60930a4f9245df79360186166f300aec19ee8bf7d171", + ], + [ + "80d5abfc5e03a86608ec1602b1d28fdcb11125ba2a9ba44de6ddcb77b3713906", + "3d6d112be9e512e7e346db071cbfc97c87057c96bce7fe5d5ec7bbbf5327839d", + ], + [ + "e206024cfce1a6f48f9cdebe9f6e8773571e4d0792ce3342ca0ba9c3796f4c7e", + "cd7e9424ea700c12008039e02de2ff12754e4254a7f687cb2159e08b76369dcc", + ], + [ + "720b2478548de20b7b092174df861f4fd4f61e461ae8d13aec63acbdd10edd03", + "fdaee396cab12c6bcd622baeb879899e7229d8906cd660daf419847ebf3df785", + ], + [ + "cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa80", + "9af0ace804d4730370adcc57148b1351cc0d4cdb23afa674b9c5438a67e2173f", + ], + [ + "34e0d07fa2b0d3a5c3a5ecb983538693289e86da0ec0d40a125e6c1b7ebcb887", + "1d8209da9f3a53d713cca90747f19ecfa6bcdb1186076b9e0d92e9a519333606", + ], + [ + "c3ff66248ecca6e1a2627c4851b5bc7f15b920f38dfce56ad19e039119f6cab7", + "95dd9d9689821b1fc8df855fe2f493756b76c56daa43b27b9dd2bf2d5f5b5bfe", + ], + [ + "bdbec7e29af29b0c890e8d54796883355a3bb1a29699e9208e4c4901b620dc4b", + "cdf7f856480ffe37dc33392fa67285c50cf6d118d91a35092750de73e51e1bc2", + ], + [ + "ed0b988757b7f55cbe22ba0f3a49fb4062afb7bbe314dde87af199e6cc473056", + "edf1015ee6ee702e7e814380f67b51417d29c63977b74978162cf502d653fd9f", + ], + [ + "1a8d419d77f10e047d2bf4f683b30d1d71602d4d0e5fe2014d7251a8c03e3f4e", + "e839cd8ae99505c0af4d4e193394872ff3184843a0a4996a4941a1e76a0ead7a", + ], + [ + "d7ca4d911e35486f783d1b6917e47255a71497178a5ea8c62ea859803b58b022", + "eb9041d09e788c4b870726c16e3e02ada04cc88ee17ff543f69b4d49b4d4324a", + ], + [ + "9fe23975b85b9ca64b76d2d1ed32559f72dab6c825733faaab54cfc93740130a", + "16d6af973febbc0a1dc5fac145ff0d52292393aa79f3ce2128b0d24bf2219f0b", + ], + [ + "5fe6a86a04a36cf5072a061ae619f2870e9016ccddfd92836e84bb6dee35b411", + "67592241be3c14b60a8879244f403f2fd1c4a969ad602d09ab6968bf60059657", + ], + [ + "44267faf7607090bdd5757b4774e5e2057dee05bfffbbfe45d8fadf89a6b23cb", + "326800b0561e5163e07a886ce2b1765b29bea9344097eacd254ac6fac739807a", + ], + [ + "79a858f5e2051145451e48e5c9a5a00d7af3ac73ef60c4144359ac0ee9316378", + "838260f2e5ea445c4f7b9d729fc39934d7bea67994a5062d32345065cfd0b21e", + ], + [ + "f6bcbca58d1258f333f2018e0c682b4bb397e437873506e97484c32e4d4b063f", + "1f96ddfc4b09a832a33b10eea5066615c523068fcb4b61497f470fd2357e496c", + ], + [ + "2cf34ebf3294d4053e0c36555031caa153be80ccab41bf59e57d734c45e97965", + "cb5d3be3a66340379ffe1c87f4b0fa6aaf70367c6e40faa17832c7dff583ebfa", + ], + [ + "e9cba4e4a2cce029cc11d879e158e9020a22a7fc165f53ab7fecb5e72d4ed339", + "4e52943b8c0dbe7352b4d839cea765fbc42febcc0bd77a81bbe8b81a018c44b6", + ], + [ + "9107ec9ff43caa9c60e95ac66e9882a856402502edd29cd123cd8a509b785f9f", + "4310217b33d10170a804b08f470ceec3afdd0f11ceb4b358f48fbb98b6601df0", + ], + [ + "3608e5ee5e86af288a557005a470317039c1b74f154a104e7319a1604954b44d", + "abf07caf2c90eac8ad29e49646bfa2392f3bdeb1887e5eb865b9c5b5925d28d1", + ], + [ + "838f777f417b0f3bb482bb8863b12d538cc5a15e867812f3f21dacbfeee0d224", + "c091680fff653a74ed128b6c8164faafed78397be3636a5d0a0163f5403b490b", + ], + [ + "a5dc1a0e219af09a448d7bdac761ea1bb41a9b457edeaf099af5cfefe873080c", + "2de55f8bb32112cb09ffd7cae9a00194186f17a951252d87508b4d10ba7df535", + ], + [ + "c3023743bb6f78181a4d820a3d14ecc875cf0f47893ec5bcab32d59bb31fe40c", + "d5c659338588f2a33f2483c9d371c05207de89e1a75c2a6f40f9faa82e132767", + ], + [ + "d6905d56096551d43b83bd7159b6e9fefc278a4db8ad0a0bfad3818b7c5ae8a0", + "62cfc407c7e0d779893d4a8ef04ad9280f4ad4aceada798f73cab34323069efa", + ], + [ + "db84b08deab769a892717d7b43d01f66fc8292b00267f2802b8ab7500d220610", + "13ef0e889e8ecd2fc3e759e1e3a8b1e8498b312caed21867bce6e253341e3244", + ], + [ + "eac1e2653fe435e09140c37d2cc8869e3cec6004d52c62f45922aede1b0d9f5d", + "1f815633409735b2c65b6cf8725993514bfd6e706eac893a7f219a5d5065970f", + ], + [ + "fe3ed11afa78891c88a5ac5357f517d58e56c30931b83b7a8d342dee31ab2199", + "4598b74c335dc57c3535f43a2ed141bb200d300896ea7b67ce350b93a299f465", + ], + [ + "790d90ae29b5a099f850164cbe3f98103e53ec1689e4964a5cf2f53fae06ebc3", + "71176511a964c799d6285a1e4812729a7614b526fab2ec6fbdfba2c032f07517", + ], + [ + "902d5cc2c25882cafdd5f8a955ce45844aed8c445b860e07370cdcfeb6f06d6c", + "f54e3fdd9e8dce6dcfe87d283b3f2495e025cd84b44ff84a8a4ec69cfe28f37e", + ], + [ + "5f8a63949cdc5ebde4d655a15c4e26843064b46a031ec7dde2e3b75e4a7de454", + "3a4fb3a228766b569ff7c51c64e6eaff3f67cf94a6a27c2f66f0c9cc2fa2cb91", + ], + [ + "d8a890854bd470cecbe139277f1b401d4a7dad3b1d0a8ce7c112439562ba9528", + "734a68e5fd22f287f872eadbaf2a7a43fb96a11834a72658224fa8f727866ce2", + ], + [ + "efa9e0f5d2793f66963d4f38f067d12a5403f8b4c9cef95e91bab76bcc86ad25", + "5d026e4345dc30fd6c0ad805776542fb15bd9e01affc45386b23ba8a76e5e252", + ], + [ + "aefff396bd77d0e880012da1bc27c04c3c9dfb265ae272b25d4d5b50752e7c6c", + "ef2c4920e92271d83e62404489dca02da28f68fabd5f9b995294ff5bf975acb9", + ], + [ + "ccf314e35a3ed0cfcbf3bea9ff7a05729cac5da54af5d694c642278cde85d863", + "d3a956674f3d2a0beff5a871a2de65bd3920214cf0a60e74a2cdbc7483911e29", + ], + [ + "93394d39948e690d99c4406fd357099eb62ec3f600a4b6b4a2e77a8f43dddcb2", + "c0d43037e46561b3c98d5943ed6bbd2a5b23d70692b02f9ba27dd7466f61b38e", + ], + [ + "b5eb3a4d78085c7b90dc481cc2969771b767268b157eb61e4e632a472f863625", + "71b327f25320dd4697ce7b79ebdac8729c5fb6f523a1e1c4562fda0ea981b91e", + ], + [ + "7e3af404cad404876be9e05ee43bdaee94ec19a2801db99029fc41ca24b5f7fe", + "95f8616620b6d8eb1bb4adfb4fbd595185ec506b5886469bb294c1967ad20aae", + ], + [ + "782c9527388645288d5c495bd650082b131b783802067f87f3b4dab9f6527ef6", + "d9083fbaf4ceb380984d4d2e0115e0450f8b874ded2c23f20645c0bbe9cd7813", + ], + [ + "e6471befe06abab386131c757c17902235b7e70f54fc52fcda0b99e816307d26", + "4409b44b11f94bb3b3e520d4e95a091f98adc48b03cdb8354ed8cb5c3a40c180", + ], + [ + "f1cc8ec50125e3b6ac0566f68e8eebf3801438b96668d24451eb127f00de2e0d", + "4063f4fcba783c75b06d77b13bf412b820b57b862de2f0a097156c43df7d0404", + ], + [ + "b071efbe60caed27f2283310f9d10a32d1ae5bc41ca01511abca512c00a3ec5a", + "3eee05ed6bc72b69bfcbdd786227be678b388a5d5b9fc549aa897239c20d6899", + ], + [ + "ae7db982d4f0a659cf820598c7af3049b94110955a405a9d5adf6deffd64de6", + "2094381461872fc63829e08c1060c6b92862f92b4d00ae40d0dcb43c7fdece00", + ], + [ + "debe929e4b66f572efab6a0eb1108c009529f15dacef129cbd7accf35fab9ee1", + "c4b92fc6d6afb9303ef606f45cac02fb5b95f16e8f15b7ee22771d982228ed78", + ], + [ + "c6e769600a990e69ae044e1e2093c6026761e7c2a9b0027451421f22aaf72bf5", + "462aeb6eeaa4adfa0f25af16c4d82a637f44fba28fc836abfd9b953ba0c0a274", + ], + [ + "ca934a2d3495d0f66bbb23c02196ebdb5a45e0190abfb921db2583523bf16c5b", + "f476019b88519372c0a6b7162ed0ef6143518b25d419bcc94a3973b97a7a75cd", + ], + [ + "4d7fbc0359a2e5284f2eb8ccf1a7dc0cd8ce2b3ba2cd72713832c69662e97daf", + "fb516b9b34a973f26c734b24cd190e44fc9ce29147b868822753cbb1381e6a44", + ], + [ + "466ea7325cc7b232bb7eb63585137d776498eff02f03468a513cb983b07bd140", + "ed16392501cbaabb60ac38e3e74a6fcbc49f32cf1571614e01d9523ec7c62995", + ], + [ + "b48fe9f6fd3c9eec88dc130660d979a240b3b3a385fa633e5ca2589f9ff5a7a4", + "c90e8859b8957724b6b8bad35b878a2ac9b2629e2fa0c9df0ab66cf0f9862254", + ], + [ + "466514a7a9d03b7c1abf76113ffe5ec1c3b6728324f29cc250f01c4204328158", + "9282b4909dd9c6eccf2d7dae6f143b3acf49f67338a2ffa7c35fa68fb0cbd9f0", + ], + [ + "5cdf52fa3b8b82e89d77d795f87004b60e10c8597d73937350be567c85ab647f", + "5a4de7c2b4b88b436c5054585ca177e41387d8f81a840d2654ad701064cbbbd7", + ], + [ + "cdf63c541eaea53866acb6e14b47dd9bcb17624f2d249f03a56282911b747ebe", + "8e417c93f2d5fcd8570f6614da11b209de92e9bd6f1a07238ab47f80659f5195", + ], + [ + "729037f4bc7d5fb3a7d668925e5cb185d1289b7b40b2b70a479d917eb6f2dba3", + "ae7aede59916a46e5693ac79c08449158b57076acaa7875fd8c5d2d8cc97b6d", + ], + [ + "b65d579609241f97e25aac1f44653c5e39533bb0ddd1e847dfbb6c0a6df520e4", + "d0fa4c6749a18395989b17423ead44d2674b77dfbbda12aedb34f5f8648ad7ab", + ], + [ + "48ceda741571fade05c516ee9250d943861ac23d58c8d98716d2c381ac9656d9", + "7bcaf9dcd71912aaba6730f4cd7f66afbc80efba81089b54fc7b2b0db5ee1098", + ], + [ + "a80bf3d0eda0ecfe84ecd021bbe5f094ef507bada5303f6cdd121a7a4da0512d", + "7cc3bd65dd117df210e4295c3de245aaca6374f4f15bf97e834cf7977207aeff", + ], + [ + "5ef1ce3c04a93733288d3500f5fae25a094af089e29c51b687cc90c9ebec0d78", + "b6eccb055419d489ce84b2f9541e5e17886a320366fcbfca4b6ee055e671536d", + ], + [ + "bdfc8c2a9c758132ab45d6008b33f849a98ad7458be85a6928b83f56a7928e34", + "958e9f764a8e2d660cd76f5261f4a1452d969877b58cf4ec25dda94fe42b52b3", + ], + [ + "882444fa746eb36d6a11da19e8b432df1d84a3a86fa266af87bc5ad5f28c7814", + "796e9656678b223c0ce37547cd166bb55d9db9d5a9f97f5bf07c383c7010fbe", + ], + [ + "1dcc27c4a32ab23336fed139a84560699854dcca0125229bc572366625fcdcf3", + "b4c852aee55f47793fa58b2c59733738cf9f548f7f2db89c1bb6b28d0c74d67c", + ], + [ + "3df276679157683a7dfef4891905168c6455359ceec934ff9f5d6235e0833b47", + "93d2fb9e1e5c93681c4006a8a37b4f552b52cdcf508f08d17a22c379e58cc1f6", + ], + [ + "2acba700d78c82100edd1eab6bb6fdb52b72e91fcbaa1d870ad14e478a414b21", + "fde2be6ecee9be87a8463f594b6104ac423d4207dee8c5e8fdb75e81458fa142", + ], + [ + "d0b9db0bdd54a9332b0ecee615717a3314ab8b1f0a558ccd342772ba208937e8", + "7efbe614f1f485d19e3b6e4ec4ec6d833c8931bf8a1afe715209b1771a6db886", + ], + [ + "11754aa57586d353b78aec2ba5ff74a132386a3ae5b1f5b28f1c5850749f50f7", + "1a7ab0ae4c09ce75207c33a2d8da7345bf37c090346333dc2385603c92d5178f", + ], + [ + "44754a6815579f571392ad87a1b381b026d81bde30f0a99c481bb9a9c7c0b4ad", + "8964c0179d0dca2cb4efe824d66bcec6add44776bc8d5b4b02e68377d8f660a7", + ], + [ + "2ffff6d3750eb1bbfc47aa11e9ac3f7e4c19c524c99037bd14a7d4ed85221e57", + "4c20577c4dd37c57675dc40e5be466a70a430a674ce051885e5c154b5acf60e0", + ], + [ + "2850571f7320cd7c61f9607ec4da1ca7944fb907cb01791cf4bc889e301ad05", + "c37f4402beeef81caf71a68c220710fc5455e14d924620b5f28f104d2915739c", + ], + [ + "2a5dd6ccd0a0e81828ff62755e0a04326f6677500b1f6a62c19d407951c9dae6", + "163484cfb773ed5599acd6994d9dff5a66dadf910eea589a7410810a33f4118b", + ], + [ + "6e06bc3e7c491657f0f9eaa420c372cdad48693e800400db3626b376a14abf26", + "4d831e2867af8bfd2c3ea7530406b65c70afa058d88bdc6a8ec8d58d43ace093", + ], + [ + "3c82201a7c993739fc8f84507d345f7a8a30826cbfb1c75ddffb87cd2ea70b4a", + "3f58817306733cf86b05b93165ed5ca3fa73346f93120de3861a478e52c633c", + ], + [ + "b5281c2ba403956e02ad857b33face5239ac55426f45aa057ab12a3984e3fdc8", + "eeec087c83d0a1fc623fbb15ad7d1cb6da18f72cdc9bc0594e5c07608eae36a4", + ], + [ + "bf9a33535dd4fa5c1b721c8aad80c7f66e222f6d02e658089563b16e5eb7376c", + "f04660901baf8ca31fea41d1cdf54283d98f8ad9cb46440868c6a6448415259a", + ], + [ + "228e388d34880b176b2acc791b00b68a50cf163575f7cdf8b1ca80abfaaa2377", + "726f0537a0a053a813b2f6eeddc89686dd44e82e2f8e1b1587ab652445c587ef", + ], + [ + "2a5e7e0f736943d1ed6b9d1d8e3318247cba79fc6d3b2cb6eec90dd7ac2b219", + "1ec12d1d708601cc1890f6dc48529723420a8a084ad8871d880838d4192bf29", + ], + [ + "ff8852e0794f94517355bf343f4f949947de6d18a4aa0a73574daa9aafa4264", + "181a69ff2ef44fd33578393e08b005393b55bbcabb763fe04a7835ef6b226dc7", + ], + [ + "d7f42391b54e94ff9a73fb5c90926c8159930c63157fc8153c55500d5a120039", + "b585aed8f4b006a94ddbc782b9cce10323da0a851d5a1a137c3e7616d95d5092", + ], + [ + "b4941424324b82295a3f3a483a17e4a37772bd49cb5a5be97dc759973ee3a46f", + "26679012b32e3fd97b308e923c80c397d10aabbc8ca9ca5672a65542cf3d3d96", + ], + [ + "aab7f885a0da5f925100ef697e0fa4003a1b36cf8c557c1e111f348c06526e35", + "7b5e685c7df49ae10acdfc5134422d58d834fafa2309bef08f5bab01dea81ebb", + ], + [ + "956c539c1fcf417c065bc7dc41d5df32413095d83381e172be805298b669f5c4", + "925131c0a9b9db53ceefe86f023fd6045bbb9b7506205b28c0bbb286a8d8ade8", + ], + [ + "fd040961b88e7200e0cf46d46fac51954b21383c54221436a627dddb07d1121c", + "ca274a9bf179df93bd797cef614f744a840edb47a210d38057de43c8f5c5358e", + ], + [ + "53c79177d3b8d45797b8523564aa4e790e8cad79197b71fbff5fe52f84091ed4", + "441ee53b17ee62477458629ca251b9ecfc46a577a597b57bfd43b90fbfdf6212", + ], + [ + "cca0dd3e7c7ef94c4c45b9211e6234f263f030e5e843bfc667027d0343d4e8fc", + "7c7f160632d1d7edb0b101bac8c8c53be8b495d9eb2f6029ddeead776f095148", + ], + [ + "29ed75ebcd9f70a14258a8124e35c368d4391b5b7218941d1c91f1c120dce7d6", + "a7804a86ee39b10f2f29fc6c18dde73aba5edbd28532ea5f03c6819bf8ca726f", + ], + [ + "b3b75f584b324b225ddbf091b0ea79588eb9b02507d92f43c51b9caa763b25b8", + "cb5b8c0be5431a3a277c8501b8a9c3d28d1c54cd5a9fc16bd41110447d614cf1", + ], + [ + "7aecb4f00176fc81fdcd7753902e0feafdbfe9bf7723bee1260cb930f070a59a", + "a27e53802455462812f85101a5003e2bfb0f9433ece1c1534b9a600823375e6c", + ], + [ + "112edff9abbb4b58c61460041df09d88dd6117b67b9eef5b523048577e0d21f2", + "22eafd3db8c1e4fd59e5c3ef6d0c516381a068193c6c67e457faa3766dace753", + ], + [ + "7abab5b048dcd71f4f371a290cd4da8b606b5a2f283bb5464936cef01950ca41", + "48a3cc6668828316619ae5ef449bf0981cefb8c96da794523f2f36ba752bcb4a", + ], + [ + "32987a5739a5f73bdb4d57f6e746650d7ddc4dbd7e99bef3d058ae32625a68ea", + "41bd2f0902afe63a9716896e532ef82645c434d2c31d0047fd19d729bc4c404", + ], + [ + "5cbf3f8fb41cbca8e67df1dab618489525482e679e515c076991a74be462c16e", + "7958efd63180913370dc394aaa681b16b152001f436d1b165999e5a103329422", + ], + [ + "1c4f772f55d0b0b71d84d2fabc18a7b834d36fc4c18c090b69d5f55cf8821206", + "fda67f40cdf8a8ef15b07f796cea6221a159c3ac41ebdc97412b01ccf43e2317", + ], + [ + "1b06e398fc1c6ff9d51bfbf284a754f75be7b7ab97a56bc2df216f3d41e53a9f", + "a56523ead65568d7a0536fc122e2d304c02e084dd050290dd8df02d92087b877", + ], + [ + "9fff4fb8198076ed4a27ce7b49ece2a1b0e700beece331931bdebb2c57c402d5", + "413675f157b97748b9f62359a9c90d6970299098b9c4c64d55b028978b7dba6a", + ], + [ + "3cac5ce5c05c7261ed6beb6e2d937d37eb81fe30aeb17d64e81e867b9af7ffc5", + "fd686e4d34b1ed6b11afabe06dda1ed1f9d79c550224531cc18782ce53c2bb33", + ], + [ + "bcbef5fed80f73ba72e470b94bf0e09b4835d45f2296d3e84a6a3d0d6b4fe238", + "40b4d8f03028f54cc88f792bff4f908b155a2ba4a75a985d994b92a8296a8383", + ], + [ + "90e4e50182a5d0f87053928e4349b71db6179d49f92513b41531477b0f9f08a7", + "567036f3f0c5766db2b82a4174e01d3b35f49249c1c3afb30adde2a5de1c9ef6", + ], + [ + "1cf3298b4935a253fa1dad937780396e733db859b74078de99b78b7a9e048235", + "ab53206221af31b11a380d3e0e825ccd569903d8348116846988f609e4e61946", + ], + [ + "ce309b8b24ed6d2539931aadbf08abb698f8bdd01a54ad83a7150c44e939a62f", + "48a7f71125296c28ca3ba644c277b6c64ff18bed0b97d8299ec09791ef6564e", + ], + [ + "87a70ae066b1e7766fceba2c647cfa89ace118ab86ae1122b193ac85d0cd878a", + "4fb290de7f3e1983463fa56afafb9650f321d886d016b477ed69d37f0aeaf5e", + ], + [ + "722d6df1356b47693439d4391e6e15be038f51c35e43bf384d753bd9995ffcba", + "f53b4dc97fcfd3fa96a0cc605adafda593cf9a204d74f34727a4fa8a09e0ca4c", + ], + [ + "2e70717d39a8b7597d5a84a4af0e31ecdb96f5038d5f76da521291496bd45b44", + "7c8d4e4a8197f6ce50037a07d50e4d4405ebe3b1a9a650469137c7279782ef7d", + ], + [ + "ef65fa2a9411a010d7d9084e7f393a986ecc1f6a5fd3cec6209475fde097b9f8", + "355cff9b9c6df0f206f8e0a158d3dc095f02495f52463288f746ab9425fe3000", + ], + [ + "574e7392da2877a79b4cdd8de8b4af24a7438edfa3ed4380ebee9529d19cbb0d", + "ffcbef26e34eb670ac9f24576ffaefdb377f34c2b0a2ac03cb838ae741081539", + ], + [ + "2f373d93f91d307e2984b04b7fe14e0785ebb70377e1bc2faf2c8c8dff4e4dc0", + "16273c32b347066eee8a617653a2363adf364861756bc7e04744cb9f5ca09850", + ], + [ + "77ecb20010909247c8832ce8a6317a175b41106a4949495f047c1cae8d79c5a8", + "7335d7e635eb5b042dfcc3782757770867c4b1d7c77c3cedfbbbce5cc0ae8c8b", + ], + [ + "1747e44afe684538c5b2f9268cc21052584f7a392f50da5d5c4e870d4db628e9", + "4de3445d1cc1350a9d8a6fa701593d1a6567334a1bf4df989cbbe459ebe0fbb3", + ], + [ + "4a29ad2c04497d01ff9c2e51103c239ab48c67726eb9c2e331e9a1399721da1d", + "8983a5812bd036829615651b4036e27ec1243e426a81da469058e8cebdb093ab", + ], + [ + "356fdaad83d41cd5ff03aca2229d6fb1d190b8cfa574c267373d43feea92463a", + "acd689f6efd4946aa801b4fda580a7232e67353666211dc1858bcf4e399bbc0a", + ], + [ + "6e09a101dc78cb4203c61dad3ed9406c939f775af42ec44d4389299f7674569f", + "1d87b1955df44710fa886efb5d78a5080d333350ad06d5e545ccb80688fdeedd", + ], + [ + "fd38823cbe64fc2682062ef7cd5a1a0a029d697144cd0bb5b372794f8d97a216", + "24cf175047adb90e33d8d7b286d1d455ea182321ea1fb4ae3dc61a57242fe934", + ], + [ + "60b775dc4ee86b77d38807d693a5443d732134893390176d333d7bf47cdc6d77", + "93c47c61aa0e7870e63f31e4ef8bd76bdd4b101e7bf9741eba9ab6fa0fe96842", + ], + [ + "b40a6ee9856a28ec0a8209ab723a7e4fc4e6b0648b4a01634ce32e936836a3d0", + "fac790b5a621fef9ccce05dfd2207075072cadb4123cfe0adb8ad9684f2df645", + ], + [ + "994ec07d5b5f5bef7951ac80b0159081bad041a8adf6f496189867b4dc3dd5e2", + "981c9a0f363dc171ac7eb5b048b9a97b0c7f4fe8c2a62b9f721e522a0c219817", + ], + [ + "5480b7bad4c4b395afae8330cc708ce5061d6d141efd7647a2a0aef8b9ef3b0f", + "28763af8ba113d69faf112857f08041549c30db5e50ea22e197b71469a18260b", + ], + [ + "f4c1342fcf15c0667cf6d7a730531076a9273aa241513b1a94b2a0d1d5c6ebdd", + "52ebdaa64ba9aa53ec58c3333835ca6fd2e3b915a87e9e9760343e74b51c2fae", + ], + [ + "548c0bf2f5fc58fe4fc985566c27eb6084d81d2195b6e467529b36903e6f237", + "c2f61888686c943370ea9aac4d06fb56ef815c825705d970f960f0bd316017f", + ], + [ + "f6459fac1a61e6d0b855f503132929451cf0cb9edfd80639c8c77e58e11a6b6e", + "986a39b90cf6aa465232d3de968a40f171741fef1585724d7639869b284db18a", + ], + [ + "6c8a00a852cb8143d9231927565fae50c603529c252bcee0b5d0aa1b0c3a6a44", + "58ce144ea47aa385798c61800ff9f715aa88ac4237674ed1cbc6cd270a7b1df5", + ], + [ + "8f6631784ec5e9c83df2460e35fdc368cf428c1d3b9cb1871d340fe1ca582c25", + "9c94358ada87d279080f99e8a905165499bb8a23e57a1e0dbb6141f6494e3efa", + ], + [ + "42f9a49a42aa274bd2f4e0d6d66dcd9b65b347240480be7d8e49ad381bea9313", + "c1c0d5627a07ad66912e4a50eb3aab494a77298f7dc92c634404741d65121ccb", + ], + [ + "d6d30a5ea29da273117c47f49efbdba91f17eb17ce376eeef3905f97866a372f", + "c0a811e6f4044e25ccac5f80c0d907c39b6092e24fd110e239838e078694bc21", + ], + [ + "bd1c2de94a9374a6878c19a3cd80d08095ded1dc9da3ba2832b7b3715c8c9c80", + "de66d10eb6461e5281ecdae2926c600b93451c2663dae2393a31be272c73c52a", + ], + [ + "efae94cb8978033345804878274261d47d170d586f43caf19cb790f6e3bd857c", + "84b6248ddf8e5334b396d4ece230e1042164f68166e6d9af768a0667876179ea", + ], + [ + "4315bb8f8a20e5d5ed2119f8ad3f050412f7211ed8d236db9945d32b84f9ca19", + "ea8db502fa18ad151fef44f09c990407f33331cacbd39acffc4d53e3bfd88da", + ], + [ + "6aa4f90bb3e5ad19c366c71d48b6e4c9339f405f136ed47bc47f99839537485", + "e70cd6a5074bcb248f4a573d2d7622112ff9d85f1e375c821da09d92fd6cba96", + ], + [ + "f0036797381c0e04b07edcf23e8acf1e9a96b07ef7a4ff98f5fbe31ca70481fa", + "93824446d63c286351b58b5da00205d69681991d87919eaf3bf1cb8a621dcfae", + ], + [ + "7a0f8b3a6ba88d833ba55d6bc20365681e05ccd775b86bb77d48b3c9c89f5918", + "dc8702ca3d0699e1c24bcd6bfe18e5f1388e64ff17362874aa1f46ef8208e67", + ], + [ + "5ae4ae38713b8a8f7c463e1adea5e22b58fa5c842ae0ca22f411fb8397f46869", + "806d407d3d722d5444129d9b13894d6be2387d821e1da7491725b2cec99a575c", + ], + [ + "2d608c17576d9bdb224d81bd7cbc817f32d9f5d80c404ea2b8b06ac17b7a5c8d", + "e115578fdbc7d7c849805db41610201b88e701ce36ca1fc0cf635847202aad14", + ], + [ + "2d3242a87c0983a1f4841d536bd37a6e506d28bedf98248e5a28270403aa3678", + "d5c333490d053031b7df96482ba958692d8a389133256455380dd8bad660fc05", + ], + [ + "e2f1058b4ae91537e8b89b57cb31b574e05178d59b0e9a4f3d117f6838a6891c", + "604b72ed0ffbf93aa46abd0942d0af6a202a56a4d09925a8f8f8a87f74aba596", + ], + [ + "7424a95e24340f9f2cc2c24923c26755ec6c6ee6834eeb24671c97bd42f88df6", + "9a13337362d65ced5addce9c2ec3802768323c261dbda9f76b9fd506ac0ba9a7", + ], + [ + "35d059f5178f221a82e53f468b5665255c66a2aa3f93e8c0f9e2c1b0e14e5e76", + "6d166afc7b54e92a979c366f23ee6a81d31a406fcf95037712939718a3b1cac5", + ], + [ + "5a5a87ec9fb811978ae54e4801fd0f51ebea7c441054deb2ab3a311c61c47759", + "8903b381e441f196501d52dad3a9b48cd3001d40fdb815d46d92f505fa1ada6e", + ], + [ + "bb0a7625d93b5bad03aff5a379bc3e153dc06fac9acb57161a8b2fa1dc5eee42", + "bfa79c6edd895c0ce51853b41e9062556fdb5d70128fdee938423eb30f6d3c9e", + ], + [ + "beaf1502a87c545ab4e5988a7ac14b61262616698c1bc2c71e457f7e6052c6fe", + "cb23034d03e8817a5b2ccc2c514875389908bc35e3ccbce06a5ea7800708f99a", + ], + [ + "4fd6d97f2d7a286989e49031b1ffe85e4ee79180cb26b41519c0b6c40c26aea4", + "5c7bceea88c5399a59a472f13fd171be7955de670184ced64422b3def50b173f", + ], + [ + "239ad917e34e3262ec95e0be3ff95302066a4164958ddb50f6883bb44a013cc8", + "685521fa6384fd4ae7eee908caf9bcb476f7218b137a153e0113315b55d67a6c", + ], + [ + "8a4a7fe9227d5e463139ae9257cb8aad5e15b95ff8e9a95cdfa99cd33139944e", + "24e3099b622852a33cadbc1935fc40c90082981142c43e9a9aafffe3f2396b05", + ], + [ + "36d3c4f77bdac327c33bd790919bbd3ff5e68d8df73ade27f4079b060f54881c", + "bc6e3cdec1612936087afde0cf43cf517a235e33aa5775c78351343838242a05", + ], + [ + "de5163ad1ddec505da78dd63bce1f9258825a24652382e4778b3a26e8746691b", + "9c52a0952519839516d7d5168a200ffa335e00d5276d0ddf01e7b2107579ba67", + ], + [ + "c4d134429ae77a25663d952d1e691510e2c985b9e7067fc8c27615649700dc56", + "3e1e5398dc6de01bd29b280d42b31c7b9087f225d6ef738540c58ac4a8780650", + ], + [ + "f89465120a513c010682722945177add988af4dad5fbf46789e5ab4e182cadb9", + "241d05ef2a5358f019215c52c06c6e15c02e79c717c6528472d3f755985d899b", + ], + [ + "7db89b3cacb56ccf60c2aebdfaf0039786ca8649679966d626574049bdc52a48", + "a1dca9c08b9ab5d845b7464f704dfaf0ea77af694efaa74f2234413dae404b42", + ], + [ + "65dca7d1cb7629c859c5c0caaa207bb050b1961977b55bac86d1f61137ee5839", + "84322623ee243e73cee370734d973ca0ab4e7701b7003ffe43b2d3055c806227", + ], + [ + "52c80093de0d3b767575db5443ab35523d3ef2b9457fbdeeeb76c1ddabce91d1", + "d8995d8f08213bbbc4e6fd25b339e55eed705036754c4ba6329b2c1e73820e08", + ], + [ + "e32763302d6e45f40217991fb89b059e6eddd6e8c5a9f92b00f74f5e6ceb529a", + "1ba1351ac5dd63fee0fea6a2d8d51bf646410ea304d3799db903af12af19a84c", + ], + [ + "9ba9f0ef6f74c10571498dc6a36801c7137fe2c278c7bf7e190c004248d44734", + "21ebd94ea36060990c2852bae42e4d5b9cd15a5b8d1bce67214dec907af9cf3f", + ], + [ + "ebf3d3dce55624d3ca8945dbca8d4cb5212729f7c72137d921e22a6eb6880071", + "215340f28f7a909941d4d0071a00ad9460ffa364f7c3b8f18e95bbfea4eddd9f", + ], + [ + "c6a12aacdc5b533eb38685d9982c58ae27df21396264f1708ff5a112250e054f", + "f2579c783e06d660065c25f8635f5d7a3d24eefd821deb8600ac0220b45cecdd", + ], + [ + "bf044494899155f6a79b21b488a6c9376afabb168f7a0d096ecf3d4371b5afa7", + "375ecad0fe735f6504ae1e2a8e3aacc77f78cb4b7bf414080e8603e7c6a22afb", + ], + [ + "b50b25f6e1471390c609599b40ecf3ad5821eaeb86ef418dd5ccb6a629a40c14", + "c791be32fdcbd4597f1f2cedbf44421f679f2355a4c0eb58e321d17144779ba7", + ], + [ + "e0daefe3cf7c80eaaf6060a29a479d0bed09c4b0781edb14f89e9cd54adb961c", + "6bbdfa110bf4422c4ca62887fa833921043778aaf2e0be1b33aa4b1967311ae3", + ], + [ + "ccd2673b7f83f1237c581ec937491063374d275ebde0ce4ec2d16a23ad03c6e4", + "c4cfdae7398004bec4edad11f095fe617448a3c8ea7fdcce603a114c921efda8", + ], + [ + "b3d0790727409620147edc4acf62298f8b63e592fd472c2e8bdd72b11a47b237", + "2d26ea2df48616ab0362efcc349de51e66a6612ddad6044341a72b9628075862", + ], + [ + "b2af722d2de67b9bb4f1341de23410e6fe2c98b02caab2f15fec0ae929897bee", + "dec50599145baf908d4701c675b99ae6783eb1d2a16289bf5622ec455247408a", + ], + [ + "5cce103792fdcbc17b33294d33e5e70e5db269b16332ba4324e849df66ebaa70", + "f4ae27fffa0647466a1ffef9c92eba150d866651e6afd1eb303f851a168f7f60", + ], + [ + "f6a04fa59dbded32dad425e8a336499d54046445891c5a4c55352909f86c9ee8", + "48672d5f6b46522e36a1a191d6443a688f840f41dd87662d28d3b6f3a4bac89e", + ], + [ + "533ffa63c10b3e1ad3f451f256ff51e4f565d34f6bcf1078d11b474c54fae86e", + "98932d6f3449684586157d9d78161acfe9a4445a74cdc4594c4dd82cf8187912", + ], + [ + "d0cec6ae66777fd5d0267f1010b2e5f2a7d1b39af830a2ea20ebdcfbd0a4819", + "1b6a72086e75a009f95061dd813df2eedb38d7a7f9c14ecf90ed0e2094b22113", + ], + [ + "c1940bf55de0ad6860125595d324376c8c7b9c4588ed5fa2f9032cc0b4634a73", + "d1af01874f518c5f6834f1fa7db4a5012e7808b26762ca92625f90c3d3b572e", + ], + [ + "3e2ea2a1ac81eecef5052405ae7c19bc3e4f6cb3244760660d3e915608b49b9e", + "807a9451fa4383f03eedd91270395561992393c2183462593d62f92063e1db21", + ], + [ + "4ecc00841343febabc6ffe42ebb182eb81412e6c639f646bca91e697ad47961e", + "115208bfdfbfaae8ac5509437114d4dd00dce0f7b7fb9476dc253884c91d11cb", + ], + [ + "b229f3e5492457ceb6ecde9f1d94e3640570b744654f28253267f1c5186eb086", + "f5df13af68d0045730fd55f5a65ec3ac7aa008a3c1dd32086611f6d15787bfc3", + ], + [ + "ef52321dad0bd70c5eacf5fe0b88d7dd598c61228941e96a40f43ce68bb03530", + "306572b7f7e793fed646cd2d6d0662f34d70bcbdb528bc567120bc4a8ac2fcf6", + ], + [ + "53ada5a97a1e5029b5e508ed15f3ef8bb877e03ec02fe9f80f085e5b11c50706", + "e816f86ea89d76ddf62e8482ab18bef55fbbd3c3c488898b7a763c1b90b4e4a0", + ], + [ + "85c0c7cf4327e2b094b9836a236fa18c3219b0d53b6299c12ae3e45cff326a6", + "a6350c1702151a637c41e8ad33d4a06ec10fb1e1c47957492a1aaaeae3330377", + ], + [ + "5a86cc01d413f0fe7fd99f84561396ef5801b67799fbb0fdce64124afc811780", + "f9bc2377d94b0d0844b5f73e1bec03898d50313870bc8da7c277496d068a51af", + ], + [ + "e9446986fd9d821604375b215f6c0cc23843110a49c57b89e44d9a33bbb47ef9", + "f903a5866ffa4003a2822ecf675bc4ece198b19a8278a8e084ebc938cd26365b", + ], + [ + "931023043f72fe92fd1054ac258027a6189b27bfde419d3f3fcf971b882d803c", + "a2f1633be311b180a3b948f228f9890cc8329b168df378eb4b1d5423496ed69f", + ], + [ + "88dd670c5172f45d6bae9ec2398facc8d190911fca5ccc557608e77a104b3103", + "150679dca5613f2fe243b616b6fba17a0aa5423e1bd30b3923375d72190661b4", + ], + [ + "527a08c04b082351d6cd6a325fa179ded4946e61adf081324633565f510111d6", + "cf326120e5647168c4dfe70190367009dbfc3cf39cdfa8d6bf6b1a1f8cdc3700", + ], + [ + "245ab3c7cd4e321b7038b84306ef3388aebb7ae979906a59644bcaa9e9624378", + "13e7b8776ba8847b1e8f0178ce9c7475b22c8e18d3129492d8bd2a81e25437ed", + ], + [ + "cd8d386e32b3aa0a162713f0132bb8c5c16ab52551c883d611d7774a1b717797", + "58f75aef687bf5b3a815948726a2f75598c3c4770435f31789bf3be25f1d9834", + ], + [ + "7ce9c275dc2b666a75053f1fa95faa65fb17c7bf8b6f98cfae6a1a6377b61c61", + "3ba269f49d6c0543a05cdb852255c66c089c33a50bcc54c89f6f987a7c1c252f", + ], + [ + "2eea1cf7e84e1c25827673166d079224a8d0b95b77aa33acfa844c758b144700", + "516b79ef40ecb3f9baf21d633d78dcf04205b1d8f8ac57f6e357a3a271adbd19", + ], + [ + "77996dfa88cf24f9737f0ee0d04bc7dbf60e90b40d97021918cfa7dde0157688", + "d2e6e79acb50486eb69c7d66a84c01f655ec79a8a802aebea693ea69846359d", + ], + [ + "f81a78fa659881b83929b450d0e20fb331159ef177b5cb2f8dd5390a73efe1c8", + "3cf3311b87e92324f7b8082582b5e41ea974c3b9dde7e1c69cec5ab4a056ff0b", + ], + [ + "c98b85f862e06434659f1df85d3e7e38594e149f3f13d304f3e891f3606c0120", + "84c17b0ba12ac6c604cd7df9730cea23be262653bfe1eebcf50f473b6b7938fc", + ], + [ + "114acd065db23f2548bf6c9dc44d784a77ec0d6cd1aede4818a4286886c8b4bf", + "4037aad1939c87160255f83406ab71d7c976c5520e07748694c0df06388f6197", + ], + [ + "a0ead262a05e05b7c5f4535e8d411f57808fe1cd685f151192a558626b6932e1", + "1ecf8be537c10bfcc081365f8c22528ce1069c8aff66f8a614c4b73d3ea760ff", + ], + [ + "4359f66b328b5673e84e74a34484af029e2bb7d58b8619f97aca360c3831210b", + "a449965d72acf15a2f96dc1edb4514f0dc1760b186c69c7a94c429c24cc606b6", + ], + [ + "ed0d0bc1a56f564429d3d9593a67f1c8cb20f350bf21ebfb650f02020d6a1edc", + "7546fc45e9b435ff72489e70d97bfce095130edbde950fe47487b7e7a30f1ed3", + ], + [ + "20ccc55b4589916dcad49babbdbdb7b11a2a4f5e03eedeb0e712a11d3643d754", + "3001dd2e023d6012bff277868ab76868190b7e5ea23bac0d7fd355a43258c003", + ], + [ + "962be577a12de93517e3af529a7f9f1418ed67edb3689c983f4dfda54a989b0e", + "edf5436756e82f3364020f779110f4b81563a0ccef16f5539c1b917f6f81b43d", + ], + [ + "12fd3aae244511d1aee6e36a4cf66a817c651cf5e593f2049c0b8cc611046357", + "fae87ceff286b67bd0b7165f9e786737aca905159953f2f916fa124e94aa5375", + ], + [ + "2c771366df12382b4db6e0560edabd64dcbe9ac2c797088fab07ec19cfadf737", + "c7ddb28eef6e8f4cb80ce8c77f45c2d0ad8d2429a47d49d4fe62798128148d64", + ], + [ + "1d66f544336bd5d9852483bba3f2b62d19e488f5c7241b5e9f2f7acf40b225ae", + "e7e0747a3935daf8abd8fa0ef92b69c65752d6a4e84e6e9223a8ea7ffb99e601", + ], + [ + "1dba405b7c93788f6fa0d577a9259ef7ced6135ca208cca60af9422859d32feb", + "872ae49affce0eae5b32682eb9ac1a6e00de4159b51b2a6767c57de829c0ab10", + ], + [ + "428bb2679dcf56487eeb9032811b0755a57ba584d6fd7bea2281c9a6b5f53dff", + "acf85ca0b227a9fef2db4a8d3f3f3ff331c8e74a017e08078facf61702fb36e", + ], + [ + "c3678ebba3f877a2368c49c3e4bd97ba7442ed5fb3ea0b01f180363c4894f26", + "71696dbc33ca8b3ce29edc43edb36e398fe33b792ffa873209b564e3654adc03", + ], + [ + "a3712ded20a1278416771efe64e866f2520ad37688032a8b427a18949aa1845c", + "e89ba2bd38e33ff556ad75f15cbf956e979c42a6abbe3f16e706343fc32e7495", + ], + [ + "fdec7765390233ca120387ad52b9eb6a6cb3c0a8e20f774d781b86092a2979e0", + "e69aa72a787e910c8a90cc1c635ce59e735350aa036a98a8c4ee76d6f13c04a9", + ], + [ + "2d28feae6984cd005b7c60b1ed3180fb45c27eb6d019c1e33e19cd756dd29585", + "78ee06658f8b497050f3903d431ef5eed7caa928db6bf72a2cbf95e78fe8824c", + ], + [ + "781d979642494721d8787d16892645cc35a0d45cf851078d24975f9c544d56f4", + "298a5e5551c6a50217c46534fb7b2b42ee651e8c23a52fefb731b1030472fc2", + ], + [ + "88ba24cb187999626dc34bfae6b7723039975f1ee90944aa1f53e81089c565e2", + "2ed64e517c713940ba364fb63699f6f1e36fbc20005a4fe1ff9b53d2547a3357", + ], + [ + "fed990a78ebf44707005daa26956b31ecf2f56075ee1bd02cb663f06273582e2", + "ed4e2ed8bc96ee46b40453770ffbe3a5929a357cf17ab3bb1b6441a157da6fbe", + ], + [ + "58346b480d70e2d3e563a1c1cd8875224bdbfa43959ec23126c565a776b6af63", + "b587d8f6aa132e8045bc61ae69ab49d119db2b79ffbf729a78a208f36b99f82", + ], + [ + "c559f89058bc4305f643c307f9bf895e3cb495ab424ed0f0b4f6aee6079c17f8", + "1e3334e21f2995cbb55a151ecfb2410b6227e9eef1fa31cbf525109695200921", + ], + [ + "e3c834e83833b3143120eb0aa39976f6ec1c648d3b3c22d705b21c61c1b0ca96", + "e2ccb324a98802031f8f1900ea78e4b13244b8ff2dae76abb48a0d1c2369726a", + ], + [ + "90361173f7b9b3f53e2e885d1db670468b0bfae8bd41508800c45ac17200cdc8", + "bf017dcad544c01920e4894fee5e9e51a231a991ef8fa1288d6724664afc3050", + ], + [ + "af3bd22f49abda95fef9bfda631d48f490e755a44bb10d00e46511bfdf5f4778", + "865e8d12b4b97497aa6521217ee89276e5ef25dacc286c23a36fd84fbc6c42d2", + ], + [ + "8fed14cb83c0054b6c67352beb4915412b61bb67f76d734b0740c97d452f9d1d", + "1223f5bc52fd5de8e82e2103196aac8ad2dbab942643cdf79c78592c5a687ad2", + ], + [ + "766b999c1dd26529c6c69b158d82f87bd8edcc380702fed65d2c8055546b457c", + "9396c547742ff3a286fb20c54aa87a83c189b53d851fc5d4081cf7ae3feb8bcf", + ], + [ + "803161cebf9b950267dc739b56bcb9c7041339fdd68b44917fe16b24fbb44024", + "9dc73dee3cfa2ad839433e568d52ede738edebc88f47f69d01d68bc9d7ed027d", + ], + [ + "606e5ba902cf1fb853be0574ac28fd6bffee9872c7d31b62943db25430227ac5", + "90091f9db0978bb82e97f133983fdafc7eb8b57e467122b7bbc70765fcc49e7c", + ], + ], + "wnd": 8, + }, + }, + ], + "hash": [Function], + "n": "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", + "nh": "7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8", + }, + "priv": null, + "pub": [ + "c16d27d972ba0a608afe27823c6f3e6c4cd397466e32aafd7752205e1be0f65a", + "aad977f8ddd4bfb31d7c7896d80d35579b352060503b4230402600e0cc9a1a97", + ], + }, + "fwVersion": { + "data": [ + 0, + 15, + 0, + 0, + ], + "type": "Buffer", + }, + "isPaired": true, +} +`; + +exports[`decoders > fetchActiveWallet 1`] = ` +{ + "external": { + "capabilities": 1, + "external": true, + "name": { + "data": [ + 76, + 111, + 115, + 116, + 32, + 100, + 105, + 103, + 105, + 116, + 97, + 108, + 45, + 103, + 111, + 108, + 100, + 32, + 111, + 102, + 32, + 83, + 97, + 116, + 111, + 115, + 104, + 105, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 45, + 51, + 116, + 121, + 215, + 117, + 169, + 62, + 47, + 103, + 83, + 61, + 224, + 220, + 206, + 220, + 82, + 243, + 210, + 8, + 12, + 211, + 177, + 253, + 1, + 202, + 218, + 103, + 14, + 166, + 247, + 24, + ], + "type": "Buffer", + }, + }, + "internal": { + "capabilities": 1, + "external": false, + "name": { + "data": [ + 76, + 111, + 115, + 116, + 32, + 100, + 105, + 103, + 105, + 116, + 97, + 108, + 45, + 103, + 111, + 108, + 100, + 32, + 111, + 102, + 32, + 83, + 97, + 116, + 111, + 115, + 104, + 105, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 48, + 211, + 148, + 167, + 113, + 193, + 34, + 206, + 53, + 247, + 135, + 139, + 246, + 129, + 5, + 103, + 239, + 103, + 153, + 71, + 221, + 83, + 125, + 243, + 98, + 31, + 39, + 18, + 151, + 173, + 203, + 168, + ], + "type": "Buffer", + }, + }, +} +`; + +exports[`decoders > getAddresses 1`] = `[]`; + +exports[`decoders > getKvRecords 1`] = ` +{ + "fetched": 1, + "records": [ + { + "caseSensitive": false, + "id": 873313750, + "key": "test", + "type": 0, + "val": "test", + }, + ], + "total": 1, +} +`; + +exports[`decoders > sign BTC 1`] = ` +{ + "changeRecipient": "PA7wHSw", + "sigs": [], + "tx": "020000000002e8030000000000001976a9141826efb6399e3b7978b4af1728f1e007a76cb63e88ac401f00000000000003a9008700000000", + "txHash": "3070c0edf91578d101ddcd4d77568870900f42cee5293ab772017ac92dc0ca98", +} +`; + +exports[`decoders > sign ETH 1`] = ` +{ + "pubkey": { + "data": [ + 4, + 148, + 178, + 80, + 242, + 110, + 253, + 113, + 8, + 85, + 91, + 38, + 229, + 248, + 152, + 131, + 100, + 121, + 193, + 18, + 28, + 90, + 3, + 195, + 182, + 142, + 8, + 67, + 173, + 33, + 168, + 45, + 34, + 202, + 61, + 74, + 238, + 20, + 38, + 76, + 5, + 12, + 128, + 150, + 49, + 131, + 4, + 83, + 23, + 146, + 125, + 148, + 195, + 195, + 48, + 236, + 111, + 178, + 84, + 163, + 241, + 166, + 192, + 87, + 180, + ], + "type": "Buffer", + }, + "sig": { + "r": { + "data": [ + 114, + 118, + 151, + 110, + 97, + 16, + 186, + 70, + 196, + 192, + 139, + 179, + 62, + 192, + 108, + 200, + 115, + 169, + 186, + 176, + 96, + 184, + 73, + 175, + 10, + 106, + 194, + 24, + 0, + 78, + 146, + 93, + ], + "type": "Buffer", + }, + "s": { + "data": [ + 32, + 178, + 106, + 16, + 174, + 25, + 37, + 137, + 204, + 69, + 3, + 15, + 237, + 223, + 31, + 122, + 189, + 235, + 246, + 2, + 106, + 53, + 145, + 47, + 18, + 92, + 19, + 140, + 27, + 120, + 206, + 76, + ], + "type": "Buffer", + }, + "v": { + "data": [ + 1, + ], + "type": "Buffer", + }, + }, +} +`; + +exports[`decoders > sign ETH_MSG 1`] = ` +{ + "sig": { + "r": "7db9e97fa8a2de98835bd320dc2a77fbbe1babe60f67cb405d0ba25c9d49ff3d", + "s": "6fc01778bea900509bad56d262a7c7546d3cb2fb6d5a1236bb012cf68ea66641", + "v": { + "data": [ + 28, + ], + "type": "Buffer", + }, + }, + "signer": { + "data": [ + 134, + 6, + 11, + 178, + 93, + 247, + 182, + 95, + 81, + 83, + 152, + 136, + 64, + 248, + 140, + 19, + 238, + 211, + 161, + 139, + ], + "type": "Buffer", + }, +} +`; diff --git a/src/__test__/unit/__snapshots__/decrypters.test.ts.snap b/src/__test__/unit/__snapshots__/decrypters.test.ts.snap new file mode 100644 index 00000000..4b327c90 --- /dev/null +++ b/src/__test__/unit/__snapshots__/decrypters.test.ts.snap @@ -0,0 +1,15 @@ +// Vitest Snapshot v1 + +exports[`decrypters > addKvRecords 1`] = `"0474065b047e4d78221796d230ae2f65e59fcf6835ffd11f9489839e316815e2380f099a5eee4d984456bd7f0240173a05cc4fb856af08ae345a75ba1138647ca2b7747310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`decrypters > fetchActiveWallet 1`] = `"04559363c25bf3890503ef962c54539da171bb850c40703658da61cfcb4d4c5232082d6b8619e49a922f08d6a1ff9f2291f2e13d46acd434d2a6713038e83f3fda30d394a771c122ce35f7878bf6810567ef679947dd537df3621f271297adcba8000000014c6f7374206469676974616c2d676f6c64206f66205361746f736869000000000000002d337479d775a93e2f67533de0dccedc52f3d2080cd3b1fd01cada670ea6f718000000014c6f7374206469676974616c2d676f6c64206f66205361746f73686900000000000000cf0a93ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`decrypters > getAddresses 1`] = `"04c2ad6fcfb7259fd1ccbead753cd4ebcb56eb361b77446a9a0f7c95bd181facf719a1c546a58a3aa8dcc6cbee476784607639ce0a1b841c7a7817787fb114416b3078383630363062623235646637623635663531353339383838343066383863313365656433613138620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005dc44c3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`decrypters > getKvRecords 1`] = `"049a716cdcdf5f8b341561e09dd7b286278c19ff6bbd33e32a18f4964e40330073e9134588eb44dad2d35f69e87acac0a24658de84f06552a77246d56efb098ed60000000101340db5d6000000000005746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574657374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf465bf6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`decrypters > pair 1`] = `"048de0f29258c1f5db855d23b72ece49d2e9f8b54bbcc472194e3c8332a716c618cfa1fceefdfa8152a40a14427a48955424a8ff296a01017970c40505bbcac5c846ec172d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`decrypters > removeKvRecords 1`] = `"04100099c67d24880a3312befd66a1342f9ac64d23e331ffcf511b57e27ef188a49e7f6c5041a7c313080c0dab2f5f97c1192046ae9f435a9e626d640b432ec4a9d223cd4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`decrypters > sign 1`] = `"04ec1322cec47925e25bc2f0917e4d40ab12f10790f52815252c25df1bb6ca1741461313edb6adcdc467600ad1a1ebc8102bd599d86df1bb9109fc13de8c1982690494b250f26efd7108555b26e5f898836479c1121c5a03c3b68e0843ad21a82d22ca3d4aee14264c050c80963183045317927d94c3c330ec6fb254a3f1a6c057b43045022100fc29efbd1f40a5fb0e79004e85d1eb33890185175ddac6b3512b23ddf20a82cf02202945662e4f657e21a7535b50c41f74ae04da4de6384531fead623ea05f343d4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055b089340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; diff --git a/src/__test__/unit/__snapshots__/encoders.test.ts.snap b/src/__test__/unit/__snapshots__/encoders.test.ts.snap new file mode 100644 index 00000000..21a2b2c0 --- /dev/null +++ b/src/__test__/unit/__snapshots__/encoders.test.ts.snap @@ -0,0 +1,121 @@ +// Vitest Snapshot v1 + +exports[`encoders > KvRecords > addKvRecords 1`] = `"01000000000000000000046b6579000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000676616c75650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > KvRecords > getKvRecords 1`] = `"000000000100000000"`; + +exports[`encoders > KvRecords > removeKvRecords 1`] = `"000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > connect > connect encoder 1`] = `"11111111111111111111111111111111"`; + +exports[`encoders > connect > connect encoder 2`] = `"01021a1a1a1a004201047431b18f055ac873b1eb7d74d8716ad1e3df06908b00cc2f901153f8eb6428184867c0fdab339c6c490a39ae704d29b5b4c2f1244350a29059622cf49b421155516ed68e"`; + +exports[`encoders > getAddresses > encodeGetAddressesRequest with ED25519_PUB 1`] = `"7465737400000000000000000000000000000000000000000000000000000000058000002c8000003c80000000000000000000000001"`; + +exports[`encoders > getAddresses > encodeGetAddressesRequest with SECP256K1_PUB 1`] = `"7465737400000000000000000000000000000000000000000000000000000000058000002c8000003c80000000000000000000000001"`; + +exports[`encoders > getAddresses > encodeGetAddressesRequest with default flag 1`] = `"7465737400000000000000000000000000000000000000000000000000000000058000002c8000003c80000000000000000000000001"`; + +exports[`encoders > pair > pair encoder 1`] = `"11111111111111111111111111111111"`; + +exports[`encoders > pair > pair encoder 2`] = `"746573747465737400000000000000000000000000000000003044022065a197118869c9dbe800c7ffad2e6edb7c0e6f74297b012a7bb5cb5e4e194514022056e5e010f9ee256b560d15af300c75b5336069994181ab6f51d6313905bf1c4300000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.10.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.10.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.10.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.10.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.10.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.11.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.11.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.11.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.11.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.11.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.12.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.12.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.12.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.12.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.12.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.13.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.13.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.13.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.13.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.13.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.14.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.14.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.14.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.14.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.14.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.15.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.15.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.15.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.15.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.15.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.16.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.16.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.16.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.16.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.16.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.17.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.17.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.17.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.17.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.17.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.18.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.18.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.18.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.18.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.18.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.19.0 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.19.1 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.19.2 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.19.3 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; + +exports[`encoders > sign > should test sign encoder with firmware v0.19.4 1`] = `"000074657374746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"`; diff --git a/src/__test__/unit/__snapshots__/encrypters.test.ts.snap b/src/__test__/unit/__snapshots__/encrypters.test.ts.snap new file mode 100644 index 00000000..016cb223 --- /dev/null +++ b/src/__test__/unit/__snapshots__/encrypters.test.ts.snap @@ -0,0 +1,15 @@ +// Vitest Snapshot v1 + +exports[`encrypters > addKvRecords 1`] = `"01021a1a1a1a06c5025742d3d5d80c0d7d33c0f7c63b891d6aab51df5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2792179"`; + +exports[`encrypters > fetchActiveWallet 1`] = `"01021a1a1a1a06c5025742d3d59bffbd66b864ce21894d3109c3bd4e6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e65f5dc0"`; + +exports[`encrypters > getAddresses 1`] = `"01021a1a1a1a06c5025742d3d5ae818a7d4eb6256d0d44891d4765a3960738d997fd4b730e44a1bea654444e048589f85aa3ab3e52a6cde25840a4a1a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013c495e0"`; + +exports[`encrypters > getKvRecords 1`] = `"01021a1a1a1a06c5025742d3d59a61950ffbddb0dcbfbb539536f296e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aab69a3"`; + +exports[`encrypters > pair 1`] = `"01021a1a1a1a06c5025742d3d54ceb0a4632d3a72c395ae4620a88704e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642050a2"`; + +exports[`encrypters > removeKvRecords 1`] = `"01021a1a1a1a06c5025742d3d56e9ebe8a4afbd6a7789f63e4518dffd3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041606c1f"`; + +exports[`encrypters > sign 1`] = `"01021a1a1a1a06c5025742d3d51c02f37575e771648d53e8fd886e4d620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5ed3419"`; diff --git a/src/__test__/unit/__snapshots__/validators.test.ts.snap b/src/__test__/unit/__snapshots__/validators.test.ts.snap new file mode 100644 index 00000000..168c4b55 --- /dev/null +++ b/src/__test__/unit/__snapshots__/validators.test.ts.snap @@ -0,0 +1,147 @@ +// Vitest Snapshot v1 + +exports[`validators > KvRecords > addKvRecords > should successfully validate 1`] = ` +{ + "fwConstants": { + "kvActionsAllowed": true, + }, + "sharedSecret": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "url": "test.com", + "validRecords": { + "key": "value", + }, +} +`; + +exports[`validators > KvRecords > getKvRecords > should successfully validate 1`] = ` +{ + "fwConstants": { + "kvActionsAllowed": true, + }, + "n": 1, + "sharedSecret": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "start": 0, + "type": 1, + "url": "test.com", +} +`; + +exports[`validators > KvRecords > removeKvRecords > should successfully validate 1`] = ` +{ + "fwConstants": { + "kvActionsAllowed": true, + }, + "ids": [ + 1, + ], + "sharedSecret": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "type": 1, + "url": "test.com", +} +`; + +exports[`validators > connect > should successfully validate 1`] = `"test"`; + +exports[`validators > fetchActiveWallet > should successfully validate 1`] = ` +{ + "sharedSecret": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "url": "test.com", +} +`; + +exports[`validators > getAddresses > should successfully validate 1`] = ` +{ + "flag": 1, + "fwVersion": { + "data": [ + 0, + 12, + 0, + ], + "type": "Buffer", + }, + "sharedSecret": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "url": "asdf", + "wallet": { + "capabilities": 1, + "external": true, + "name": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "uid": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + }, +} +`; + +exports[`validators > sign > should successfully validate 1`] = ` +{ + "fwConstants": { + "kvActionsAllowed": true, + }, + "sharedSecret": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "url": "test.com", + "wallet": "wallet", +} +`; diff --git a/src/__test__/unit/decoders.test.ts b/src/__test__/unit/decoders.test.ts new file mode 100644 index 00000000..033116d8 --- /dev/null +++ b/src/__test__/unit/decoders.test.ts @@ -0,0 +1,115 @@ +import { + decodeConnectResponse, + decodeFetchActiveWalletResponse, + decodeGetAddresses, + decodeGetKvRecordsResponse, + decodeSignResponse, +} from '../../functions'; +import { getP256KeyPair } from '../../util'; +import { buildFirmwareConstants } from '../utils/builders'; +import { REUSABLE_KEY } from '../utils/helpers'; +import { + connectDecryptedData, + fetchActiveWalletDecryptedData, + getKvRecordsDecryptedData, + signEthDecryptedData, + signEthMsgDecryptedData, +} from './__mocks__/decoderData'; + +describe('decoders', () => { + test('connect', () => { + const decryptedData = connectDecryptedData; + const key = getP256KeyPair(Buffer.from(REUSABLE_KEY, 'hex')); + expect(decodeConnectResponse(decryptedData, key)).toMatchSnapshot(); + }); + + test('fetchActiveWallet', () => { + const decryptedData = fetchActiveWalletDecryptedData; + expect(decodeFetchActiveWalletResponse(decryptedData)).toMatchSnapshot(); + }); + + test('getAddresses', () => { + const decryptedData = Buffer.from([0, 0, 0]); + const flag = 0; + expect(decodeGetAddresses(decryptedData, flag)).toMatchSnapshot(); + }); + + test('sign BTC', () => { + const data = Buffer.from('5b302c20302c20305d', 'hex'); + const request = { + payload: Buffer.from( + 'c4050000003100008001000080000000800100000000000000e80300006f1826efb6399e3b7978b4af1728f1e00', + 'hex', + ), + schema: 0, + origData: { + prevOuts: [[{}]], + recipient: 'mhifA1DwiMPHTjSJM8FFSL8ibrzWaBCkVT', + value: 1000, + fee: 1000, + changePath: [2147483697, 2147483649, 2147483648, 1, 0], + fwConstants: buildFirmwareConstants(), + }, + changeData: { value: 8000 }, + }; + const currency = 'BTC'; + const isGeneric = false; + expect( + decodeSignResponse({ data, request, isGeneric, currency }), + ).toMatchSnapshot(); + }); + + test('sign ETH', () => { + const data = signEthDecryptedData; + const request = { + payload: Buffer.from( + '040000000100050000002c0000803c00008000000080000000000000000000fd0b3e957d90bb196dcfbd4424af1430b3d0595841d37fb0fba9f0cfdf5286dae0150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 'hex', + ), + extraDataPayloads: [], + schema: 5, + curveType: 0, + encodingType: 4, + hashType: 1, + omitPubkey: false, + origPayloadBuf: Buffer.from( + '02f90bf901808447868c008447868c0082c35094e242e54155b1abc71fc118065270cecaaf8b776885e8d4a51000b90bcbe34859b84f2f0f7bd6aff353125625b88ee6b106042bc9a1b51a498a257d1b2b0538d3ce1cadcf1faf2d6bada2cd4433a1f1f586d07b5d99519d4ff67f6d38a35908cff0c0e55a5a7557b3dd5158307a20347e150e0967c8c563dc3334ebaed0364b5e9944e930348a19dc85fc79d887e9501d15645c69a15dd815410f8bb34699efe12e22951eed3d3a2615bf31a14cbfae8475bbce94fb9019dd9a9c7b1af146dc59a9dbd464219cb2da82f310592a18c5fc2075174f0a40398e1e7d483c226313c51b2baaaf14e9a7b3ae83be693bbcb4678b7fe2dc777d8b2d40c5bc4016ed2788e3c6fcc0d4f1445eda5c359f9051b7dc04c956d03b67baebc0de67eee5df18bda89f26ed9d342a0411d3a24ff3b83e214005644e2f9b878e27914464f710a88d15d9d2005bedb403eddc9004e8babd09a786c6cc1aeeb2d0db30d06306f551f941cf7399d6379fd56b7ee1762e9fcd57b4d0717b722360caa3274bb4c615ba9f286a7f1205dea9ad691f611507e0715fa60f5c198b0f21bcbd0bd278f2340f5490781a95921ce808f7b2e9e371abe96bb16b7441283957154c8f5060d47c376558914a6c637a857e7aa4fde004a27cb989b68302d577349d1a516b58777a955f281ce2afa22f36304e44810a53204347788445c3a3fbb1b3cbf14f605c04f432ebf528c228708c9ad1b2c23110d566a8815e4ea43fcde9d1895ab061ce323bc76ced74817b393a3d8be77ea5bae6bcb7c7590432f54b240447321ccafa9fe11907a17784946d774b11382e07dfc0b8a8ee0177a980b43ba90feeaa6c47c3bf373ca1c19927b17e4cfcc39c7bd7c5b67fdf922d8641e2ff62cc8ea0c2d4f770b649b84e7af29a7595355d18e06e872812e112fdb8255e8fddd27a6b0e6de51de724176ee8abb17e1d480083d473e7b779f46f37db38da58f5ad4c0d19474ecae0d9d059e8d62f27f818d9649a55000610987a2b8bd892ae851cd571499019b280a42d7988b32d9512f77d1f701e16baff9e4d1bd2ccbfabdf5af133934b5fd5ed69f20128018c2b7abf9ecf96fa3406bf19bdbd2f402b612bd7e2265725b9dacbc7aa31f1c05fb690c74dff088137dedcefbe560187d12ac7e8eeecce06b1024fb1cc8f2b363032ad3a84446532730ef879ba35be36ac0385ce60ef81f593712c76a21cbbc56e81194db29aec74ac900e15bc354f0567572ee5ba3105dcfc1cbd897e3452535b63b9cfb017d0fe331cf6d8ce377d96307e2be7c1cb7179abe9c41483829a01222cb2936854308262ad1d219cbd4e53fdb2df1451db9358cc1c4fd8eacf23d98a9f63aa95aef3115ebb5eb6a793d4a2e5f8933a609d0330ae13542a41beba616a15c59135f111c4e1901d278a60028b40bc6e9e15899407484ccb893a43e3d962f4aafb191334f2c3fbb0a9868cd358a4e4ae94786cd5df4952cad67593e91cb821b4d0c2c4b77945c2f603e34b6b9638fc0d57d476f592747f78dc86d0833cc589d07b60ec53b9daa3fbf9efc1df71ad79be5202e5dfc39d7e80e6a76b7045b770a4e3b0d27291e8bdc1a8d7166082899b0a3200321489cc7760ce454366656bd895c44a7bb3107e022bb0477c414a7a7d3a212e4f3f02aea9c7d762e2d17aa2b4b0a32c2e42139026ba878b360197524f177084c8d056d175a4befd6a83c33fe216a7ad6ffb95a076c458e40255eea6ce617366ed53f6e4f69e893db4ef9b367ec383759839c1f4b0e2708d40662cd69dda8e5f9ba7364ab9acc1ea340f82c43e23b1040832e139c025b73a84b7d58608b8a8d002d88df458cc593dddfae6d732b70bf35d32e5e868a3acf19cd83c9db8de926236ab87388a771fe7ad9946180bc75badb0bc7e0f0cf4a8e36d3794284f4e81d90f85433246a62861a72d4d15f1740695636fb9274bae63875ad4154861a2e95933d5ab131b83025d349b167ea3e59059870f732f72acd9060299896e6f6f76049ac09727b1c8040ea61027e08212546668f41dc0d3dc9e924ab27e1378ec58b44c3e5d40be5d8fa7a6b520d9f0b3f5a2d2501382653ce536d908da4c7ff191b2d6705c4c4a6f47e5f5b40b8bb741f6fe485a60d07de97207c4324d57cdd6b4eff4384b13fbc8c86d4695b892520df148bcb1ee0dbf1267014b92eeefb77298eae64dcc4d9c045c2e974c8e12ea1ecf08865961223f801fec4bdfdef3cbfa643384e1ddb3a7e73023c7368e2e9082c8181551b7b43a41d9aaf9b06a63d508156ffb890f75217c91ab00dedb0fbcfc343b7c23aa4b88d4c84b41bb32e158a55e1dc897453d970eb7466dee714d368884691e08db69c4fc454a86f5af5d6ffad2d8f62f94294c623fe86159ca307cee1a64350c939bbaaeb62559803033bb59b791d1c8a02a72e37177333d8aa03d4423fc35cf364ba1dd836abf41abe485d066cfe34f026be2a6b81f9b6b2f4e9f69bca71f97ad46911a56229202d9668249e2cd0dfe0982b92c4be7a5e4a8d70cfd436fdf9e0f913c4956b91f4ee07f96045ffe92060bc7b8f99c5dbc1d4903586ecebf86837f1e920ee5c42b648d083b993ba4cbc92731b0ad680a0c776099ac605c3ea5ecee9eb089b31d0d5122348180f89d59fc01192ddbe7a3aac72d9821ffb51dd1ecb382352c07270cbdcb853d782b9b007e19f61a7c901d079a2aa899c257c00f517272d87106d92cfbc66b287587520ab899dbc709cc780915eae76d6b32c5ec5450806d1696f553f79614276c5fa8de2a1dfedc3737bc0bc57ee1ee86bef5036ff1741f91ed6db7db07fa5d2845d8012e01f06bd3b2963a2ff3e52ce6a93668011ab09e326c05e596ef12993a2ce2f34646f4d17cbef97d6e88ea65731cd5dd7bf8cce9c1893a7a7a36cbfae8baed3f3a2a0e94412d0c8524c430c4765f9d096ff3a180fb469fd6fc8bb7c536f5b37cd1928906c1449da4cc3230bb3e556510319b8c801d92b0b390db7798f4f8b7e2b5359f5f79cb0df654c4bb3398b5210f6d3309a3fb58e640723bf44d908750ce339701a7794e5bbd9ab240890dd29578b7201a4ca291833a13e77eead114cf6ad61b2e32f2d8e6c1352f12fb4ed1475f782057747b15e5a43d9a14b98a3b10172f7e0a675e2b916fd366fa9707cfb090dd99054c7202b86b03747990009d13f751f6f45a8bf56736e101d873bf5753ada69c9456708f7fd88fc35481c76f9c0f258296a893b73b73a0605ff09f113f69e3ac601328d4e6f0da7be8e5dad49e2099574066fa55efbd019a8650d294d2d848617d74b7d4710e0c262a02922f78e76423c4c94ae53635a21de1f4951b679d5cb78993d818728bbca1e101e04016b73d986ee02d6110c512ec13e6b9869f971b39dcdfee3f53f38879108b5c553df43403243e01954c8883955243ba92721c65c84170cea37d29a82b13666e8c6c346309308165166ea762a18d5d1f7bb0a713c9574a7e614923f40cab4360190d52535dee46b90cde15d1375b1ef6fb52ff26d30819ba7dc2e01e2985140985db4475cc5cf312f26004e42d7526e51695eb8f891d7311237974bc341a2c351ed62318bf04f9c07e46985d9822c5e3dcbee9defa983a47f331a7638cb188497f33a6856e9232a06ba9dc6c790c687b328fa35772177da32792e7dc22a70c1b1c542efb9ad34046bedf89a12c93dc4539a0535cbd7932f78c6c9cd253fdb5cea6fc76bea2093ae1a0ce3b13cda17f4dc42d6a37204f49706139623368016126ed5ba788fb54d878b66428191b01a6c3b00a94118b416e6e7bd76edc74d0cce62e943e8a575e81638b9caa1de6ad122d19e5741129f5b2a53516b87355fd8ca0e7f93fb6438402eec8a20975f1bc8d6efcdaf68c11d59a72a14a1bb3ff279cbd4b01353ede78833da2356b36f37033689077e71f626595d9878b2a553b22662e189321a31bb3910d9128245be9cfcd1c19015c2689cfeabd236fa907ec11d93489660ef280697ecc6471761eaea19e6513309f8b7988f048252bab478421041efb086858a6cfc3eafb8dde97b79ce83f37bfe042d1114de8ee60d40b6190d7d6fa2f66bddbcb307cd7e8d0b7d330135f2251b663618f17ef16c7605d1ae9afe7a587f78a405ef2d45f57c25e458aee5aab475a130d5b5f334889957f242cb40db12c15530a5e841df78646c6578573bee178f10910e40ebe3505a745334b8f9daff70963c40a8d47a39954f0a950d2436b9c7138f46e94f2b884477e680dfba960e3f2251337200f1858fe12a3c3273ec0', + 'hex', + ), + }; + const isGeneric = false; + expect(decodeSignResponse({ data, request, isGeneric })).toMatchSnapshot(); + }); + + test('sign ETH_MSG', () => { + const data = signEthMsgDecryptedData; + const request = { + schema: 3, + payload: Buffer.from( + ' 00050000002c0000803c000080000000800000000000000000010300abcdef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 'hex', + ), + input: { + signerPath: [2147483692, 2147483708, 2147483648, 0, 0], + payload: Buffer.from('abcdef', 'hex'), + protocol: 'signPersonal', + fwConstants: buildFirmwareConstants(), + }, + msg: Buffer.from('abcdef', 'hex'), + extraDataPayloads: [], + }; + const currency = 'ETH_MSG'; + const isGeneric = false; + expect( + decodeSignResponse({ data, request, isGeneric, currency }), + ).toMatchSnapshot(); + }); + + test('getKvRecords', () => { + const decryptedData = getKvRecordsDecryptedData; + const fwConstants = buildFirmwareConstants(); + expect( + decodeGetKvRecordsResponse(decryptedData, fwConstants), + ).toMatchSnapshot(); + }); +}); diff --git a/src/__test__/unit/decrypters.test.ts b/src/__test__/unit/decrypters.test.ts new file mode 100644 index 00000000..5409a8ec --- /dev/null +++ b/src/__test__/unit/decrypters.test.ts @@ -0,0 +1,111 @@ +import { + decryptPairResponse, + decryptFetchActiveWalletResponse, + decryptGetAddressesResponse, + decryptSignResponse, + decryptGetKvRecordsResponse, + decryptAddKvRecordsResponse, + decryptRemoveKvRecordsResponse, +} from '../../functions'; +import { + pairEncryptedResponse, + fetchActiveWalletEncryptedResponse, + getAddressesEncryptedResponse, + signEncryptedResponse, + getKvRecordsEncryptedResponse, + addKvRecordsEncryptedResponse, + removeKvRecordsEncryptedResponse, +} from './__mocks__/decryptersData'; + +describe('decrypters', () => { + test('pair', () => { + const encryptedResponse = pairEncryptedResponse; + const sharedSecret = Buffer.from( + '19c5bb9839d81eb975aed91b865728f10d5836d0a96497dae396d01da39cff9d', + 'hex', + ); + const { decryptedData } = decryptPairResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); + + test('fetchActiveWallet', () => { + const encryptedResponse = fetchActiveWalletEncryptedResponse; + const sharedSecret = Buffer.from( + '7b42b92db38d6b154fd6855d2793b1bd6b74cc4ebc022720a89d890fed39d271', + 'hex', + ); + const { decryptedData } = decryptFetchActiveWalletResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); + + test('getAddresses', () => { + const encryptedResponse = getAddressesEncryptedResponse; + const sharedSecret = Buffer.from( + 'ea07e69e110c91daa1956f9fd09d02a3926c90a23e2194edc44c5a072760b0d2', + 'hex', + ); + const { decryptedData } = decryptGetAddressesResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); + + test('sign', () => { + const encryptedResponse = signEncryptedResponse; + const sharedSecret = Buffer.from( + '7fd212816bc3f786a105dc2c1f1427ba16c82895ae2ca2ab0ab5aa74333da5c1', + 'hex', + ); + const { decryptedData } = decryptSignResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); + + test('getKvRecords', () => { + const encryptedResponse = getKvRecordsEncryptedResponse; + const sharedSecret = Buffer.from( + 'fd9a2e92003c72c574f4b7f5a52c81ac75eabbba1530cea6b88e5fe759fa5d68', + 'hex', + ); + const { decryptedData } = decryptGetKvRecordsResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); + + test('addKvRecords', () => { + const encryptedResponse = addKvRecordsEncryptedResponse; + const sharedSecret = Buffer.from( + '7d07d7b0116de8e1fc7beefdf79ce0ac0c6f5550aad2a5df65d556282a3b7d2f', + 'hex', + ); + const { decryptedData } = decryptAddKvRecordsResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); + + test('removeKvRecords', () => { + const encryptedResponse = removeKvRecordsEncryptedResponse; + const sharedSecret = Buffer.from( + 'fbf8c2922e33023b1cb4478ce7316b92a1a275e87b18ea7940e2eef31cf35f8a', + 'hex', + ); + const { decryptedData } = decryptRemoveKvRecordsResponse( + encryptedResponse, + sharedSecret, + ); + expect(decryptedData.toString('hex')).toMatchSnapshot(); + }); +}); diff --git a/src/__test__/unit/encoders.test.ts b/src/__test__/unit/encoders.test.ts new file mode 100644 index 00000000..a59fb31a --- /dev/null +++ b/src/__test__/unit/encoders.test.ts @@ -0,0 +1,136 @@ +import { EXTERNAL } from '../../constants'; +import { + encodeAddKvRecordsRequest, + encodeConnectRequest, + encodeGetAddressesRequest, + encodeGetKvRecordsRequest, + encodePairRequest, + encodeRemoveKvRecordsRequest, + encodeSignRequest, +} from '../../functions'; +import { getP256KeyPair } from '../../util'; +import { + buildFirmwareConstants, + buildGetAddressesObject, + buildTransactionObject, + getFwVersionsList, +} from '../utils/builders'; + +describe('encoders', () => { + let mockRandom: any; + + beforeAll(() => { + mockRandom = vi.spyOn(global.Math, 'random').mockReturnValue(0.1); + }); + + afterAll(() => { + mockRandom.mockRestore(); + }); + + describe('connect', () => { + test('connect encoder', () => { + const privKey = Buffer.alloc(32, '1'); + expect(privKey.toString()).toMatchSnapshot(); + const key = getP256KeyPair(privKey); + const payload = encodeConnectRequest(key); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + }); + + describe('pair', () => { + test('pair encoder', () => { + const privKey = Buffer.alloc(32, '1'); + expect(privKey.toString()).toMatchSnapshot(); + const key = getP256KeyPair(privKey); + const payload = encodePairRequest(key, 'testtest', 'testtest'); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + }); + describe('getAddresses', () => { + test('encodeGetAddressesRequest with default flag', () => { + const mockObject = buildGetAddressesObject({}); + const payload = encodeGetAddressesRequest(mockObject); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + + test('encodeGetAddressesRequest with ED25519_PUB', () => { + const mockObject = buildGetAddressesObject({ + flag: EXTERNAL.GET_ADDR_FLAGS.ED25519_PUB, + }); + const payload = encodeGetAddressesRequest(mockObject); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + + test('encodeGetAddressesRequest with SECP256K1_PUB', () => { + const mockObject = buildGetAddressesObject({ + flag: EXTERNAL.GET_ADDR_FLAGS.SECP256K1_PUB, + }); + const payload = encodeGetAddressesRequest(mockObject); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + + test('encodeGetAddressesRequest should throw with invalid startPath on old firmware', () => { + const startPath = [0x80000000 + 44, 0x80000000 + 60, 0, 0, 0, 0, 0]; + const fwVersion = Buffer.from([0, 0, 0]); + const testEncodingFunction = () => + encodeGetAddressesRequest( + buildGetAddressesObject({ startPath, fwVersion }), + ); + expect(testEncodingFunction).toThrowError( + 'derivation paths with 5 indices', + ); + }); + }); + + describe('sign', () => { + test.each(getFwVersionsList())( + 'should test sign encoder with firmware v%d.%d.%d', + (major, minor, patch) => { + const { payload } = encodeSignRequest( + buildTransactionObject({ + fwVersion: Buffer.from([patch, minor, major]), + }), + ); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }, + ); + }); + describe('KvRecords', () => { + test('getKvRecords', () => { + const mockObject = { type: 0, n: 1, start: 0 }; + const payload = encodeGetKvRecordsRequest(mockObject); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + + test('addKvRecords', () => { + const mockObject = { + type: 0, + records: { key: 'value' }, + fwConstants: buildFirmwareConstants(), + caseSensitive: false, + }; + const payload = encodeAddKvRecordsRequest(mockObject); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + + test('removeKvRecords', () => { + const mockObject = { + type: 0, + ids: [0], + fwConstants: buildFirmwareConstants(), + caseSensitive: false, + }; + const payload = encodeRemoveKvRecordsRequest(mockObject); + const payloadAsString = payload.toString('hex'); + expect(payloadAsString).toMatchSnapshot(); + }); + }); +}); diff --git a/src/__test__/unit/encrypters.test.ts b/src/__test__/unit/encrypters.test.ts new file mode 100644 index 00000000..aff47d18 --- /dev/null +++ b/src/__test__/unit/encrypters.test.ts @@ -0,0 +1,82 @@ +import { + encryptAddKvRecordsRequest, + encryptFetchActiveWalletRequest, + encryptGetAddressesRequest, + encryptGetKvRecordsRequest, + encryptPairRequest, + encryptRemoveKvRecordsRequest, + encryptSignRequest, +} from '../../functions'; +import { buildSharedSecret } from '../utils/builders'; + +describe('encrypters', () => { + let mockRandom: any; + + beforeAll(() => { + mockRandom = vi.spyOn(global.Math, 'random').mockReturnValue(0.1); + }); + + afterAll(() => { + mockRandom.mockRestore(); + }); + + test('pair', () => { + const payload = Buffer.from('test'); + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptPairRequest({ payload, sharedSecret }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); + + test('fetchActiveWallet', () => { + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptFetchActiveWalletRequest({ sharedSecret }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); + + test('getAddresses', () => { + const payload = buildSharedSecret(); + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptGetAddressesRequest({ + payload, + sharedSecret, + }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); + + test('sign', () => { + const payload = Buffer.from([1, 2, 3]); + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptSignRequest({ payload, sharedSecret }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); + + test('getKvRecords', () => { + const payload = Buffer.from('test'); + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptGetKvRecordsRequest({ + payload, + sharedSecret, + }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); + + test('addKvRecords', () => { + const payload = Buffer.from('test'); + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptAddKvRecordsRequest({ + payload, + sharedSecret, + }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); + + test('removeKvRecords', () => { + const payload = Buffer.from('test'); + const sharedSecret = buildSharedSecret(); + const encryptedPayload = encryptRemoveKvRecordsRequest({ + payload, + sharedSecret, + }); + expect(encryptedPayload.toString('hex')).toMatchSnapshot(); + }); +}); diff --git a/src/__test__/unit/requests.test.ts b/src/__test__/unit/requests.test.ts new file mode 100644 index 00000000..4e7e69f9 --- /dev/null +++ b/src/__test__/unit/requests.test.ts @@ -0,0 +1,4 @@ +//TODO: Mock out the server responses to generate deterministic results +describe('requests', () => { + test('should test connect request'); +}) \ No newline at end of file diff --git a/src/__test__/unit/validators.test.ts b/src/__test__/unit/validators.test.ts new file mode 100644 index 00000000..756bd9b4 --- /dev/null +++ b/src/__test__/unit/validators.test.ts @@ -0,0 +1,128 @@ +import { + validateAddKvRequest, + validateConnectRequest, + validateFetchActiveWallet, + validateGetAddressesRequest, + validateGetKvRequest, + validateRemoveKvRequest, + validateSignRequest, +} from '../../functions'; +import { + buildGetAddressesObject, + buildValidateConnectObject, + buildValidateRequestObject, +} from '../utils/builders'; + +describe('validators', () => { + describe('connect', () => { + test('should successfully validate', () => { + const connectBundle = buildValidateConnectObject({}); + const validConnectRequest = validateConnectRequest(connectBundle); + expect(validConnectRequest.deviceId).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const connectBundle = buildValidateConnectObject({ baseUrl: '' }); + expect(() => validateConnectRequest(connectBundle)).toThrowError(); + }); + }); + + describe('getAddresses', () => { + test('should successfully validate', () => { + const getAddressesBundle = buildGetAddressesObject({}); + expect(validateGetAddressesRequest(getAddressesBundle)).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const getAddressesBundle = buildGetAddressesObject({ url: '' }); + expect(() => + validateGetAddressesRequest(getAddressesBundle), + ).toThrowError(); + }); + }); + + describe('KvRecords', () => { + describe('addKvRecords', () => { + test('should successfully validate', () => { + const validateAddKvBundle: any = buildValidateRequestObject({ + records: { key: 'value' }, + }); + expect(validateAddKvRequest(validateAddKvBundle)).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const validateAddKvBundle: any = buildValidateRequestObject({}); + expect(() => validateAddKvRequest(validateAddKvBundle)).toThrowError(); + }); + }); + + describe('getKvRecords', () => { + test('should successfully validate', () => { + const validateGetKvBundle: any = buildValidateRequestObject({ + n: 1, + type: 1, + start: 0, + }); + expect(validateGetKvRequest(validateGetKvBundle)).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const validateGetKvBundle: any = buildValidateRequestObject({ n: 0 }); + expect(() => validateGetKvRequest(validateGetKvBundle)).toThrowError(); + }); + }); + + describe('removeKvRecords', () => { + test('should successfully validate', () => { + const validateRemoveKvBundle: any = buildValidateRequestObject({ + ids: [1], + type: 1, + }); + expect( + validateRemoveKvRequest(validateRemoveKvBundle), + ).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const validateRemoveKvBundle: any = buildValidateRequestObject({}); + expect(() => + validateRemoveKvRequest(validateRemoveKvBundle), + ).toThrowError(); + }); + }); + }); + + describe('fetchActiveWallet', () => { + test('should successfully validate', () => { + const validateFetchActiveWalletBundle: any = buildValidateRequestObject( + {}, + ); + expect( + validateFetchActiveWallet(validateFetchActiveWalletBundle), + ).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const validateFetchActiveWalletBundle: any = { url: '' }; + expect(() => + validateFetchActiveWallet(validateFetchActiveWalletBundle), + ).toThrowError(); + }); + }); + + describe('sign', () => { + test('should successfully validate', () => { + const validateSignRequestBundle: any = buildValidateRequestObject({ + wallet: 'wallet', + }); + expect(validateSignRequest(validateSignRequestBundle)).toMatchSnapshot(); + }); + + test('should throw errors on validation failure', () => { + const validateSignRequestBundle: any = buildValidateRequestObject({}); + expect(() => + validateSignRequest(validateSignRequestBundle), + ).toThrowError(); + }); + }); +}); diff --git a/src/__test__/utils/__test__/__snapshots__/builders.test.ts.snap b/src/__test__/utils/__test__/__snapshots__/builders.test.ts.snap new file mode 100644 index 00000000..f76ce38f --- /dev/null +++ b/src/__test__/utils/__test__/__snapshots__/builders.test.ts.snap @@ -0,0 +1,511 @@ +// Vitest Snapshot v1 + +exports[`building > should test client 1`] = ` +[ + [ + 0, + 10, + 0, + ], + [ + 0, + 10, + 1, + ], + [ + 0, + 10, + 2, + ], + [ + 0, + 10, + 3, + ], + [ + 0, + 10, + 4, + ], + [ + 0, + 11, + 0, + ], + [ + 0, + 11, + 1, + ], + [ + 0, + 11, + 2, + ], + [ + 0, + 11, + 3, + ], + [ + 0, + 11, + 4, + ], + [ + 0, + 12, + 0, + ], + [ + 0, + 12, + 1, + ], + [ + 0, + 12, + 2, + ], + [ + 0, + 12, + 3, + ], + [ + 0, + 12, + 4, + ], + [ + 0, + 13, + 0, + ], + [ + 0, + 13, + 1, + ], + [ + 0, + 13, + 2, + ], + [ + 0, + 13, + 3, + ], + [ + 0, + 13, + 4, + ], + [ + 0, + 14, + 0, + ], + [ + 0, + 14, + 1, + ], + [ + 0, + 14, + 2, + ], + [ + 0, + 14, + 3, + ], + [ + 0, + 14, + 4, + ], + [ + 0, + 15, + 0, + ], + [ + 0, + 15, + 1, + ], + [ + 0, + 15, + 2, + ], + [ + 0, + 15, + 3, + ], + [ + 0, + 15, + 4, + ], + [ + 0, + 16, + 0, + ], + [ + 0, + 16, + 1, + ], + [ + 0, + 16, + 2, + ], + [ + 0, + 16, + 3, + ], + [ + 0, + 16, + 4, + ], + [ + 0, + 17, + 0, + ], + [ + 0, + 17, + 1, + ], + [ + 0, + 17, + 2, + ], + [ + 0, + 17, + 3, + ], + [ + 0, + 17, + 4, + ], + [ + 0, + 18, + 0, + ], + [ + 0, + 18, + 1, + ], + [ + 0, + 18, + 2, + ], + [ + 0, + 18, + 3, + ], + [ + 0, + 18, + 4, + ], + [ + 0, + 19, + 0, + ], + [ + 0, + 19, + 1, + ], + [ + 0, + 19, + 2, + ], + [ + 0, + 19, + 3, + ], + [ + 0, + 19, + 4, + ], +] +`; + +exports[`building should test client 1`] = ` +Array [ + Array [ + 0, + 10, + 0, + ], + Array [ + 0, + 10, + 1, + ], + Array [ + 0, + 10, + 2, + ], + Array [ + 0, + 10, + 3, + ], + Array [ + 0, + 10, + 4, + ], + Array [ + 0, + 11, + 0, + ], + Array [ + 0, + 11, + 1, + ], + Array [ + 0, + 11, + 2, + ], + Array [ + 0, + 11, + 3, + ], + Array [ + 0, + 11, + 4, + ], + Array [ + 0, + 12, + 0, + ], + Array [ + 0, + 12, + 1, + ], + Array [ + 0, + 12, + 2, + ], + Array [ + 0, + 12, + 3, + ], + Array [ + 0, + 12, + 4, + ], + Array [ + 0, + 13, + 0, + ], + Array [ + 0, + 13, + 1, + ], + Array [ + 0, + 13, + 2, + ], + Array [ + 0, + 13, + 3, + ], + Array [ + 0, + 13, + 4, + ], + Array [ + 0, + 14, + 0, + ], + Array [ + 0, + 14, + 1, + ], + Array [ + 0, + 14, + 2, + ], + Array [ + 0, + 14, + 3, + ], + Array [ + 0, + 14, + 4, + ], + Array [ + 0, + 15, + 0, + ], + Array [ + 0, + 15, + 1, + ], + Array [ + 0, + 15, + 2, + ], + Array [ + 0, + 15, + 3, + ], + Array [ + 0, + 15, + 4, + ], + Array [ + 0, + 16, + 0, + ], + Array [ + 0, + 16, + 1, + ], + Array [ + 0, + 16, + 2, + ], + Array [ + 0, + 16, + 3, + ], + Array [ + 0, + 16, + 4, + ], + Array [ + 0, + 17, + 0, + ], + Array [ + 0, + 17, + 1, + ], + Array [ + 0, + 17, + 2, + ], + Array [ + 0, + 17, + 3, + ], + Array [ + 0, + 17, + 4, + ], + Array [ + 0, + 18, + 0, + ], + Array [ + 0, + 18, + 1, + ], + Array [ + 0, + 18, + 2, + ], + Array [ + 0, + 18, + 3, + ], + Array [ + 0, + 18, + 4, + ], + Array [ + 0, + 19, + 0, + ], + Array [ + 0, + 19, + 1, + ], + Array [ + 0, + 19, + 2, + ], + Array [ + 0, + 19, + 3, + ], + Array [ + 0, + 19, + 4, + ], +] +`; diff --git a/src/__test__/utils/__test__/builders.test.ts b/src/__test__/utils/__test__/builders.test.ts new file mode 100644 index 00000000..b2ec1e33 --- /dev/null +++ b/src/__test__/utils/__test__/builders.test.ts @@ -0,0 +1,58 @@ +import { buildRandomVectors, getFwVersionsList, buildEvmReq } from '../builders'; + +describe('building', () => { + test('should test client', () => { + expect(getFwVersionsList()).toMatchSnapshot(); + }); + + test('RANDOM_VEC', () => { + const RANDOM_VEC = buildRandomVectors(10); + expect(RANDOM_VEC).toMatchInlineSnapshot(` + [ + "9f2c1f8", + "334e3bf5", + "3748e38b", + "3b2f82b", + "1eecc588", + "36b9be74", + "332c1296", + "2afaf74c", + "1121991", + "2851e10c", + ] + `); + }); + + + test('buildEvmReq', () => { + const testObj = buildEvmReq({ common: 'test', data: { payload: 'test' }, txData: { data: 'test', type: undefined } }); + expect(testObj).toMatchInlineSnapshot(` + { + "common": "test", + "data": { + "curveType": 0, + "encodingType": 4, + "hashType": 1, + "payload": "test", + "signerPath": [ + 2147483692, + 2147483708, + 2147483648, + 0, + 0, + ], + }, + "txData": { + "data": "test", + "gasLimit": 50000, + "maxFeePerGas": 1200000000, + "maxPriorityFeePerGas": 1200000000, + "nonce": 0, + "to": "0xe242e54155b1abc71fc118065270cecaaf8b7768", + "type": undefined, + "value": 100, + }, + } + `); + }); +}); diff --git a/src/__test__/utils/__test__/serializers.test.ts b/src/__test__/utils/__test__/serializers.test.ts new file mode 100644 index 00000000..86b5929d --- /dev/null +++ b/src/__test__/utils/__test__/serializers.test.ts @@ -0,0 +1,77 @@ +import { deserializeObjectWithBuffers, serializeObjectWithBuffers } from '../serializers'; + +describe('serializers', () => { + + test('serialize obj', () => { + const obj = { + a: 1, + b: Buffer.from('test'), + c: { + d: 2, + e: Buffer.from('test'), + } + }; + const serialized = serializeObjectWithBuffers(obj); + expect(serialized).toMatchInlineSnapshot(` + { + "a": 1, + "b": { + "isBuffer": true, + "value": "74657374", + }, + "c": { + "d": 2, + "e": { + "isBuffer": true, + "value": "74657374", + }, + }, + } + `) + }) + + test('deserialize obj', () => { + const obj = { + 'a': 1, + 'b': { + 'isBuffer': true, + 'value': '74657374', + }, + 'c': { + 'd': 2, + 'e': { + 'isBuffer': true, + 'value': '74657374', + }, + }, + } + + const serialized = deserializeObjectWithBuffers(obj); + expect(serialized).toMatchInlineSnapshot(` + { + "a": 1, + "b": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + "c": { + "d": 2, + "e": { + "data": [ + 116, + 101, + 115, + 116, + ], + "type": "Buffer", + }, + }, + } + `) + }) +}) \ No newline at end of file diff --git a/src/__test__/utils/builders.ts b/src/__test__/utils/builders.ts new file mode 100644 index 00000000..4594d115 --- /dev/null +++ b/src/__test__/utils/builders.ts @@ -0,0 +1,353 @@ +import Common, { Chain, Hardfork } from '@ethereumjs/common'; +import { + TransactionFactory as EthTxFactory, + TypedTransaction +} from '@ethereumjs/tx'; +import { AbiCoder } from '@ethersproject/abi'; +import { keccak256 } from 'js-sha3'; +import randomWords from 'random-words'; +import { decode as rlpDecode } from 'rlp'; +import { Client } from '../../client'; +import { Calldata, Constants } from '../..'; +import { CURRENCIES, HARDENED_OFFSET } from '../../constants'; +import { getP256KeyPair, randomBytes } from '../../util'; +import { TestRequestPayload } from '../../types/utils'; +import { MSG_PAYLOAD_METADATA_SZ } from './constants'; +import { convertDecoderToEthers } from './ethers'; +import { getN, getPrng } from './getters'; +import { + BTC_PURPOSE_P2PKH, + buildRandomEip712Object, + copyBuffer, + ETH_COIN, + serializeJobData +} from './helpers'; + +export const getFwVersionsList = () => { + const arr: number[][] = []; + Array.from({ length: 1 }, (x, i) => { + Array.from({ length: 10 }, (y, j) => { + Array.from({ length: 5 }, (z, k) => { + arr.push([i, j + 10, k]); + }); + }); + }); + return arr; +}; + +export const buildFirmwareConstants = (...overrides: any) => { + return { + abiCategorySz: 32, + abiMaxRmv: 200, + addrFlagsAllowed: true, + allowBtcLegacyAndSegwitAddrs: true, + allowedEthTxTypes: [1, 2], + contractDeployKey: '0x08002e0fec8e6acf00835f43c9764f7364fa3f42', + eip712MaxTypeParams: 36, + eip712Supported: true, + ethMaxDataSz: 1519, + ethMaxGasPrice: 20000000000000, + ethMaxMsgSz: 1540, + ethMsgPreHashAllowed: true, + extraDataFrameSz: 1500, + extraDataMaxFrames: 1, + genericSigning: { + baseReqSz: 1552, + baseDataSz: 1519, + hashTypes: { NONE: 0, KECCAK256: 1, SHA256: 2 }, + curveTypes: { SECP256K1: 0, ED25519: 1 }, + encodingTypes: { NONE: 1, SOLANA: 2, TERRA: 3, EVM: 4 }, + calldataDecoding: { reserved: 2895728, maxSz: 1024 }, + }, + getAddressFlags: [4, 3], + kvActionMaxNum: 10, + kvActionsAllowed: true, + kvKeyMaxStrSz: 63, + kvRemoveMaxNum: 100, + kvValMaxStrSz: 63, + maxDecoderBufSz: 1600, + personalSignHeaderSz: 72, + prehashAllowed: true, + reqMaxDataSz: 1678, + varAddrPathSzAllowed: true, + ...overrides, + } as FirmwareConstants; +}; + +export const buildGetAddressesObject = ({ ...overrides }) => ({ + startPath: [0x80000000 + 44, 0x80000000 + 60, 0x80000000, 0, 0], + n: 1, + flag: 1, + url: 'asdf', + fwVersion: Buffer.from([0, 12, 0]), + wallet: { + uid: Buffer.from('test'), + name: Buffer.from('test'), + capabilities: 1, + external: true, + }, + ephemeralPub: Buffer.from('test'), + sharedSecret: Buffer.from('test'), + ...overrides, +}); + +export const buildTransactionObject = ({ + ...overrides +}) => ({ + data: { + to: '0xc0c8f96C2fE011cc96770D2e37CfbfeAFB585F0e', + from: '0xc0c8f96C2fE011cc96770D2e37CfbfeAFB585F0e', + value: 0x80000000, + data: 0x0, + signerPath: [0x80000000 + 44, 0x80000000 + 60, 0x80000000, 0, 0], + nonce: 0x80000000, + gasLimit: 0x80000000, + gasPrice: 0x80000000, + }, + request: { payload: Buffer.from('test') }, + fwConstants: buildFirmwareConstants({ reqMaxDataSz: 10 }), + currency: CURRENCIES.ETH as Currency, + fwVersion: Buffer.from([0, 0, 0]), + wallet: { + uid: Buffer.from('test'), + name: Buffer.from('test'), + capabilities: 1, + external: true, + }, + ...overrides, +}); + +export const buildSharedSecret = () => { + return Buffer.from([ + 89, 60, 130, 80, 168, 252, 34, 136, 230, 71, 230, 158, 51, 13, 239, 237, 6, + 246, 71, 232, 232, 175, 193, 106, 106, 185, 38, 1, 163, 14, 225, 101, + ]); +}; + +export const getNumIter = (n: number | string | undefined = getN()) => + n ? parseInt(`${n}`) : 20; + +/** Generate a bunch of random test vectors using the PRNG */ +export const buildRandomVectors = (n: number | string | undefined = getN()) => { + const numIter = getNumIter(n); + + const prng = getPrng(); + // Generate a bunch of random test vectors using the PRNG + const RANDOM_VEC: any[] = []; + for (let i = 0; i < numIter; i++) { + RANDOM_VEC.push(Math.floor(1000000000 * prng.quick()).toString(16)); + } + return RANDOM_VEC; +}; + +export const buildTestRequestPayload = ( + client: Client, + jobType: number, + jobData: any, +): TestRequestPayload => { + const activeWalletUID = copyBuffer(client.getActiveWallet()?.uid); + return { + client, + testID: 0, // wallet_job test ID + payload: serializeJobData(jobType, activeWalletUID, jobData), + }; +}; + +export const DEFAULT_SIGNER = [ + BTC_PURPOSE_P2PKH, + ETH_COIN, + HARDENED_OFFSET, + 0, + 0, +]; + +export const buildTx = (data = '0xdeadbeef') => { + return EthTxFactory.fromTxData( + { + type: 2, + maxFeePerGas: 1200000000, + maxPriorityFeePerGas: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 100, + data, + }, + { + common: new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }), + }, + ); +}; + +export const buildEthSignRequest = async ( + client: Client +): Promise => { + if (client.getFwVersion()?.major === 0 && client.getFwVersion()?.minor < 15) { + console.warn('Please update firmware. Skipping ETH signing tests.'); + return; + } + + const fwConstants = client.getFwConstants(); + const signerPath = [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET, 0, 0]; + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }); + const txData = { + type: 2, + maxFeePerGas: 1200000000, + maxPriorityFeePerGas: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 1000000000000, + data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8', + }; + const tx = EthTxFactory.fromTxData(txData, { common }); + const req = { + data: { + signerPath, + payload: tx.getMessageToSign(false), + curveType: Constants.SIGNING.CURVES.SECP256K1, + hashType: Constants.SIGNING.HASHES.KECCAK256, + encodingType: Constants.SIGNING.ENCODINGS.EVM, + }, + }; + const maxDataSz = + fwConstants.ethMaxDataSz + + fwConstants.extraDataMaxFrames * fwConstants.extraDataFrameSz; + return { + fwConstants, + signerPath, + common, + txData, + tx, + req, + maxDataSz, + }; +}; + +export const buildTxReq = (tx: TypedTransaction) => ({ + data: { + signerPath: DEFAULT_SIGNER, + payload: tx.getMessageToSign(false), + curveType: Constants.SIGNING.CURVES.SECP256K1, + hashType: Constants.SIGNING.HASHES.KECCAK256, + encodingType: Constants.SIGNING.ENCODINGS.EVM, + }, +}); + +export const buildMsgReq = ( + payload = 'hello ethereum', + protocol = 'signPersonal', +) => ({ + currency: 'ETH_MSG', + data: { + signerPath: DEFAULT_SIGNER, + protocol, + payload, + }, +}); + +export const buildEvmReq = (overrides?: { + data?: any; + txData?: any; + common?: any; +}) => { + const req = { + data: { + signerPath: DEFAULT_SIGNER, + curveType: Constants.SIGNING.CURVES.SECP256K1, + hashType: Constants.SIGNING.HASHES.KECCAK256, + encodingType: Constants.SIGNING.ENCODINGS.EVM, + payload: null, + ...overrides?.data, + }, + txData: { + type: 2, + maxFeePerGas: 1200000000, + maxPriorityFeePerGas: 1200000000, + nonce: 0, + gasLimit: 50000, + to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', + value: 100, + data: '0xdeadbeef', + ...overrides?.txData, + }, + common: overrides?.common + ? overrides.common + : new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }), + }; + return req; +}; + +export const buildEncDefs = (vectors: any) => { + const coder = new AbiCoder(); + const EVMCalldata = Calldata.EVM; + const encDefs: any[] = []; + const encDefsCalldata: any[] = []; + for (let i = 0; i < vectors.canonicalNames.length; i++) { + const name = vectors.canonicalNames[i]; + const selector = `0x${keccak256(name).slice(0, 8)}`; + const encDef = EVMCalldata.parsers.parseCanonicalName(selector, name); + encDefs.push(encDef); + const { types, data } = convertDecoderToEthers(rlpDecode(encDef).slice(1)); + const calldata = coder.encode(types, data); + encDefsCalldata.push(`${selector}${calldata.slice(2)}`); + } + return { encDefs, encDefsCalldata }; +}; + +export function buildRandomMsg (type = 'signPersonal', client: Client) { + function randInt (n: number) { + const prng = getPrng(); + return Math.floor(n * prng.quick()); + } + + if (type === 'signPersonal') { + // A random string will do + const isHexStr = randInt(2) > 0 ? true : false; + const fwConstants = client.getFwConstants(); + const L = randInt(fwConstants.ethMaxDataSz - MSG_PAYLOAD_METADATA_SZ); + if (isHexStr) return `0x${randomBytes(L).toString('hex')}`; + // Get L hex bytes (represented with a string with 2*L chars) + else return randomWords({ exactly: L, join: ' ' }).slice(0, L); // Get L ASCII characters (bytes) + } else if (type === 'eip712') { + return buildRandomEip712Object(randInt); + } +} + +export function buildEthMsgReq ( + payload: any, + protocol: string, + signerPath = [BTC_PURPOSE_P2PKH, ETH_COIN, HARDENED_OFFSET, 0, 0] as SigningPath, +): SignRequestParams { + return { + currency: CURRENCIES.ETH_MSG, + data: { + signerPath, + payload, + protocol, + }, + }; +} + +export const buildValidateConnectObject = ({ ...overrides }) => ({ + deviceId: 'test', + key: getP256KeyPair(Buffer.from('test')), + baseUrl: 'https://gridpl.us', + ...overrides, +}); + +export const buildValidateRequestObject = ({ ...overrides }) => ({ + url: 'test.com', + fwConstants: { kvActionsAllowed: true }, + sharedSecret: Buffer.from('test'), + ...overrides, +}); diff --git a/src/__test__/utils/constants.ts b/src/__test__/utils/constants.ts new file mode 100644 index 00000000..fb0daad1 --- /dev/null +++ b/src/__test__/utils/constants.ts @@ -0,0 +1 @@ +export const MSG_PAYLOAD_METADATA_SZ = 28; // Metadata that must go in ETH_MSG requests diff --git a/src/__test__/utils/determinism.ts b/src/__test__/utils/determinism.ts new file mode 100644 index 00000000..bced61b0 --- /dev/null +++ b/src/__test__/utils/determinism.ts @@ -0,0 +1,95 @@ +import { TypedTransaction } from '@ethereumjs/tx'; +import bip32 from 'bip32'; +import { mnemonicToSeedSync } from 'bip39'; +import { ecsign, privateToAddress } from 'ethereumjs-util'; +import { keccak256 } from 'js-sha3'; +import { Client } from '../../client'; +import { TestRequestPayload } from '../../types/utils'; +import { buildTestRequestPayload } from './builders'; +import { + ethPersonalSignMsg, getPathStr, getSigStr, jobTypes +} from './helpers'; + + +const TEST_MNEMONIC = + 'nose elder baby marriage frequent list ' + + 'cargo swallow memory universe smooth involve ' + + 'iron purity throw vintage crew artefact ' + + 'pyramid dash split announce trend grain'; + +export const TEST_SEED = mnemonicToSeedSync(TEST_MNEMONIC); + +export function setupJob ( + type: number, + client: Client, + seed?: Buffer, +): TestRequestPayload { + if (type === jobTypes.WALLET_JOB_EXPORT_SEED) { + return buildTestRequestPayload(client, type, {}); + } else if (type === jobTypes.WALLET_JOB_DELETE_SEED) { + return buildTestRequestPayload(client, type, { + iface: 1, + }); + } else if (type === jobTypes.WALLET_JOB_LOAD_SEED) { + return buildTestRequestPayload(client, type, { + iface: 1, // external SafeCard interface + seed, + exportability: 2, // always exportable + }); + } + return buildTestRequestPayload(client, type, {}); +} + +export async function testUniformSigs ( + payload: any, + tx: TypedTransaction, + client: Client, +) { + const tx1Resp = await client.sign(payload); + const tx2Resp = await client.sign(payload); + const tx3Resp = await client.sign(payload); + const tx4Resp = await client.sign(payload); + const tx5Resp = await client.sign(payload); + // Check sig 1 + expect(getSigStr(tx1Resp, tx)).toEqual(getSigStr(tx2Resp, tx)); + expect(getSigStr(tx1Resp, tx)).toEqual(getSigStr(tx3Resp, tx)); + expect(getSigStr(tx1Resp, tx)).toEqual(getSigStr(tx4Resp, tx)); + expect(getSigStr(tx1Resp, tx)).toEqual(getSigStr(tx5Resp, tx)); + // Check sig 2 + expect(getSigStr(tx2Resp, tx)).toEqual(getSigStr(tx1Resp, tx)); + expect(getSigStr(tx2Resp, tx)).toEqual(getSigStr(tx3Resp, tx)); + expect(getSigStr(tx2Resp, tx)).toEqual(getSigStr(tx4Resp, tx)); + expect(getSigStr(tx2Resp, tx)).toEqual(getSigStr(tx5Resp, tx)); + // Check sig 3 + expect(getSigStr(tx3Resp, tx)).toEqual(getSigStr(tx1Resp, tx)); + expect(getSigStr(tx3Resp, tx)).toEqual(getSigStr(tx2Resp, tx)); + expect(getSigStr(tx3Resp, tx)).toEqual(getSigStr(tx4Resp, tx)); + expect(getSigStr(tx3Resp, tx)).toEqual(getSigStr(tx5Resp, tx)); + // Check sig 4 + expect(getSigStr(tx4Resp, tx)).toEqual(getSigStr(tx1Resp, tx)); + expect(getSigStr(tx4Resp, tx)).toEqual(getSigStr(tx2Resp, tx)); + expect(getSigStr(tx4Resp, tx)).toEqual(getSigStr(tx3Resp, tx)); + expect(getSigStr(tx4Resp, tx)).toEqual(getSigStr(tx5Resp, tx)); + // Check sig 5 + expect(getSigStr(tx5Resp, tx)).toEqual(getSigStr(tx1Resp, tx)); + expect(getSigStr(tx5Resp, tx)).toEqual(getSigStr(tx2Resp, tx)); + expect(getSigStr(tx5Resp, tx)).toEqual(getSigStr(tx3Resp, tx)); + expect(getSigStr(tx5Resp, tx)).toEqual(getSigStr(tx4Resp, tx)); +} + + +export function deriveAddress (seed: Buffer, path: WalletPath) { + const wallet = bip32.fromSeed(seed); + const priv = wallet.derivePath(getPathStr(path)).privateKey; + return `0x${privateToAddress(priv).toString('hex')}`; +} + +export function signPersonalJS (_msg: string, path: WalletPath) { + const wallet = bip32.fromSeed(TEST_SEED); + const priv = wallet.derivePath(getPathStr(path)).privateKey; + const msg = ethPersonalSignMsg(_msg); + const hash = new Uint8Array(Buffer.from(keccak256(msg), 'hex')) as Buffer; + const sig = ecsign(hash, priv); + const v = (sig.v - 27).toString(16).padStart(2, '0'); + return `${sig.r.toString('hex')}${sig.s.toString('hex')}${v}`; +} diff --git a/src/__test__/utils/ethers.ts b/src/__test__/utils/ethers.ts new file mode 100644 index 00000000..fc5df514 --- /dev/null +++ b/src/__test__/utils/ethers.ts @@ -0,0 +1,146 @@ +const EVM_TYPES = [ + null, + 'address', + 'bool', + 'uint', + 'int', + 'bytes', + 'string', + 'tuple', +]; + +export function convertDecoderToEthers (def) { + const converted = getConvertedDef(def); + const types: any[] = [] + const data: any[] = []; + converted.forEach((i: any) => { + types.push(i.type); + data.push(i.data); + }); + return { types, data }; +} + + +// Convert an encoded def into a combination of ethers-compatable +// type names and data fields. The data should be random but it +// doesn't matter much for these tests, which mainly just test +// structure of the definitions +function getConvertedDef (def) { + const converted: any[] = []; + def.forEach((param) => { + const arrSzs = param[3]; + const evmType = EVM_TYPES[parseInt(param[1].toString('hex'), 16)]; + let type = evmType; + const numBytes = parseInt(param[2].toString('hex'), 16); + if (numBytes > 0) { + type = `${type}${numBytes * 8}`; + } + // Handle tuples by recursively generating data + let tupleData; + if (evmType === 'tuple') { + tupleData = []; + type = `${type}(`; + const tupleDef = getConvertedDef(param[4]); + tupleDef.forEach((tupleParam: any) => { + type = `${type}${tupleParam.type}, `; + tupleData.push(tupleParam.data); + }); + type = type.slice(0, type.length - 2); + type = `${type})`; + } + // Get the data of a single function (i.e. excluding arrays) + const funcData = tupleData ? tupleData : genParamData(param); + // Apply the data to arrays + for (let i = 0; i < arrSzs.length; i++) { + const sz = parseInt(arrSzs[i].toString('hex')); + if (isNaN(sz)) { + // This is a 0 size, which means we need to + // define a size to generate data + type = `${type}[]`; + } else { + type = `${type}[${sz}]`; + } + } + // If this param is a tuple we need to copy base data + // across all dimensions. The individual params are already + // arraified this way, but not the tuple type + if (tupleData) { + converted.push({ type, data: getArrayData(param, funcData) }); + } else { + converted.push({ type, data: funcData }); + } + }); + return converted; +} + +function genTupleData (tupleParam) { + const nestedData: any = []; + tupleParam.forEach((nestedParam) => { + nestedData.push( + genData( + EVM_TYPES[parseInt(nestedParam[1].toString('hex'), 16)] ?? '', + nestedParam, + ), + ); + }); + return nestedData; +} + +function genParamData (param: any[]) { + const evmType = EVM_TYPES[parseInt(param[1].toString('hex'), 16)] ?? ''; + const baseData = genData(evmType, param); + return getArrayData(param, baseData); +} + +function getArrayData (param: any, baseData: any) { + let arrayData, data; + const arrSzs = param[3]; + for (let i = 0; i < arrSzs.length; i++) { + // let sz = parseInt(arrSzs[i].toString('hex')); TODO: fix this + const dimData: any = []; + let sz = parseInt(param[3][i].toString('hex')); + if (isNaN(sz)) { + sz = 2; //1; + } + if (!arrayData) { + arrayData = []; + } + const lastDimData = JSON.parse(JSON.stringify(arrayData)); + for (let j = 0; j < sz; j++) { + if (i === 0) { + dimData.push(baseData); + } else { + dimData.push(lastDimData); + } + } + arrayData = dimData; + } + if (!data) { + data = arrayData ? arrayData : baseData; + } + return data; +} + +function genData (type: string, param: any[]) { + switch (type) { + case 'address': + return '0xdead00000000000000000000000000000000beef'; + case 'bool': + return true; + case 'uint': + return 9; + case 'int': + return -9; + case 'bytes': + return '0xdeadbeef'; + case 'string': + return 'string'; + case 'tuple': + if (!param || param.length < 4) { + throw new Error('Invalid tuple data'); + } + return genTupleData(param[4]); + default: + throw new Error('Unrecognized type'); + } +} diff --git a/src/__test__/utils/getters.ts b/src/__test__/utils/getters.ts new file mode 100644 index 00000000..92e7eb78 --- /dev/null +++ b/src/__test__/utils/getters.ts @@ -0,0 +1,16 @@ +import seedrandom from 'seedrandom'; + +export const getEnv = () => { + if (!process.env) throw new Error('env cannot be found'); + return process.env +} +export const getDeviceId = (): string => getEnv()['DEVICE_ID'] ?? ''; +export const getN = (): number => parseInt(getEnv()['N'] ?? '20'); +export const getSeed = (): string => getEnv()['SEED'] ?? 'myrandomseed'; +export const getTestnet = (): string => getEnv()['TESTNET'] ?? ''; +export const getEtherscanKey = (): string => getEnv()['ETHERSCAN_KEY'] ?? ''; + +export const getPrng = (seed?: string) => { + // @ts-expect-error -- @types/seedrandom is inaccurate + return new seedrandom(seed ? seed : getSeed()); +}; \ No newline at end of file diff --git a/test/testUtil/helpers.ts b/src/__test__/utils/helpers.ts similarity index 90% rename from test/testUtil/helpers.ts rename to src/__test__/utils/helpers.ts index 7b4c198c..0dc9b6db 100644 --- a/test/testUtil/helpers.ts +++ b/src/__test__/utils/helpers.ts @@ -1,7 +1,6 @@ import bip32 from 'bip32'; import { wordlists } from 'bip39'; import bitcoin from 'bitcoinjs-lib'; -import { expect } from 'chai'; import { derivePath as deriveEDKey, getPublicKey as getEDPubkey, @@ -15,9 +14,13 @@ import { BIP_CONSTANTS, ethMsgProtocol, HARDENED_OFFSET, -} from '../../src/constants'; -import { Client, Constants } from '../../src/index'; -import { getV, parseDER, randomBytes } from '../../src/util'; +} from '../../constants'; +import { Constants } from '../..'; + +// import { Client } from '../../../client/index'; +import { getV, parseDER, randomBytes } from '../../util'; +import { Client } from '../../client'; +import { TypedTransaction } from '@ethereumjs/tx'; const SIGHASH_ALL = 0x01; const secp256k1 = new EC('secp256k1'); const ed25519 = new EdDSA('ed25519'); @@ -32,8 +35,10 @@ export const BTC_PURPOSE_P2PKH = BIP_CONSTANTS.PURPOSES.BTC_LEGACY; export const BTC_COIN = BIP_CONSTANTS.COINS.BTC; export const BTC_TESTNET_COIN = BIP_CONSTANTS.COINS.BTC_TESTNET; export const ETH_COIN = BIP_CONSTANTS.COINS.ETH; +export const REUSABLE_KEY = + '3fb53b677f73e4d2b8c89c303f6f6b349f0075ad88ea126cb9f6632085815dca'; -function setupTestClient (env, stateData = null) { +export function setupTestClient (env = process.env as any, stateData?: any): Client { if (stateData) { return new Client({ stateData }); } @@ -42,8 +47,7 @@ function setupTestClient (env, stateData = null) { baseUrl: env.baseUrl || 'https://signing.gridpl.us', timeout: 120000, }; - const REUSABLE_KEY = - '3fb53b677f73e4d2b8c89c303f6f6b349f0075ad88ea126cb9f6632085815dca'; + // If the user passes a deviceID in the env, we assume they have previously // connected to the Lattice. if (env.DEVICE_ID) { @@ -60,17 +64,17 @@ function setupTestClient (env, stateData = null) { return client; } -const unharden = (x) => { +export const unharden = (x) => { return x >= HARDENED_OFFSET ? x - HARDENED_OFFSET : x; }; -const buildPath = (purpose, currencyIdx, signerIdx, change = 0) => { +export const buildPath = (purpose, currencyIdx, signerIdx, change = 0) => { return `m/${unharden(purpose)}'/${unharden( currencyIdx, )}'/0'/${change}/${signerIdx}`; }; -function _getSumInputs(inputs) { +export function _getSumInputs (inputs) { let sum = 0; inputs.forEach((input) => { sum += input.value; @@ -78,7 +82,7 @@ function _getSumInputs(inputs) { return sum; } -function _get_btc_addr(pubkey, purpose, network) { +export function _get_btc_addr (pubkey, purpose, network) { let obj; if (purpose === BTC_PURPOSE_P2SH_P2WPKH) { // Wrapped segwit requires p2sh wrapping @@ -95,7 +99,7 @@ function _get_btc_addr(pubkey, purpose, network) { return obj.address; } -function _start_tx_builder( +export function _start_tx_builder ( wallet, recipient, value, @@ -140,8 +144,8 @@ function _start_tx_builder( return txb; } -function _build_sighashes(txb, purpose) { - const hashes = []; +function _build_sighashes (txb, purpose) { + const hashes: any = []; txb.__inputs.forEach((input, i) => { if (purpose === BTC_PURPOSE_P2PKH) { hashes.push(txb.__tx.hashForSignature(i, input.signScript, SIGHASH_ALL)); @@ -159,7 +163,7 @@ function _build_sighashes(txb, purpose) { return hashes; } -function _get_reference_sighashes( +function _get_reference_sighashes ( wallet, recipient, value, @@ -205,7 +209,7 @@ function _get_reference_sighashes( return _build_sighashes(txb, purpose); } -function _btc_tx_request_builder( +function _btc_tx_request_builder ( inputs, recipient, value, @@ -215,7 +219,7 @@ function _btc_tx_request_builder( ) { const currencyIdx = isTestnet ? BTC_TESTNET_COIN : BTC_COIN; const txData = { - prevOuts: [], + prevOuts: [] as any[], recipient, value, fee, @@ -236,7 +240,7 @@ function _btc_tx_request_builder( } // Convert DER signature to buffer of form `${r}${s}` -function stripDER(derSig) { +export function stripDER (derSig) { const parsed = parseDER(derSig); parsed.s = Buffer.from(parsed.s.slice(-32)); parsed.r = Buffer.from(parsed.r.slice(-32)); @@ -246,9 +250,9 @@ function stripDER(derSig) { return sig; } -function _get_signing_keys(wallet, inputs, isTestnet, purpose) { +function _get_signing_keys (wallet, inputs, isTestnet, purpose) { const currencyIdx = isTestnet === true ? 1 : 0; - const keys = []; + const keys: any = []; inputs.forEach((input) => { const path = buildPath(purpose, currencyIdx, input.signerIdx); keys.push(wallet.derivePath(path)); @@ -256,7 +260,7 @@ function _get_signing_keys(wallet, inputs, isTestnet, purpose) { return keys; } -function _generate_btc_address(isTestnet, purpose, rand) { +function _generate_btc_address (isTestnet, purpose, rand) { const priv = Buffer.alloc(32); for (let j = 0; j < 8; j++) { // 32 bits of randomness per call @@ -268,7 +272,7 @@ function _generate_btc_address(isTestnet, purpose, rand) { return _get_btc_addr(keyPair.publicKey, purpose, network); } -function setup_btc_sig_test(opts, wallet, inputs, rand) { +export function setup_btc_sig_test (opts, wallet, inputs, rand) { const { isTestnet, useChange, spenderPurpose, recipientPurpose } = opts; const recipient = _generate_btc_address(isTestnet, recipientPurpose, rand); const sumInputs = _getSumInputs(inputs); @@ -532,8 +536,9 @@ export const serializeGetAddressesJobData = function (data) { export const deserializeGetAddressesJobResult = function (res) { let off = 0; const getAddrResult = { - count: null, - addresses: [], + count: 0, + addresses: [] as any[], + pubOnly: undefined }; getAddrResult.pubOnly = res.readUInt8(off); off += 1; @@ -557,7 +562,7 @@ export const validateBTCAddresses = function ( seed, useTestnet?, ) { - expect(resp.count).to.equal(jobData.count); + expect(resp.count).toEqual(jobData.count); const wallet = bip32.fromSeed(seed); const path = JSON.parse(JSON.stringify(jobData.parent)); path.pathDepth = jobData.parent.pathDepth + 1; @@ -582,15 +587,15 @@ export const validateBTCAddresses = function ( // This is the default and any unrecognized purpose will yield a legacy address. address = bitcoin.payments.p2pkh({ pubkey, network }).address; } - expect(address).to.equal(resp.addresses[i - jobData.first]); + expect(address).toEqual(resp.addresses[i - jobData.first]); } }; export const validateETHAddresses = function (resp, jobData, seed) { - expect(resp.count).to.equal(jobData.count); + expect(resp.count).toEqual(jobData.count); // Confirm it is an Ethereum address - expect(resp.addresses[0].slice(0, 2)).to.equal('0x'); - expect(resp.addresses[0].length).to.equal(42); + expect(resp.addresses[0].slice(0, 2)).toEqual('0x'); + expect(resp.addresses[0].length).toEqual(42); // Confirm we can derive the same address from the previously exported seed const wallet = bip32.fromSeed(seed); const path = JSON.parse(JSON.stringify(jobData.parent)); @@ -599,7 +604,7 @@ export const validateETHAddresses = function (resp, jobData, seed) { path.addr = i; const priv = wallet.derivePath(stringifyPath(path)).privateKey; const addr = `0x${privateToAddress(priv).toString('hex')}`; - expect(addr).to.equal(resp.addresses[i - jobData.first]); + expect(addr).toEqual(resp.addresses[i - jobData.first]); } }; @@ -607,7 +612,7 @@ export const validateDerivedPublicKeys = function ( pubKeys, firstPath, seed, - flag = null, + flag?: number, ) { const wallet = bip32.fromSeed(seed); // We assume the keys were derived in sequential order @@ -617,15 +622,15 @@ export const validateDerivedPublicKeys = function ( if (flag === Constants.GET_ADDR_FLAGS.ED25519_PUB) { // ED25519 requires its own derivation const key = deriveED25519Key(path, seed); - expect(pub.toString('hex')).to.equal( + expect(pub.toString('hex')).toEqualElseLog( key.pub.toString('hex'), 'Exported ED25519 pubkey incorrect', ); } else { // Otherwise this is a SECP256K1 pubkey const priv = wallet.derivePath(getPathStr(path)).privateKey; - expect(pub.toString('hex')).to.equal( - secp256k1.keyFromPrivate(priv).getPublic().encode('hex'), + expect(pub.toString('hex')).toEqualElseLog( + secp256k1.keyFromPrivate(priv).getPublic().encode('hex', true), 'Exported SECP256K1 pubkey incorrect', ); } @@ -669,9 +674,9 @@ export const serializeSignTxJobDataLegacy = function (data) { return req; }; -export const deserializeSignTxJobResult = function (res) { +export const deserializeSignTxJobResult = function (res: any) { let off = 0; - const getTxResult = { + const getTxResult: any = { numOutputs: null, outputs: [], }; @@ -691,8 +696,8 @@ export const deserializeSignTxJobResult = function (res) { change: null, addr: null, }, - pubkey: null, - sig: null, + pubkey: null as any, + sig: null as any, }; const _o = res.slice(off, off + outputSz); off += outputSz; @@ -762,21 +767,21 @@ export const serializeLoadSeedJobData = function (data) { // Struct builders //--------------------------------------------------- export const buildRandomEip712Object = function (randInt) { - function randStr(n) { - const words = wordlists.english; + function randStr (n) { + const words = wordlists['english']; let s = ''; while (s.length < n) { - s += `${words[randInt(words.length)]}_`; + s += `${words?.[randInt(words?.length)]}_`; } return s.slice(0, n); } - function getRandomName(upperCase = false, sz = 20) { + function getRandomName (upperCase = false, sz = 20) { const name = randStr(sz); if (upperCase === true) return `${name.slice(0, 1).toUpperCase()}${name.slice(1)}`; return name; } - function getRandomEIP712Type(customTypes = []) { + function getRandomEIP712Type (customTypes: any[] = []) { const types = Object.keys(customTypes).concat( Object.keys(ethMsgProtocol.TYPED_DATA.typeCodes), ); @@ -785,7 +790,7 @@ export const buildRandomEip712Object = function (randInt) { type: types[randInt(types.length)], }; } - function getRandomEIP712Val(type) { + function getRandomEIP712Val (type) { if (type !== 'bytes' && type.slice(0, 5) === 'bytes') { return `0x${randomBytes(parseInt(type.slice(5))).toString('hex')}`; } else if (type === 'uint' || type === 'int') { @@ -808,7 +813,7 @@ export const buildRandomEip712Object = function (randInt) { throw new Error('unsupported eip712 type'); } } - function buildCustomTypeVal(typeName, msg) { + function buildCustomTypeVal (typeName, msg) { const val = {}; const subTypes = msg.types[typeName]; subTypes.forEach((subType) => { @@ -847,7 +852,7 @@ export const buildRandomEip712Object = function (randInt) { const numDefaulTypes = 1 + randInt(3); const customTypesMap: any = {}; for (let i = 0; i < numCustomTypes; i++) { - const subTypes = []; + const subTypes: any[] = []; for (let j = 0; j < 1 + randInt(3); j++) { subTypes.push(getRandomEIP712Type(customTypesMap)); } @@ -900,7 +905,7 @@ export const validateGenericSig = function (seed, sig, payloadBuf, req) { } const { priv } = deriveSECP256K1Key(signerPath, seed); const key = secp256k1.keyFromPrivate(priv); - expect(key.verify(hash, sig)).to.equal( + expect(key.verify(hash, sig)).toEqualElseLog( true, 'Signature failed verification.', ); @@ -911,7 +916,7 @@ export const validateGenericSig = function (seed, sig, payloadBuf, req) { const { priv } = deriveED25519Key(signerPath, seed); const key = ed25519.keyFromSecret(priv); const formattedSig = `${sig.r.toString('hex')}${sig.s.toString('hex')}`; - expect(key.verify(payloadBuf, formattedSig)).to.equal( + expect(key.verify(payloadBuf, formattedSig)).toEqualElseLog( true, 'Signature failed verification.', ); @@ -925,7 +930,7 @@ export const validateGenericSig = function (seed, sig, payloadBuf, req) { * @param resp - response from Lattice. Can be either legacy or generic signing variety * @param tx - optional, an @ethereumjs/tx Transaction object */ -export const getSigStr = function (resp, tx = null) { +export const getSigStr = function (resp: any, tx?: TypedTransaction) { let v; if (resp.sig.v !== undefined) { v = (parseInt(resp.sig.v.toString('hex'), 16) - 27) @@ -953,44 +958,3 @@ export const compressPubKey = function (pub) { return compressed; } -export default { - BTC_PURPOSE_P2WPKH, - BTC_PURPOSE_P2SH_P2WPKH, - BTC_PURPOSE_P2PKH, - BTC_COIN, - BTC_TESTNET_COIN, - ETH_COIN, - harden, - jobTypes, - gpErrors, - getCodeMsg, - parseWalletJobResp, - serializeJobData, - setupTestClient, - jobResErrCode, - copyBuffer, - stringifyPath, - stripDER, - serializeGetAddressesJobData, - setup_btc_sig_test, - deserializeGetAddressesJobResult, - validateBTCAddresses, - validateETHAddresses, - validateDerivedPublicKeys, - ethPersonalSignMsg, - serializeSignTxJobDataLegacy, - deserializeSignTxJobResult, - serializeExportSeedJobData, - deserializeExportSeedJobResult, - serializeDeleteSeedJobData, - serializeLoadSeedJobData, - buildRandomEip712Object, - validateGenericSig, - deriveED25519Key, - deriveSECP256K1Key, - prandomBuf, - getPathStr, - getV, - getSigStr, - compressPubKey, -}; diff --git a/src/__test__/utils/initializeClient.ts b/src/__test__/utils/initializeClient.ts new file mode 100644 index 00000000..3931d728 --- /dev/null +++ b/src/__test__/utils/initializeClient.ts @@ -0,0 +1,48 @@ +import { question } from 'readline-sync'; +import { Client } from '../../client'; +import { buildTestRequestPayload } from './builders'; +import { getDeviceId } from './getters'; +import { deserializeExportSeedJobResult, jobTypes, parseWalletJobResp, setupTestClient } from './helpers'; +import { testRequest } from './testRequest'; + + +export const initializeClient = () => { + let id = getDeviceId() + const client = setupTestClient(); + + describe('Initializing client', () => { + beforeAll(async () => { + if (id) { + await client.connect(id); + } + }); + + it('Connecting to Lattice', async () => { + const _id = id ? id : question('Please enter the ID of your test device: '); + id = _id; + // const isPaired = await client.connect(id); + // if (!isPaired) { + // expect(client.isPaired).toEqual(false); + const secret = question('Please enter the pairing secret: '); + await client.pair(secret); + expect(!!client.getActiveWallet()).toEqual(true); + // } + // expect(isPaired).toEqual(true); + expect(client.isPaired).toEqual(true); + expect(!!client.getActiveWallet()).toEqual(true); + }); + }) + + return client +} + +export const initializeSeed = async (client: Client) => { + const jobType = jobTypes.WALLET_JOB_EXPORT_SEED; + const jobData = {}; + const testRequestPayload = buildTestRequestPayload(client, jobType, jobData); + const res = await testRequest(testRequestPayload); + const _res = parseWalletJobResp(res, client.getFwVersion()); + expect(_res.resultStatus).toEqual(0); + const data = deserializeExportSeedJobResult(_res.result); + return data.seed +} \ No newline at end of file diff --git a/src/__test__/utils/runners.ts b/src/__test__/utils/runners.ts new file mode 100644 index 00000000..f2aa4057 --- /dev/null +++ b/src/__test__/utils/runners.ts @@ -0,0 +1,146 @@ + +import { Client } from '../../client'; +import { getEncodedPayload } from '../../genericSigning'; +import { TestRequestPayload } from '../../types/utils'; +import { deriveSECP256K1Key, parseWalletJobResp, validateGenericSig } from './helpers'; +import { initializeSeed } from './initializeClient'; +import { testRequest } from './testRequest'; +import BN from 'bn.js'; +import { Constants } from '../..'; +import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; +import { encode as rlpEncode } from 'rlp'; +import { getDeviceId } from './getters'; + + +export async function runTestCase ( + payload: TestRequestPayload, + expectedCode: number, +) { + const res = await testRequest(payload); + //@ts-expect-error - Accessing private property + const fwVersion = payload.client.fwVersion; + const parsedRes = parseWalletJobResp(res, fwVersion); + expect(parsedRes.resultStatus).toEqual(expectedCode); + return parsedRes; +} + +export async function runGeneric (request: SignRequestParams, client: Client) { + const response = await client.sign(request); + // If no encoding type is specified we encode in hex or ascii + const encodingType = request.data.encodingType || null; + const allowedEncodings = client.getFwConstants().genericSigning.encodingTypes; + const { payloadBuf } = getEncodedPayload( + request.data.payload, + encodingType, + allowedEncodings, + ); + const seed = await initializeSeed(client); + validateGenericSig(seed, response.sig, payloadBuf, request.data); + return response; +} + +export async function runEvm ( + req: any, + client: Client, + bypassSetPayload = false, + shouldFail = false, + useLegacySigning = false, +) { + // Construct an @ethereumjs/tx object with data + const txData = JSON.parse(JSON.stringify(req.txData)); + const tx = EthTxFactory.fromTxData(txData, { common: req.common }); + if (useLegacySigning) { + // [TODO: Deprecate] + req.data = { + ...req.data, + ...req.txData, + }; + } + //@ts-expect-error - Accessing private property + if (tx._type === 0 && !bypassSetPayload) { + // The @ethereumjs/tx Transaction APIs differ here + // Legacy transaction + req.data.payload = rlpEncode(tx.getMessageToSign(false)); + } else if (!bypassSetPayload) { + // Newer transaction type + req.data.payload = tx.getMessageToSign(false); + } + // Request signature and validate it + await client.connect(getDeviceId()) + const resp = await client.sign(req); + const sig = resp.sig ? resp.sig : null + if (shouldFail || !sig) { + // Exit here without continuing tests. If this block is reached it indicates + // the Lattice did not throw an error when we expected it to do so. + return; + } + const encodingType = req.data.encodingType || null; + const allowedEncodings = client.getFwConstants().genericSigning.encodingTypes; + const { payloadBuf } = getEncodedPayload( + req.data.payload, + encodingType, + allowedEncodings, + ); + if (useLegacySigning) { + // [TODO: Deprecate] + req.data.curveType = Constants.SIGNING.CURVES.SECP256K1; + req.data.hashType = Constants.SIGNING.HASHES.KECCAK256; + req.data.encodingType = Constants.SIGNING.ENCODINGS.EVM; + } + const seed = await initializeSeed(client) + validateGenericSig(seed, resp.sig, payloadBuf, req.data); + // Sign the original tx and compare + const { priv } = deriveSECP256K1Key(req.data.signerPath, seed); + const signedTx: any = tx.sign(priv); + expect(signedTx.verifySignature()).toEqualElseLog( + true, + 'Signature failed to verify', + ); + const refR = Buffer.from(signedTx.r?.toBuffer()); + const refS = Buffer.from(signedTx.s?.toBuffer()); + const refV = signedTx.v; + // Get params from Lattice sig + const latticeR = Buffer.from(sig.r); + const latticeS = Buffer.from(sig.s); + const latticeV = new BN(sig.v); + // Strip off leading zeros to do an exact componenet check. + // We will still validate the original lattice sig in a tx. + const rToCheck = + latticeR.length !== refR.length + ? latticeR.slice(latticeR.length - refR.length) + : latticeR; + const sToCheck = + latticeS.length !== refS.length + ? latticeS.slice(latticeS.length - refS.length) + : latticeS; + // Validate the signature + expect(rToCheck.equals(refR)).toEqualElseLog( + true, + 'Signature R component does not match reference', + ); + expect(sToCheck.equals(refS)).toEqualElseLog( + true, + 'Signature S component does not match reference', + ); + expect(latticeV.toString()).toEqualElseLog( + refV.toString(), + 'Signature V component does not match reference', + ) + // One more check -- create a new tx with the signatre params and verify it + const signedTxData = JSON.parse(JSON.stringify(txData)); + signedTxData.v = latticeV; + signedTxData.r = latticeR; + signedTxData.s = latticeS; + const verifTx = EthTxFactory.fromTxData(signedTxData, { + common: req.common, + }); + expect(verifTx.verifySignature()).toEqualElseLog( + true, + 'Signature did not validate in recreated @ethereumjs/tx object', + ); +} + +export const runEthMsg = async (req: SignRequestParams, client: Client) => { + const sig = await client.sign(req); + expect(sig.sig).not.toEqual(null); +} \ No newline at end of file diff --git a/src/__test__/utils/serializers.ts b/src/__test__/utils/serializers.ts new file mode 100644 index 00000000..bfe4813a --- /dev/null +++ b/src/__test__/utils/serializers.ts @@ -0,0 +1,25 @@ +export const serializeObjectWithBuffers = (obj: any) => { + return Object.entries(obj).reduce((acc: any, [key, value]) => { + if (value instanceof Buffer) { + acc[key] = { isBuffer: true, value: value.toString('hex') } + } else if (typeof value === 'object') { + acc[key] = serializeObjectWithBuffers(value); + } else { + acc[key] = value; + } + return acc; + }, {}); +}; + +export const deserializeObjectWithBuffers = (obj: any) => { + return Object.entries(obj).reduce((acc: any, [key, value]: any) => { + if (value?.isBuffer) { + acc[key] = Buffer.from(value.value, 'hex'); + } else if (typeof value === 'object') { + acc[key] = deserializeObjectWithBuffers(value); + } else { + acc[key] = value; + } + return acc; + }, {}); +}; \ No newline at end of file diff --git a/src/__test__/utils/setup.ts b/src/__test__/utils/setup.ts new file mode 100644 index 00000000..72ff0d1c --- /dev/null +++ b/src/__test__/utils/setup.ts @@ -0,0 +1,8 @@ +expect.extend({ + toEqualElseLog (received: any, expected: any, message: string) { + return { + pass: received === expected, + message: () => message ? message : `Expected ${received} to equal ${expected}`, + }; + }, +}); diff --git a/src/__test__/utils/testRequest.ts b/src/__test__/utils/testRequest.ts new file mode 100644 index 00000000..5e21266e --- /dev/null +++ b/src/__test__/utils/testRequest.ts @@ -0,0 +1,38 @@ +import { decResLengths } from '../../constants'; +import { encryptRequest, decryptResponse, request } from '../../shared/functions'; + +import { TestRequestPayload } from '../../types/utils'; + +/** + * `test` takes a data object with a testID and a payload, and sends them to the device. + * @category Lattice + */ +export const testRequest = async ({ + payload, + testID, + client, +}: TestRequestPayload) => { + if (!payload) { + throw new Error( + 'First argument must contain `testID` and `payload` fields.', + ); + } + const TEST_DATA_SZ = 500; + const _payload = Buffer.alloc(TEST_DATA_SZ + 6); + _payload.writeUInt32BE(testID, 0); + _payload.writeUInt16BE(payload.length, 4); + payload.copy(_payload, 6); + const encryptedPayload = encryptRequest({ + requestCode: 'TEST', + payload: _payload, + sharedSecret: client.sharedSecret, + }); + const res = await request({ payload: encryptedPayload, url: client.url ?? '' }); + const { decryptedData, newEphemeralPub } = decryptResponse( + res, + decResLengths.test, + client.sharedSecret, + ); + client.ephemeralPub = newEphemeralPub; + return decryptedData.slice(65); // remove ephem pub +}; diff --git a/src/constants.ts b/src/constants.ts index e7c40cbf..e117927f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -362,10 +362,10 @@ export const EXTERNAL = { /** @internal */ function getFwVersionConst (v: Buffer): FirmwareConstants { - const c: FirmwareConstants = { + const c: any = { extraDataFrameSz: 0, extraDataMaxFrames: 0, - genericSigning: {}, + genericSigning: {} as any, }; function gte (v: Buffer, exp: FirmwareArr): boolean { // Note that `v` fields come in as [fix|minor|major] diff --git a/src/functions/connect.ts b/src/functions/connect.ts index 94551cd3..1574592a 100644 --- a/src/functions/connect.ts +++ b/src/functions/connect.ts @@ -42,7 +42,7 @@ export async function connect ({ // If we are paired and are on older firmware (<0.14.1), we need a follow up request to sync // wallet state. - if (isPaired && !doesFetchWalletsOnLoad(fwVersion)) { + if (isPaired && !doesFetchWalletsOnLoad(client.getFwVersion())) { await client.fetchActiveWallet(); } diff --git a/src/functions/fetchActiveWallet.ts b/src/functions/fetchActiveWallet.ts index b3a670dd..ab444cf1 100644 --- a/src/functions/fetchActiveWallet.ts +++ b/src/functions/fetchActiveWallet.ts @@ -1,7 +1,6 @@ -import { decResLengths } from '../constants'; +import { decResLengths, EMPTY_WALLET_UID } from '../constants'; import { decryptResponse, - EMPTY_WALLET_UID, encryptRequest, request, } from '../shared/functions'; diff --git a/src/functions/getAddresses.ts b/src/functions/getAddresses.ts index a655a65c..9bd98060 100644 --- a/src/functions/getAddresses.ts +++ b/src/functions/getAddresses.ts @@ -102,7 +102,7 @@ export const encodeGetAddressesRequest = ({ flag, }: EncodeGetAddressesRequestParams) => { const fwConstants = getFwVersionConst(fwVersion); - const flags = fwConstants.getAddressFlags || []; + const flags = fwConstants.getAddressFlags || [] as any[]; const isPubkeyOnly = flags.indexOf(flag) > -1 && (flag === EXTERNAL.GET_ADDR_FLAGS.ED25519_PUB || diff --git a/src/functions/sign.ts b/src/functions/sign.ts index 9e92a2be..5e39bc2b 100644 --- a/src/functions/sign.ts +++ b/src/functions/sign.ts @@ -178,7 +178,8 @@ export const decodeSignResponse = ({ // Get the change data if we are making a BTC transaction let changeRecipient; if (currency === CURRENCIES.BTC) { - const changeVersion = bitcoin.getAddressFormat(request.origData.changePath); + const btcRequest = request as BitcoinSignRequest; + const changeVersion = bitcoin.getAddressFormat(btcRequest.origData.changePath); const changePubKeyHash = data.slice(off, off + PKH_PREFIX_LEN); off += PKH_PREFIX_LEN; changeRecipient = bitcoin.getBitcoinAddress( @@ -217,13 +218,13 @@ export const decodeSignResponse = ({ // First output comes from request dta preSerializedData.outputs.push({ - value: request.origData.value, - recipient: request.origData.recipient, + value: btcRequest.origData.value, + recipient: btcRequest.origData.recipient, }); - if (request.changeData.value > 0) { + if (btcRequest.changeData.value > 0) { // Second output comes from change data preSerializedData.outputs.push({ - value: request.changeData.value, + value: btcRequest.changeData.value, recipient: changeRecipient, }); } @@ -231,11 +232,11 @@ export const decodeSignResponse = ({ // Add the inputs for (let i = 0; i < sigs.length; i++) { preSerializedData.inputs.push({ - hash: request.origData.prevOuts[i].txHash, - index: request.origData.prevOuts[i].index, + hash: btcRequest.origData.prevOuts[i].txHash, + index: btcRequest.origData.prevOuts[i].index, sig: sigs[i], pubkey: pubkeys[i], - signerPath: request.origData.prevOuts[i].signerPath, + signerPath: btcRequest.origData.prevOuts[i].signerPath, }); } diff --git a/src/shared/predicates.ts b/src/shared/predicates.ts index 69c420d6..c6fedbf4 100644 --- a/src/shared/predicates.ts +++ b/src/shared/predicates.ts @@ -12,7 +12,7 @@ export const isWrongWallet = (responseCode: number) => export const isInvalidEphemeralId = (responseCode: number) => responseCode === responseCodes.RESP_ERR_INVALID_EPHEM_ID; -export const doesFetchWalletsOnLoad = (fwVersion: Buffer) => +export const doesFetchWalletsOnLoad = (fwVersion: FirmwareVersion) => isFWSupported(fwVersion, { major: 0, minor: 14, fix: 1 }); export const shouldUseEVMLegacyConverter = (fwConstants: FirmwareConstants) => diff --git a/src/shared/utilities.ts b/src/shared/utilities.ts index e06daf0b..17777557 100644 --- a/src/shared/utilities.ts +++ b/src/shared/utilities.ts @@ -1,4 +1,3 @@ - /** * Get 64 bytes representing the public key This is the uncompressed key without the leading 04 * byte @@ -43,11 +42,17 @@ export const parseWallets = (walletData): ActiveWallets => { // Internal first let off = 0; const activeWallets: ActiveWallets = { - internal: { uid: undefined, capabilities: undefined, name: undefined }, + internal: { + uid: undefined, + capabilities: undefined, + name: undefined, + external: false, + }, external: { uid: undefined, capabilities: undefined, name: undefined, + external: true, }, }; activeWallets.internal.uid = walletData.slice(off, off + 32); @@ -70,7 +75,7 @@ export const parseWallets = (walletData): ActiveWallets => { // Determine if a provided firmware version matches or exceeds the current firmware version export const isFWSupported = ( - fwVersion: Buffer, + fwVersion: FirmwareVersion, versionSupported: FirmwareVersion, ): boolean => { const { major, minor, fix } = fwVersion; diff --git a/src/types/utils.d.ts b/src/types/utils.d.ts new file mode 100644 index 00000000..728d731a --- /dev/null +++ b/src/types/utils.d.ts @@ -0,0 +1,7 @@ +import { Client } from '../client' + +interface TestRequestPayload { + payload: Buffer; + testID: number; + client: Client; +} \ No newline at end of file diff --git a/src/types/utils.ts b/src/types/utils.ts deleted file mode 100644 index e1effa90..00000000 --- a/src/types/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type Signature = { - r: Buffer; - s: Buffer; - v?: Buffer; -} \ No newline at end of file diff --git a/src/types/vitest.d.ts b/src/types/vitest.d.ts new file mode 100644 index 00000000..46d5492f --- /dev/null +++ b/src/types/vitest.d.ts @@ -0,0 +1,9 @@ +export { }; +declare global { + namespace Vi { + + interface JestAssertion { + toEqualElseLog (a: any, msg: string): R; + } + } +} \ No newline at end of file diff --git a/test/signing/vectors.jsonc b/src/vectors.jsonc similarity index 100% rename from test/signing/vectors.jsonc rename to src/vectors.jsonc diff --git a/test/signing/determinism.ts b/test/signing/determinism.ts deleted file mode 100644 index 34bbbb77..00000000 --- a/test/signing/determinism.ts +++ /dev/null @@ -1,969 +0,0 @@ -/** - * Signature determinsim is important for many web3 applications. All SafeCards that - * have exportable seeds should produce deterministic signatures for all message types. - * These tests validate that the signatures are deterministic and also match those - * produced by the same seed on a Ledger device. - * - * You must have `FEATURE_TEST_RUNNER=1` enabled in firmware to run these tests. - */ -import Common, { Chain, Hardfork } from '@ethereumjs/common'; -import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; -import bip32 from 'bip32'; -import { mnemonicToSeedSync } from 'bip39'; -import { expect } from 'chai'; -import { ecsign, privateToAddress } from 'ethereumjs-util'; -import { keccak256 } from 'js-sha3'; -import { question } from 'readline-sync'; -import seedrandom from 'seedrandom'; -import { - HARDENED_OFFSET, - responseCodes, - responseMsgs, -} from '../../src/constants'; -import { Constants } from '../../src/index'; -import { randomBytes } from '../../src/util'; -import helpers from '../testUtil/helpers'; - -//--------- -// Constants -//--------- -const TEST_MNEMONIC = - 'nose elder baby marriage frequent list ' + - 'cargo swallow memory universe smooth involve ' + - 'iron purity throw vintage crew artefact ' + - 'pyramid dash split announce trend grain'; -const TEST_SEED = mnemonicToSeedSync(TEST_MNEMONIC); -let jobType, jobData, jobReq, txReq, msgReq; - -let numIter = 20; -if (process.env.N) numIter = parseInt(process.env.N); -const PRNG = new seedrandom(process.env.SEED || 'myrandomseed'); - -// Generate a bunch of random test vectors using the PRNG -const RANDOM_VEC = []; -for (let i = 0; i < numIter; i++) { - RANDOM_VEC.push(Math.floor(1000000000 * PRNG.quick()).toString(16)); -} - -let activeWalletUID, test, tx, txReq, DEFAULT_SIGNER; - -//--------- -// Tests -//--------- -describe('[Determinism]', () => { - test = global.test; - DEFAULT_SIGNER = [ - test.helpers.BTC_PURPOSE_P2PKH, - test.helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ]; - activeWalletUID = test.activeWalletUID; - tx = EthTxFactory.fromTxData( - { - type: 2, - maxFeePerGas: 1200000000, - maxPriorityFeePerGas: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }, - { - common: new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }), - }, - ); - txReq = { - data: { - signerPath: DEFAULT_SIGNER, - payload: tx.getMessageToSign(false), - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.KECCAK256, - encodingType: Constants.SIGNING.ENCODINGS.EVM, - }, - }; - - describe('Setup and validate seed', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - test.continue = false; - }); - - it('Should remove the seed', async () => { - // Make sure a seed was exported - if (!test.seed) { - return; - } - _setupJob(helpers.jobTypes.WALLET_JOB_DELETE_SEED); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - test.continue = true; - }); - - it('Should load the known test seed', async () => { - _setupJob(helpers.jobTypes.WALLET_JOB_LOAD_SEED, { seed: TEST_SEED }); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - test.continue = true; - }); - - it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { - question( - '\nPlease remove, re-insert, and unlock your SafeCard.\n' + - 'Press enter to continue after addresses have fully synced.', - ); - test.continue = true; - }); - - it('Should re-connect to the Lattice and update the walletUID.', async () => { - expect(process.env.DEVICE_ID).to.not.equal(null); - await test.client.connect(process.env.DEVICE_ID); - expect(test.client.isPaired).to.equal(true); - expect(test.client.hasActiveWallet()).to.equal(true); - activeWalletUID = helpers.copyBuffer(test.client.getActiveWallet().uid); - test.continue = true; - }); - - it('Should ensure export seed matches the test seed', async () => { - _setupJob(helpers.jobTypes.WALLET_JOB_EXPORT_SEED); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeExportSeedJobResult(_res.result); - const exportedSeed = helpers.copyBuffer(res.seed); - expect(exportedSeed.toString('hex')).to.equal( - TEST_SEED.toString('hex'), - 'Seeds did not match', - ); - test.continue = true; - }); - - it('Should validate some Ledger addresses derived from the test seed', async () => { - // These addresses were all fetched using MetaMask with a real ledger loaded with TEST_MNEOMNIC - // NOTE: These are 0-indexed indices whereas MetaMask shows 1-indexed (addr0 -> metamask1) - const path0 = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ]; - const addr0 = '0x17E43083812d45040E4826D2f214601bc730F60C'; - const path1 = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET + 1, - 0, - 0, - ]; - const addr1 = '0xfb25a9D4472A55083042672e42309056763B667E'; - const path8 = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET + 8, - 0, - 0, - ]; - const addr8 = '0x8A520d7f70906Ebe00F40131791eFF414230Ea5c'; - // Derive these from the seed as a sanity check - expect(deriveAddress(TEST_SEED, path0).toLowerCase()).to.equal( - addr0.toLowerCase(), - 'Incorrect address 0 derived.', - ); - expect(deriveAddress(TEST_SEED, path1).toLowerCase()).to.equal( - addr1.toLowerCase(), - 'Incorrect address 1 derived.', - ); - expect(deriveAddress(TEST_SEED, path8).toLowerCase()).to.equal( - addr8.toLowerCase(), - 'Incorrect address 8 derived.', - ); - // Fetch these addresses from the Lattice and validate - - const req = { - currency: 'ETH', - startPath: path0, - n: 1, - }; - const latAddr0 = await test.client.getAddresses(req); - expect(latAddr0[0].toLowerCase()).to.equal( - addr0.toLowerCase(), - 'Incorrect address 0 fetched.', - ); - req.startPath = path1; - const latAddr1 = await test.client.getAddresses(req); - expect(latAddr1[0].toLowerCase()).to.equal( - addr1.toLowerCase(), - 'Incorrect address 1 fetched.', - ); - req.startPath = path8; - const latAddr8 = await test.client.getAddresses(req); - expect(latAddr8[0].toLowerCase()).to.equal( - addr8.toLowerCase(), - 'Incorrect address 8 fetched.', - ); - test.continue = true; - }); - - it('Should test that wrongWallet retry works', async () => { - question( - 'Please switch to a SafeCard with a different seed. Press enter to continue.', - ); - try { - // Should get wrong wallet on the first attempt - test.client.skipRetryOnWrongWallet = true; - await test.client.sign(txReq); - } catch (err) { - expect(err.message).to.equal( - `${responseMsgs[responseCodes.RESP_ERR_WRONG_WALLET]} (Lattice)`, - 'Wrong wallet expected.', - ); - question( - 'Please switch back to the first SafeCard. Press enter to continue.', - ); - test.client.skipRetryOnWrongWallet = false; - await test.client.sign(txReq); - test.continue = true; - } - }); - }); - - describe('Test uniformity of Ethereum transaction sigs', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - test.continue = false; - }); - - it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/0', async () => { - txReq.data.signerPath[2] = HARDENED_OFFSET; - await testUniformSigs(txReq, tx); - test.continue = true; - }); - - it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/1', async () => { - txReq.data.signerPath[2] = HARDENED_OFFSET + 1; - await testUniformSigs(txReq, tx); - test.continue = true; - }); - - it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/8', async () => { - txReq.data.signerPath[2] = HARDENED_OFFSET + 8; - await testUniformSigs(txReq, tx); - test.continue = true; - }); - - it('Should update the transaction to use oversized data', async () => { - tx = EthTxFactory.fromTxData( - { - type: 2, - maxFeePerGas: 1200000000, - maxPriorityFeePerGas: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: `0x${randomBytes(4000).toString('hex')}`, - }, - { - common: new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }), - }, - ); - txReq.data.payload = tx.getMessageToSign(false); - test.continue = true; - }); - - it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/0', async () => { - txReq.data.signerPath[2] = HARDENED_OFFSET; - await testUniformSigs(txReq, tx); - test.continue = true; - }); - - it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/1', async () => { - txReq.data.signerPath[2] = HARDENED_OFFSET + 1; - await testUniformSigs(txReq, tx); - test.continue = true; - }); - - it('Should validate uniformity sigs on m/44\'/60\'/0\'/0/8', async () => { - txReq.data.signerPath[2] = HARDENED_OFFSET + 8; - await testUniformSigs(txReq, tx); - test.continue = true; - }); - }); - - describe('Compare personal_sign signatures vs Ledger vectors (1)', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'signPersonal', - payload: 'hello ethereum', - }, - }; - test.continue = false; - }); - - it('Should validate signature from addr0', async () => { - const expected = - '4820a558ab69907c90141f4857f54a7d71e7791f84478fef7b9a3e5b200ee242' + // r - '529cc19a58ed8fa017510d24a443b757018834b3e3585a7199168d3af4b3837e' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - - it('Should validate signature from addr1', async () => { - const expected = - 'c292c988b26ae24a06a8270f2794c259ec5742168ed77cd635cba041f767a569' + // r - '2e4d218a02ba0b5f82b80488ccc519b67fb37a9f4cbb1d35d9ce4b99e8afcc18' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - - it('Should validate signature from addr8', async () => { - const expected = - '60cadafdbb7cba590a37eeff854d2598af71904077312875ef7b4f525d4dcb52' + // r - '5903ae9e4b7e61f6f24abfe9a1d5fb1375347ef6a48f7abe2319c89f426eb27c' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - }); - - describe('Compare personal_sign signatures vs Ledger vectors (2)', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'signPersonal', - payload: 'hello ethereum this is another message', - }, - }; - test.continue = false; - }); - - it('Should validate signature from addr0', async () => { - const expected = - 'b4fb4e0db168de42781ee1a27a1e907d5ec39aaccf24733846739f94f5b4542f' + // r - '65639d4aa368a5510c64e758732de419ac6489efeaf9e3cb29a616a2c624c2c7' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - - it('Should validate signature from addr1', async () => { - const expected = - '1318229681d8fcdf6db12819c8859501186a3c792543d38a38643c6f185dd252' + // r - '6a7655b7ff8b5a2bdfa5023abd91e04c7c7a8f8ee491122da17e13dd85ede531' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - - it('Should validate signature from addr8', async () => { - const expected = - 'c748f3fbf9f517fbd33462a858b40615ab6747295c27b4a46568d7d08c1d9d32' + // r - '0e14363c2885feaee0e4393454292be1ee3a1f32fb95571231db09a2b3bd8737' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - }); - - describe('Compare personal_sign signatures vs Ledger vectors (3)', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'signPersonal', - payload: 'third vector yo', - }, - }; - test.continue = false; - }); - - it('Should validate signature from addr0', async () => { - const expected = - 'f245100f07a6c695140fda7e29097034b3c97be94910639d20efdff5c96387fd' + // r - '6703f40f53647528ed93ac929a256ed1f09eba316a5e94daac2a464356b14058' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - - it('Should validate signature from addr1', async () => { - const expected = - '3a42c4955e4fb7ee2c4ee58df79c4be5f62839e691c169b74f90eafd371e2065' + // r - '51c7fc3da33dff2d2961ac7909244b4c32deee70abf7fac0e088184853cdff4a' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - - it('Should validate signature from addr8', async () => { - const expected = - '3e55dbb101880960cb32c17237d3ceb9d5846cf2f68c5c4c504cb827ea6a2e73' + // r - '22254bb6f6464c95dd743c506e7bc71eb90ceab17d2fd3b02e6636c508b14cc7' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected, 'Lattice sig does not match'); - const jsSig = signPersonalJS(msgReq.data.payload, msgReq.data.signerPath); - expect(sig).to.equal(jsSig, 'JS sig does not match'); - test.continue = true; - }); - }); - - describe('Compare EIP712 signatures vs Ledger vectors (1)', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'eip712', - payload: { - types: { - Greeting: [ - { - name: 'salutation', - type: 'string', - }, - { - name: 'target', - type: 'string', - }, - { - name: 'born', - type: 'int32', - }, - ], - EIP712Domain: [ - { - name: 'chainId', - type: 'uint256', - }, - ], - }, - domain: { - chainId: 1, - }, - primaryType: 'Greeting', - message: { - salutation: 'Hello', - target: 'Ethereum', - born: '2015', - }, - }, - }, - }; - test.continue = false; - }); - - it('Should validate signature from addr0', async () => { - const expected = - 'dbf9a493935770f97a1f0886f370345508398ac76fbf31ccf1c30d8846d3febf' + // r - '047e8ae03e146044e7857f1e485921a9d978b1ead93bdd0de6be619dfb72f0b5' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - - it('Should validate signature from addr1', async () => { - const expected = - '9e784c6388f6f938f94239c67dc764909b86f34ec29312f4c623138fd7192115' + // r - '5efbc9af2339e04303bf300366a675dd90d33fdb26d131c17b278725d36d728e' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - - it('Should validate signature from addr8', async () => { - const expected = - '6e7e9bfc4773291713bb5cdc483057d43a95a5082920bdd1dd3470caf6f11155' + // r - '6c163b7d489f37ffcecfd20dab2de6a8a04f79af7e265b249db9b4973e75c7d1' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - }); - - describe('Compare EIP712 signatures vs Ledger vectors (2)', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'eip712', - payload: { - types: { - MuhType: [ - { - name: 'thing', - type: 'string', - }, - ], - EIP712Domain: [ - { - name: 'chainId', - type: 'uint256', - }, - ], - }, - domain: { - chainId: 1, - }, - primaryType: 'MuhType', - message: { - thing: 'I am a string', - }, - }, - }, - }; - test.continue = false; - }); - - it('Should validate signature from addr0', async () => { - const expected = - '0a1843ee1be7bf1ddd8bb32230ee3842b47022b8ba8795d3522db8a7341a9b85' + // r - '72d0e38463b5a7e1f1d1acd09acb8db936af52bdcab6374abb7013842b6840b8' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - - it('Should validate signature from addr1', async () => { - const expected = - 'f5284359479eb32eefe88bd24de59e4fd656d82238c7752e7a576b7a875eb5ae' + // r - '6ef7b021f5bed2122161de6b373d5ee0aa9a3e4d3f499b3bb95ad5b9ed9f7bd9' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - - it('Should validate signature from addr8', async () => { - const expected = - 'f7a94b7ba7e0fbab88472cb77c5c255ba36e60e9f90bf4073960082bb5ef17cf' + // r - '2e3b79ebad1f0ee96e0d3fe862372a1e586dba1bee309adf8c338b5e42d3424e' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - }); - - describe('Compare EIP712 signatures vs Ledger vectors (3)', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'eip712', - payload: { - types: { - MuhType: [ - { - name: 'numbawang', - type: 'uint32', - }, - ], - EIP712Domain: [ - { - name: 'chainId', - type: 'uint256', - }, - ], - }, - domain: { - chainId: 1, - }, - primaryType: 'MuhType', - message: { - numbawang: 999, - }, - }, - }, - }; - test.continue = false; - }); - - it('Should validate signature from addr0', async () => { - const expected = - 'c693714421acbba9fb8fdcd825295b6042802b06a55ae17a65db510dd5a348e0' + // r - '2ffed1a8dbaf63919727c0b5e52978e9dce3638b0385fda45e022a50bab510eb' + // s - '01'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - it('Should validate signature from addr1', async () => { - const expected = - '4a32a478f6f772b37d8cfffabe8ee7c7956d45fd098035163c92b06564ead034' + // r - '2eb54cde42f636f63f72615b53510e970a9f7ff2c4527b753ef0eb8ce1ee4a44' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 1; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - it('Should validate signature from addr8', async () => { - const expected = - '7a9f4e67309efb733fc4092f69f95583e06ccf4b25a364d9a9dc51b921edb464' + // r - '22c310c83fd61936618b8f1caaa0b82ac492822e6a5d1a65cd5fb3f0bc0126bf' + // s - '00'; // v - msgReq.data.signerPath[2] = HARDENED_OFFSET + 8; - const res = await test.client.sign(msgReq); - const sig = test.helpers.getSigStr(res); - expect(sig).to.equal(expected); - test.continue = true; - }); - }); - - describe('Test random personal_sign messages against JS signatures', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - test.continue = false; - }); - - it('Should test random vectors', async () => { - for (let i = 0; i < RANDOM_VEC.length; i++) { - let res, jsSig, sig; - const req = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'signPersonal', - payload: RANDOM_VEC[i], - }, - }; - // Address index 0 - req.data.signerPath[2] = HARDENED_OFFSET; - jsSig = signPersonalJS(req.data.payload, req.data.signerPath); - res = await test.client.sign(req); - sig = test.helpers.getSigStr(res); - expect(sig).to.equal(jsSig, 'Addr0 sig failed'); - // Address index 1 - req.data.signerPath[2] = HARDENED_OFFSET + 1; - jsSig = signPersonalJS(req.data.payload, req.data.signerPath); - res = await test.client.sign(req); - sig = test.helpers.getSigStr(res); - expect(sig).to.equal(jsSig, 'Addr1 sig failed'); - // Address index 8 - req.data.signerPath[2] = HARDENED_OFFSET + 8; - jsSig = signPersonalJS(req.data.payload, req.data.signerPath); - res = await test.client.sign(req); - sig = test.helpers.getSigStr(res); - expect(sig).to.equal(jsSig, 'Addr8 sig failed'); - } - test.continue = true; - }) - }); - - describe('Teardown Test', () => { - beforeEach(() => { - expect(test.continue).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - test.continue = false; - }); - - it('Should remove the seed', async () => { - jobType = helpers.jobTypes.WALLET_JOB_DELETE_SEED; - jobData = { - iface: 1, - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - jobReq.payload = helpers.serializeJobData( - jobType, - activeWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - test.continue = true; - }); - - it('Should load the seed', async () => { - _setupJob(helpers.jobTypes.WALLET_JOB_LOAD_SEED, { seed: test.seed }); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - test.continue = true; - }); - - it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { - question( - '\nPlease remove, re-insert, and unlock your SafeCard.\n' + - 'Press enter to continue.', - ); - test.continue = true; - }); - - it('Should re-connect to the Lattice and update the walletUID.', async () => { - expect(process.env.DEVICE_ID).to.not.equal(null); - await test.client.connect(process.env.DEVICE_ID); - expect(test.client.isPaired).to.equal(true); - expect(test.client.hasActiveWallet()).to.equal(true); - activeWalletUID = helpers.copyBuffer(test.client.getActiveWallet().uid); - test.continue = true; - }); - - it('Should ensure export seed matches the seed we just loaded', async () => { - // Export the seed and make sure it matches! - _setupJob(helpers.jobTypes.WALLET_JOB_EXPORT_SEED); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeExportSeedJobResult(_res.result); - const exportedSeed = helpers.copyBuffer(res.seed); - expect(exportedSeed.toString('hex')).to.equal(test.seed.toString('hex')); - test.continue = true; - }); - }); -}); - -//--------- -// Helpers -//--------- -async function testUniformSigs (txReq, tx) { - const tx1Resp = await test.client.sign(txReq); - const tx2Resp = await test.client.sign(txReq); - const tx3Resp = await test.client.sign(txReq); - const tx4Resp = await test.client.sign(txReq); - const tx5Resp = await test.client.sign(txReq); - // Check sig 1 - expect(helpers.getSigStr(tx1Resp, tx)).to.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx1Resp, tx)).to.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx1Resp, tx)).to.equal( - helpers.getSigStr(tx4Resp, tx), - ); - expect(helpers.getSigStr(tx1Resp, tx)).to.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 2 - expect(helpers.getSigStr(tx2Resp, tx)).to.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx2Resp, tx)).to.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx2Resp, tx)).to.equal( - helpers.getSigStr(tx4Resp, tx), - ); - expect(helpers.getSigStr(tx2Resp, tx)).to.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 3 - expect(helpers.getSigStr(tx3Resp, tx)).to.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx3Resp, tx)).to.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx3Resp, tx)).to.equal( - helpers.getSigStr(tx4Resp, tx), - ); - expect(helpers.getSigStr(tx3Resp, tx)).to.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 4 - expect(helpers.getSigStr(tx4Resp, tx)).to.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx4Resp, tx)).to.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx4Resp, tx)).to.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx4Resp, tx)).to.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 5 - expect(helpers.getSigStr(tx5Resp, tx)).to.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx5Resp, tx)).to.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx5Resp, tx)).to.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx5Resp, tx)).to.equal( - helpers.getSigStr(tx4Resp, tx), - ); -} - -async function runTestCase (expectedCode) { - const res = await test.client.test(jobReq); - const parsedRes = helpers.parseWalletJobResp(res, test.client.fwVersion); - if (parsedRes.resultStatus !== expectedCode) { - test.continue = false; - } - expect(parsedRes.resultStatus).to.equal(expectedCode, 'Incorrect response'); - return parsedRes; -} - -function deriveAddress (seed, path) { - const wallet = bip32.fromSeed(seed); - const priv = wallet.derivePath(helpers.getPathStr(path)).privateKey; - return `0x${privateToAddress(priv).toString('hex')}`; -} - -function signPersonalJS (_msg, path) { - const wallet = bip32.fromSeed(TEST_SEED); - const priv = wallet.derivePath(helpers.getPathStr(path)).privateKey; - const msg = helpers.ethPersonalSignMsg(_msg); - const hash = new Uint8Array(Buffer.from(keccak256(msg), 'hex')); - const sig = ecsign(hash, priv); - const v = (sig.v - 27).toString(16).padStart(2, '0'); - return `${sig.r.toString('hex')}${sig.s.toString('hex')}${v}`; -} - -function _setupJob (type, opts = {}) { - if (type === helpers.jobTypes.WALLET_JOB_EXPORT_SEED) { - jobType = type; - jobData = {}; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - jobReq.payload = helpers.serializeJobData( - jobType, - activeWalletUID, - jobData, - ); - return; - } else if (type === helpers.jobTypes.WALLET_JOB_DELETE_SEED) { - jobType = type; - jobData = { - iface: 1, - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - jobReq.payload = helpers.serializeJobData( - jobType, - activeWalletUID, - jobData, - ); - } else if (type === helpers.jobTypes.WALLET_JOB_LOAD_SEED) { - jobType = type; - jobData = { - iface: 1, // external SafeCard interface - seed: opts.seed, - exportability: 2, // always exportable - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - jobReq.payload = helpers.serializeJobData( - jobType, - activeWalletUID, - jobData, - ); - } -} diff --git a/test/signing/evm.ts b/test/signing/evm.ts deleted file mode 100644 index d2f48dfe..00000000 --- a/test/signing/evm.ts +++ /dev/null @@ -1,899 +0,0 @@ -/** -Test generic signing, which allows a signature on the secp256k1 or ed25519 curve. -We seek to validate: -1. Signature on data can be reproduced locally with the derived key -2. Signature on data representing ETH tx matches the ETH route itself -3. Many random signatures can be validated - -You must have `FEATURE_TEST_RUNNER=1` enabled in firmware to run these tests. - */ -import Common, { Chain, Hardfork } from '@ethereumjs/common'; -import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; -import { AbiCoder, Interface } from '@ethersproject/abi'; -import { BN } from 'bn.js'; -import { readFileSync } from 'fs'; -import { keccak256 } from 'js-sha3'; -import { jsonc } from 'jsonc'; -import request from 'request-promise'; -import { encode as rlpEncode, decode as rlpDecode } from 'rlp'; -import { HARDENED_OFFSET } from '../../src/constants'; -import { Constants, Calldata } from '../../src/index'; -import { fetchCalldataDecoder, randomBytes } from '../../src/util'; -import { getEncodedPayload } from '../../src/genericSigning'; -let test; -const coder = new AbiCoder(); -const EVMCalldata = Calldata.EVM; - -//--------------------------------------- -// STATE DATA -//--------------------------------------- -let DEFAULT_SIGNER, EVM_TYPES, vectors; -const req = { - data: { - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.KECCAK256, - encodingType: Constants.SIGNING.ENCODINGS.EVM, - payload: null, - }, -}; -// const numDefsInitial = 0; -const encDefs = [], - encDefsCalldata = []; - -//--------------------------------------- -// TESTS -//--------------------------------------- -describe('Start EVM signing tests', () => { - test = global.test; - DEFAULT_SIGNER = [ - test.helpers.BTC_PURPOSE_P2PKH, - test.helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ]; - req.data.signerPath = DEFAULT_SIGNER; - const globalVectors = jsonc.parse( - readFileSync(`${process.cwd()}/test/signing/vectors.jsonc`).toString(), - ); - vectors = globalVectors.evm.calldata; - // Copied from calldata/evm.ts (not exported there) - EVM_TYPES = [ - null, - 'address', - 'bool', - 'uint', - 'int', - 'bytes', - 'string', - 'tuple', - ]; - // Build data for next test sets - for (let i = 0; i < vectors.canonicalNames.length; i++) { - const name = vectors.canonicalNames[i]; - const selector = `0x${keccak256(name).slice(0, 8)}`; - const encDef = EVMCalldata.parsers.parseCanonicalName(selector, name); - encDefs.push(encDef); - const { types, data } = convertDecoderToEthers(rlpDecode(encDef).slice(1)); - const calldata = coder.encode(types, data); - encDefsCalldata.push(`${selector}${calldata.slice(2)}`); - } -}); - -describe('[EVM] Test transactions', () => { - describe('EIP1559', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.data.payload = null; - req.txData = { - type: 2, - maxFeePerGas: 1200000000, - maxPriorityFeePerGas: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }; - req.common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }); - }); - - it('Should test a basic transaction', async () => { - await run(req); - }); - - it('Should test a Rinkeby transaction', async () => { - req.common = new Common({ - chain: Chain.Rinkeby, - hardfork: Hardfork.London, - }); - await run(req); - }); - - it('Should test a transaction with an access list', async () => { - req.txData.accessList = [ - { - address: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - storageKeys: [ - '0x7154f8b310ad6ce97ce3b15e3419d9863865dfe2d8635802f7f4a52a206255a6', - ], - }, - { - address: '0xe0f8ff08ef0242c461da688b8b85e438db724860', - storageKeys: [], - }, - ]; - await run(req); - }); - }); - - describe('EIP2930', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.data.payload = null; - req.txData = { - type: 1, - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }; - req.common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }); - }); - - it('Should test a basic transaction', async () => { - await run(req); - }); - - it('Should test a Rinkeby transaction', async () => { - req.common = new Common({ - chain: Chain.Rinkeby, - hardfork: Hardfork.London, - }); - await run(req); - }); - - it('Should test a transaction with an access list', async () => { - req.txData.accessList = [ - { - address: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - storageKeys: [ - '0x7154f8b310ad6ce97ce3b15e3419d9863865dfe2d8635802f7f4a52a206255a6', - ], - }, - { - address: '0xe0f8ff08ef0242c461da688b8b85e438db724860', - storageKeys: [], - }, - ]; - await run(req); - }); - }); - - describe('Legacy (Non-EIP155)', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.data.payload = null; - req.data.signerPath = DEFAULT_SIGNER; - req.txData = { - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }; - req.common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.Homestead, - }); - }); - - it('Should test a transaction that does not use EIP155', async () => { - await run(req); - }); - }); - - describe('Boundary tests', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.data.payload = null; - req.data.signerPath = DEFAULT_SIGNER; - req.txData = { - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }; - req.common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }); - }); - - it('Should test shorter derivation paths', async () => { - req.data.signerPath = DEFAULT_SIGNER.slice(0, 3); - await run(req); - req.data.signerPath = DEFAULT_SIGNER.slice(0, 2); - await run(req); - req.data.signerPath = DEFAULT_SIGNER.slice(0, 1); - await run(req); - req.data.signerPath = []; - await run(req, true); - }); - - it('Should test other chains', async () => { - // Polygon - req.common = Common.custom({ chainId: 137 }); - await run(req); - // BSC - req.common = Common.custom({ chainId: 56 }); - await run(req); - // Avalanche - req.common = Common.custom({ chainId: 43114 }); - await run(req); - // Palm - req.common = Common.custom({ chainId: 11297108109 }); - await run(req); - // Unknown chain - req.common = Common.custom({ chainId: 9999 }); - await run(req); - // Unknown chain (max chainID, i.e. UINT64_MAX - 1) - req.common = Common.custom({ chainId: '18446744073709551615' }); - await run(req); - // Unknown chain (chainID too large) - req.common = Common.custom({ chainId: '18446744073709551616' }); - await run(req, true); - }); - - it('Should test range of `value`', async () => { - req.txData.value = 1; - await run(req); - req.txData.value = - '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; - await run(req); - }); - - it('Should test range of `data` size', async () => { - const { extraDataFrameSz, extraDataMaxFrames, genericSigning } = - test.fwConstants; - const { baseDataSz } = genericSigning; - // Max size of total payload - const maxSz = baseDataSz + extraDataMaxFrames * extraDataFrameSz; - // Infer the max `data` size - req.txData.data = null; - const dummyTx = EthTxFactory.fromTxData(req.txData, { - common: req.common, - }); - const dummyTxSz = rlpEncode(dummyTx.getMessageToSign(false)).length; - const rlpPrefixSz = 4; // 1 byte for descriptor, 1 byte for llength, 2 bytes for length - const maxDataSz = maxSz - dummyTxSz - rlpPrefixSz; - - // No data - req.txData.data = null; - await run(req); - // Max payload size - req.txData.data = `0x${randomBytes(maxDataSz).toString('hex')}`; - await run(req); - // Min prehash size - req.txData.data = `0x${randomBytes(maxDataSz + 1).toString('hex')}`; - await run(req); - }); - - it('Should test contract deployment', async () => { - req.txData.to = null; - req.txData.data = `0x${randomBytes(96).toString('hex')}`; - await run(req); - }); - - it('Should test direct RLP-encoded payoads with bad params', async () => { - const tx = EthTxFactory.fromTxData(req.txData, { common: req.common }); - let params = tx.getMessageToSign(false); - - const oversizedInt = Buffer.from( - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01', - 'hex', - ); - // Test numerical values >32 bytes - // --- - // Nonce - params[0] = oversizedInt; - req.data.payload = rlpEncode(params); - await run(req, true, true); - params = tx.getMessageToSign(false); - // Gas - params[1] = oversizedInt; - req.data.payload = rlpEncode(params); - await run(req, true, true); - params = tx.getMessageToSign(false); - // Gas Price - params[2] = oversizedInt; - req.data.payload = rlpEncode(params); - await run(req, true, true); - params = tx.getMessageToSign(false); - // Value - params[4] = oversizedInt; - req.data.payload = rlpEncode(params); - await run(req, true, true); - params = tx.getMessageToSign(false); - // Test wrong sized addresses - // --- - params[3] = Buffer.from('e242e54155b1abc71fc118065270cecaaf8b77', 'hex'); - req.data.payload = rlpEncode(params); - await run(req, true, true); - params = tx.getMessageToSign(false); - params[3] = Buffer.from( - 'e242e54155b1abc71fc118065270cecaaf8b770102', - 'hex', - ); - req.data.payload = rlpEncode(params); - await run(req, true, true); - params = tx.getMessageToSign(false); - }); - }); - - describe('Random Transactions', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.data.payload = null; - req.data.signerPath = DEFAULT_SIGNER; - }); - - it('Should test random transactions', async () => { - const randInt = (n) => Math.floor(Math.random() * n); - const randIntStr = (nBytes, type) => - new BN(randomBytes(randInt(nBytes)).toString('hex'), 16).toString(type); - for (let i = 0; i < test.numIter; i++) { - req.txData = { - nonce: `0x${randIntStr(4, 'hex')}`, - gasPrice: `0x${randIntStr(8, 'hex')}`, - gas: `0x${randIntStr(4, 'hex')}`, - value: `0x${randIntStr(32, 'hex')}`, - to: `0x${randomBytes(20).toString('hex')}`, - data: `0x${randomBytes(randInt(2000)).toString('hex')}`, - }; - req.common = Common.custom({ - chainId: randIntStr(8), - }); - await run(req); - } - }); - }); - - describe('[TODO: deprecate] Test Legacy Pathway (while it still exists)', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.currency = 'ETH'; - req.data = { - payload: null, - signerPath: DEFAULT_SIGNER, - }; - req.txData = { - chainId: 1, - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }; - req.common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }); - }); - - it('Should test legacy signing for legacy EIP155 transaction', async () => { - await run(req, null, null, true); - }); - - it('Should test legacy signing for EIP1559', async () => { - req.txData = { - chainId: 1, - type: 2, - maxFeePerGas: 1200000000, - maxPriorityFeePerGas: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }; - await run(req, null, null, true); - }); - - it('Should test a Polygon transaction (chainId=137)', async () => { - req.txData.chainId = 137; - req.common = Common.custom({ chainId: req.txData.chainId }); - await run(req, null, null, true); - }); - }); -}); - -describe('[EVM] Test decoders', () => { - describe('Test ABI decoder vectors', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req.data.payload = null; - req.data.signerPath = DEFAULT_SIGNER; - req.currency = undefined; - req.txData = { - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: null, - }; - test.continue = false; - }); - - // Validate that we can decode using Etherscan ABI info as well as 4byte canonical names. - for (let i = 0; i < vectors.etherscanTxHashes.length; i++) { - it(`(Etherscan + 4byte #${i}) ${vectors.etherscanTxHashes[i]}`, async () => { - // Hashes on ETH mainnet that we will use to fetch full tx and ABI data with - const getTxBase = - 'https://api.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash='; - // 1. First fetch the transaction details from etherscan. This is just to get - // the calldata, so it would not be needed in a production environment - // (since we already have the calldata). - let getTxUrl = `${getTxBase}${vectors.etherscanTxHashes[i]}`; - if (test.etherscanKey) { - getTxUrl += `&apiKey=${test.etherscanKey}`; - } - const resp = await request(getTxUrl); - const tx = JSON.parse(resp).result; - if (!test.etherscanKey) { - // Need a timeout between requests if we don't have a key - console.warn( - 'WARNING: No env.ETHERSCAN_KEY provided. Waiting 5s between requests...', - ); - await new Promise((resolve) => setTimeout(resolve, 5000)); - } - // 2. Fetch the full ABI of the contract that the transaction interacted with. - { - const { def, abi } = await fetchCalldataDecoder(tx.input, tx.to, 1) - if (!def) { - throw new Error( - `ERROR: Failed to decode ABI definition (${vectors.etherscanTxHashes[i]}). Skipping.`, - ); - } - // 3. Test decoding using Etherscan ABI info - // Check that ethers can decode this - const funcName = rlpDecode(def)[0]; - if (ethersCanDecode(tx.input, abi, funcName.toString())) { - // Send the request - req.txData.data = tx.input; - req.data.decoder = def; - await run(req); - } else { - throw new Error( - `ERROR: ethers.js failed to decode abi for tx ${vectors.etherscanTxHashes[i]}. Skipping.`, - ); - } - } - // 4. Get the canonical name from 4byte by using an unsupported chainId - { - const { def } = await fetchCalldataDecoder(tx.input, tx.to, -1) - req.data.decode = def - await run(req); - } - }); - } - - // Validate a series of canonical definitions - for (let i = 0; i < vectors.canonicalNames.length; i++) { - it(`(Canonical #${i}) ${vectors.canonicalNames[i]}`, async () => { - req.txData.data = encDefsCalldata[i]; - req.data.decoder = encDefs[i]; - // The following prints are helpful for debugging. - // If you are testing changes to the ABI decoder in firmware, you - // should uncomment these prints and validate that the `data` matches - // what you see on the screen for each case. Please scroll through - // ALL the data on the Lattice to confirm each param has properly decoded. - // const { types, data } = convertDecoderToEthers(rlpDecode(req.data.decoder).slice(1)); - // console.log('types', types) - // console.log('params', JSON.stringify(data)) - // for (let cd = 2; cd < calldata.length; cd += 64) { - // console.log(calldata.slice(cd, cd + 64)); - // } - await run(req); - }); - } - /* - NOTE: The CRUD API to manage calldata decoders is written, but is currently - compiled out of firmware to free up code space. For now we will leave - these tests commented out and may re-enable them at a later date - NOTE: You will need to re-enable `import { question } from 'readline-sync';` - - // Test committing decoder data - it('Should save the first 10 defs', async () => { - const decoderType = Calldata.EVM.type; - const rm = question( - 'Do you want to remove all previously saved definitions? (Y/N) ', - ); - if (rm.toUpperCase() === 'Y') { - await test.client.removeDecoders({ decoderType, rmAll: true }); - } - // First determine how many defs there are already - let saved = await test.client.getDecoders({ decoderType }); - numDefsInitial = saved.total; - await test.client.addDecoders({ - decoderType, - decoders: encDefs.slice(0, 10), - }); - saved = await test.client.getDecoders({ decoderType, n: 10 }); - test.expect(saved.total).to.equal(numDefsInitial + 10); - for (let i = 0; i < saved.decoders.length; i++) { - test - .expect(saved.decoders[i].toString('hex')) - .to.equal(encDefs[i].toString('hex')); - } - await test.client.addDecoders({ - decoderType, - decoders: encDefs.slice(0, 10), - }); - saved = await test.client.getDecoders({ decoderType, n: 10 }); - test.expect(saved.total).to.equal(numDefsInitial + 10); - for (let i = 0; i < saved.decoders.length; i++) { - test - .expect(saved.decoders[i].toString('hex')) - .to.equal(encDefs[i].toString('hex')); - } - test.continue = true; - }); - - it('Should decode saved defs with check marks', async () => { - question( - 'Please REJECT if decoded params do not show check marks. Press ENT to continue.', - ); - // Test expected passes - req.txData.data = encDefsCalldata[0]; - await run(req); - req.txData.data = encDefsCalldata[9]; - await run(req); - // Test expected failure - req.txData.data = encDefsCalldata[10]; - req.data.decoder = encDefs[10]; - await run(req, true); - test.continue = true; - }); - - it('Should test decoding priority levels', async () => { - question( - 'Please REJECT if the data does not decode. Press ENT to continue.', - ); - req.txData.data = encDefsCalldata[10]; - req.data.decoder = encDefs[10]; - await run(req); - req.data.decoder = null; - await run(req, true); - test.continue = true; - }); - - it('Should fetch the first 10 defs', async () => { - const decoderType = Calldata.EVM.type; - const { total, decoders } = await test.client.getDecoders({ - decoderType, - startIdx: numDefsInitial, - n: 10, - }); - test.expect(total).to.equal(numDefsInitial + 10); - test.expect(decoders.length).to.equal(10); - for (let i = 0; i < decoders.length; i++) { - test - .expect(decoders[i].toString('hex')) - .to.equal(encDefs[i].toString('hex')); - } - test.continue = true; - }); - - it('Should remove the saved defs', async () => { - const decoderType = Calldata.EVM.type; - // Remove the first 5 defs - await test.client.removeDecoders({ - decoderType, - decoders: encDefs.slice(0, 5), - }); - // There should be 5 defs remaining - const { total, decoders } = await test.client.getDecoders({ - decoderType, - startIdx: numDefsInitial, - n: 10, - }); - test.expect(total).to.equal(numDefsInitial + 5); - test.expect(decoders.length).to.equal(5); - // Remove the latter 5 - await test.client.removeDecoders({ - decoderType, - decoders: encDefs.slice(5, 10), - }); - const { total, decoders } = await test.client.getDecoders({ - decoderType, - startIdx: numDefsInitial, - n: 10, - }); - // There should be no more new defs - test.expect(total).to.equal(numDefsInitial); - test.expect(decoders.length).to.equal(0); - // Test to make sure the check marks do not appear - question( - 'Please REJECT if decoded params do not show check marks. Press ENT to continue.', - ); - req.txData.data = encDefsCalldata[0]; - req.data.decoder = encDefs[0]; - await run(req, true); - req.txData.data = encDefsCalldata[9]; - req.data.decoder = encDefs[9]; - await run(req, true); - }); - */ - }); -}); - -//--------------------------------------- -// INTERNAL HELPERS -//--------------------------------------- -// Determine if ethers.js can decode calldata using an ABI def -function ethersCanDecode (calldata, abi, funcName) { - try { - const iface = new Interface(abi); - iface.decodeFunctionData(funcName, calldata); - return true; - } catch (err) { - return false; - } -} - -// Convert a decoder definition to something ethers can consume -function convertDecoderToEthers (def) { - const converted = getConvertedDef(def); - const types = [], - data = []; - converted.forEach((i) => { - types.push(i.type); - data.push(i.data); - }); - return { types, data }; -} - -// Convert an encoded def into a combination of ethers-compatable -// type names and data fields. The data should be random but it -// doesn't matter much for these tests, which mainly just test -// structure of the definitions -function getConvertedDef (def) { - const converted = []; - def.forEach((param) => { - const arrSzs = param[3]; - const evmType = EVM_TYPES[parseInt(param[1].toString('hex'), 16)]; - let type = evmType; - const numBytes = parseInt(param[2].toString('hex'), 16); - if (numBytes > 0) { - type = `${type}${numBytes * 8}`; - } - // Handle tuples by recursively generating data - let tupleData; - if (evmType === 'tuple') { - tupleData = []; - type = `${type}(`; - const tupleDef = getConvertedDef(param[4]); - tupleDef.forEach((tupleParam) => { - type = `${type}${tupleParam.type}, `; - tupleData.push(tupleParam.data); - }); - type = type.slice(0, type.length - 2); - type = `${type})`; - } - // Get the data of a single function (i.e. excluding arrays) - const funcData = tupleData ? tupleData : genParamData(param); - // Apply the data to arrays - for (let i = 0; i < arrSzs.length; i++) { - const sz = parseInt(arrSzs[i].toString('hex')); - if (isNaN(sz)) { - // This is a 0 size, which means we need to - // define a size to generate data - type = `${type}[]`; - } else { - type = `${type}[${sz}]`; - } - } - // If this param is a tuple we need to copy base data - // across all dimensions. The individual params are already - // arraified this way, but not the tuple type - if (tupleData) { - converted.push({ type, data: getArrayData(param, funcData) }); - } else { - converted.push({ type, data: funcData }); - } - }); - return converted; -} - -function genTupleData (tupleParam) { - const nestedData = []; - tupleParam.forEach((nestedParam) => { - nestedData.push( - genData( - EVM_TYPES[parseInt(nestedParam[1].toString('hex'), 16)], - nestedParam, - ), - ); - }); - return nestedData; -} - -function genParamData (param) { - const evmType = EVM_TYPES[parseInt(param[1].toString('hex'), 16)]; - const baseData = genData(evmType, param); - return getArrayData(param, baseData); -} - -function getArrayData (param, baseData) { - let arrayData, data; - const arrSzs = param[3]; - for (let i = 0; i < arrSzs.length; i++) { - let sz = parseInt(arrSzs[i].toString('hex')); - const dimData = []; - let sz = parseInt(param[3][i].toString('hex')); - if (isNaN(sz)) { - sz = 2; //1; - } - if (!arrayData) { - arrayData = []; - } - const lastDimData = JSON.parse(JSON.stringify(arrayData)); - for (let j = 0; j < sz; j++) { - if (i === 0) { - dimData.push(baseData); - } else { - dimData.push(lastDimData); - } - } - arrayData = dimData; - } - if (!data) { - data = arrayData ? arrayData : baseData; - } - return data; -} - -function genData (type, param) { - switch (type) { - case 'address': - return '0xdead00000000000000000000000000000000beef'; - case 'bool': - return true; - case 'uint': - return 9; - case 'int': - return -9; - case 'bytes': - return '0xdeadbeef'; - case 'string': - return 'string'; - case 'tuple': - if (!param || param.length < 4) { - throw new Error('Invalid tuple data'); - } - return genTupleData(param[4]); - default: - throw new Error('Unrecognized type'); - } -} - -async function run ( - req, - shouldFail = false, - bypassSetPayload = false, - useLegacySigning = false, -) { - test.continue = false; - try { - // Construct an @ethereumjs/tx object with data - const txData = JSON.parse(JSON.stringify(req.txData)); - const tx = EthTxFactory.fromTxData(txData, { common: req.common }); - if (useLegacySigning) { - // [TODO: Deprecate] - req.data = { - ...req.data, - ...req.txData, - }; - } - if (tx._type === 0 && !bypassSetPayload) { - // The @ethereumjs/tx Transaction APIs differ here - // Legacy transaction - req.data.payload = rlpEncode(tx.getMessageToSign(false)); - } else if (!bypassSetPayload) { - // Newer transaction type - req.data.payload = tx.getMessageToSign(false); - } - // Request signature and validate it - const resp = await test.client.sign(req); - if (shouldFail) { - // Exit here without continuing tests. If this block is reached it indicates - // the Lattice did not throw an error when we expected it to do so. - return; - } - const encodingType = req.data.encodingType || null; - const allowedEncodings = test.fwConstants.genericSigning.encodingTypes; - const { payloadBuf } = getEncodedPayload( - req.data.payload, - encodingType, - allowedEncodings, - ); - if (useLegacySigning) { - // [TODO: Deprecate] - req.data.curveType = Constants.SIGNING.CURVES.SECP256K1; - req.data.hashType = Constants.SIGNING.HASHES.KECCAK256; - req.data.encodingType = Constants.SIGNING.ENCODINGS.EVM; - } - test.helpers.validateGenericSig(test.seed, resp.sig, payloadBuf, req.data); - // Sign the original tx and compare - const { priv } = test.helpers.deriveSECP256K1Key( - req.data.signerPath, - test.seed, - ); - const signedTx = tx.sign(priv); - test - .expect(signedTx.verifySignature()) - .to.equal(true, 'Signature failed to verify'); - const refR = Buffer.from(signedTx.r.toBuffer()); - const refS = Buffer.from(signedTx.s.toBuffer()); - const refV = signedTx.v; - // Get params from Lattice sig - const latticeR = Buffer.from(resp.sig.r); - const latticeS = Buffer.from(resp.sig.s); - const latticeV = new BN(resp.sig.v); - // Strip off leading zeros to do an exact componenet check. - // We will still validate the original lattice sig in a tx. - const rToCheck = - latticeR.length !== refR.length - ? latticeR.slice(latticeR.length - refR.length) - : latticeR; - const sToCheck = - latticeS.length !== refS.length - ? latticeS.slice(latticeS.length - refS.length) - : latticeS; - // Validate the signature - test - .expect(rToCheck.equals(refR)) - .to.equal(true, 'Signature R component does not match reference'); - test - .expect(sToCheck.equals(refS)) - .to.equal(true, 'Signature S component does not match reference'); - test - .expect(latticeV.toString()) - .to.equal(refV.toString(), 'Signature V component does not match reference'); - // One more check -- create a new tx with the signatre params and verify it - const signedTxData = JSON.parse(JSON.stringify(txData)); - signedTxData.v = latticeV; - signedTxData.r = latticeR; - signedTxData.s = latticeS; - const verifTx = EthTxFactory.fromTxData(signedTxData, { - common: req.common, - }); - test - .expect(verifTx.verifySignature()) - .to.equal( - true, - 'Signature did not validate in recreated @ethereumjs/tx object', - ); - } catch (err) { - if (shouldFail) { - test.continue = true; - return; - } - test.expect(err.message).to.equal(null, err); - } - test.continue = !shouldFail; -} diff --git a/test/signing/index.ts b/test/signing/index.ts deleted file mode 100644 index 94cde9a1..00000000 --- a/test/signing/index.ts +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Test generic signing. We will validate signatures using unformatted message types - * (i.e. `encodingType=null`) and then we will validate signatures using firmware - * decoders. As new decoders are added, we will add more test files in this directory. - * - * We will keep some stuff in global state so that it can be easily reused by the - * individual test files. This is accessible via `global.test`. - * - * You must have `FEATURE_TEST_RUNNER=0` enabled in firmware to run these tests. - */ -import { expect } from 'chai'; -import seedrandom from 'seedrandom'; -import { getFwVersionConst } from '../../src/constants'; -import { getEncodedPayload } from '../../src/genericSigning'; -import helpers from '../testUtil/helpers'; - -async function runGeneric (req, test, expectedErr = undefined) { - test.continue = false; - let resp; - try { - resp = await test.client.sign(req); - // If no encoding type is specified we encode in hex or ascii - const encodingType = req.data.encodingType || null; - const allowedEncodings = test.fwConstants.genericSigning.encodingTypes; - const { payloadBuf } = getEncodedPayload( - req.data.payload, - encodingType, - allowedEncodings, - ); - test.helpers.validateGenericSig(test.seed, resp.sig, payloadBuf, req.data); - } catch (err) { - if (expectedErr) { - test.continue = true; - } - throw new Error(err); - } - test.continue = true; - return resp; -} - -describe('Test General Signing', () => { - before(() => { - global.test = { - continue: true, - client: helpers.setupTestClient(process.env), - seed: null, - fwConstants: null, - expect, - helpers, - runGeneric, - prng: new seedrandom(process.env.SEED || Math.random().toString()), - numIter: process.env.N || 5, - etherscanKey: process.env.ETHERSCAN_KEY, - }; - expect(global.test.client).to.not.equal(null); - }); - - beforeEach(() => { - expect(global.test.continue).to.equal(true, 'Error in previous test.'); - global.test.continue = false; - }); - - it('Should connect to a Lattice and make sure it is already paired.', async () => { - // Again, we assume that if an `id` has already been set, we are paired - // with the hardcoded privkey above. - global.test.continue = false; - expect(process.env.DEVICE_ID).to.not.equal(null); - const isPaired = await global.test.client.connect(process.env.DEVICE_ID); - expect(isPaired).to.equal(true); - expect(global.test.client.isPaired).to.equal(true); - expect(global.test.client.hasActiveWallet()).to.equal(true); - // Set the correct max gas price based on firmware version - global.test.fwConstants = getFwVersionConst(global.test.client.fwVersion); - if (!global.test.fwConstants.genericSigning) { - global.test.continue = false; - expect(true).to.equal( - false, - 'Firmware must be updated to run this test.', - ); - } - if ( - global.test.client.fwVersion.major === 0 && - global.test.client.fwVersion.minor < 15 - ) { - throw new Error('Please update Lattice firmware.'); - } - global.test.continue = true; - }); - - it('Should export the seed', async () => { - const activeWalletUID = helpers.copyBuffer( - global.test.client.getActiveWallet().uid, - ); - const jobType = helpers.jobTypes.WALLET_JOB_EXPORT_SEED; - const jobData = {}; - const jobReq = { - testID: 0, // wallet_job test ID - payload: helpers.serializeJobData(jobType, activeWalletUID, jobData), - }; - const res = await global.test.client.test(jobReq); - const _res = helpers.parseWalletJobResp(res, global.test.client.fwVersion); - global.test.continue = _res.resultStatus === 0; - expect(_res.resultStatus).to.equal(0); - const data = helpers.deserializeExportSeedJobResult(_res.result); - global.test.seed = helpers.copyBuffer(data.seed); - global.test.activeWalletUID = activeWalletUID; - global.test.continue = true; - }); - - it('Should load determinism tests', async () => { - require('./determinism'); - global.test.continue = true; - }); - - it('Should load unformatted tests', async () => { - require('./unformatted'); - global.test.continue = true; - }); - - it('Should load Solana tests', async () => { - require('./solana'); - global.test.continue = true; - }); - - it('Should load Terra tests', async () => { - require('./terra'); - global.test.continue = true; - }); - - it('Should load EVM tests', async () => { - require('./evm'); - global.test.continue = true; - }); -}); diff --git a/test/signing/solana.ts b/test/signing/solana.ts deleted file mode 100644 index cfdc5a42..00000000 --- a/test/signing/solana.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { - Keypair as SolanaKeypair, - PublicKey as SolanaPublicKey, - SystemProgram as SolanaSystemProgram, - Transaction as SolanaTransaction, -} from '@solana/web3.js'; -import { HARDENED_OFFSET } from '../../src/constants'; -import { Constants } from '../../src/index'; -let test; - -//--------------------------------------- -// STATE DATA -//--------------------------------------- -const DEFAULT_SOLANA_SIGNER = [ - HARDENED_OFFSET + 44, - HARDENED_OFFSET + 501, - HARDENED_OFFSET, - HARDENED_OFFSET, -]; -let req; - -//--------------------------------------- -// TESTS -//--------------------------------------- -describe('Start Solana signing tests', () => { - test = global.test; -}); - -describe('[Solana]', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req = { - data: { - curveType: Constants.SIGNING.CURVES.ED25519, - hashType: Constants.SIGNING.HASHES.NONE, - encodingType: Constants.SIGNING.ENCODINGS.SOLANA, - payload: null, - }, - }; - }); - - it('Should test and validate Solana transaction encoding', async () => { - // Build a Solana transaction with two signers, each derived from the Lattice's seed. - // This will require two separate general signing requests, one per signer. - - // Get the full set of Solana addresses and keys - // NOTE: Solana addresses are just base58 encoded public keys. We do not - // currently support exporting of Solana addresses in firmware but we can - // derive them here using the exported seed. - const derivedAPath = JSON.parse(JSON.stringify(DEFAULT_SOLANA_SIGNER)); - const derivedBPath = JSON.parse(JSON.stringify(DEFAULT_SOLANA_SIGNER)); - derivedBPath[3] += 1; - const derivedCPath = JSON.parse(JSON.stringify(DEFAULT_SOLANA_SIGNER)); - derivedCPath[3] += 2; - const derivedA = test.helpers.deriveED25519Key(derivedAPath, test.seed); - const derivedB = test.helpers.deriveED25519Key(derivedBPath, test.seed); - const derivedC = test.helpers.deriveED25519Key(derivedCPath, test.seed); - const pubA = new SolanaPublicKey(derivedA.pub); - const pubB = new SolanaPublicKey(derivedB.pub); - const pubC = new SolanaPublicKey(derivedC.pub); - - // Define transaction instructions - const transfer1 = SolanaSystemProgram.transfer({ - fromPubkey: pubA, - toPubkey: pubC, - lamports: 111, - }); - const transfer2 = SolanaSystemProgram.transfer({ - fromPubkey: pubB, - toPubkey: pubC, - lamports: 222, - }); - - // Generate a pseudorandom blockhash, which is just a public key appearently. - const randBuf = test.helpers.prandomBuf(test.prng, 32, true); - const recentBlockhash = - SolanaKeypair.fromSeed(randBuf).publicKey.toBase58(); - - // Build a transaction and sign it using Solana's JS lib - const txJs = new SolanaTransaction({ recentBlockhash }).add( - transfer1, - transfer2, - ); - txJs.setSigners(pubA, pubB); - txJs.sign( - SolanaKeypair.fromSeed(derivedA.priv), - SolanaKeypair.fromSeed(derivedB.priv), - ); - const serTxJs = txJs.serialize().toString('hex'); - - // Build a copy of the transaction and get the serialized payload for signing in firmware. - const txFw = new SolanaTransaction({ recentBlockhash }).add( - transfer1, - transfer2, - ); - txFw.setSigners(pubA, pubB); - // We want to sign the Solana message, not the full transaction - const payload = txFw.compileMessage().serialize(); - - // Sign payload from Lattice and add signatures to tx object - req.data.signerPath = derivedAPath; - req.data.payload = `0x${payload.toString('hex')}`; - let resp = await test.runGeneric(req, test); - if (!test.continue) { - return; - } - const sigA = Buffer.from( - `${resp.sig.r.toString('hex')}${resp.sig.s.toString('hex')}`, - 'hex', - ); - req.data.signerPath = derivedBPath; - resp = await test.runGeneric(req, test); - const sigB = Buffer.from( - `${resp.sig.r.toString('hex')}${resp.sig.s.toString('hex')}`, - 'hex', - ); - txFw.addSignature(pubA, sigA); - txFw.addSignature(pubB, sigB); - - // Validate the signatures from the Lattice match those of the Solana library - const serTxFw = txFw.serialize().toString('hex'); - test.expect(serTxFw).to.equal(serTxJs, 'Signed tx mismatch'); - }); -}); diff --git a/test/signing/terra.ts b/test/signing/terra.ts deleted file mode 100644 index 961e90af..00000000 --- a/test/signing/terra.ts +++ /dev/null @@ -1,359 +0,0 @@ -import { - BaseAccount as TerraBaseAccount, - Coin as TerraCoin, - Coins as TerraCoins, - Fee as TerraFee, - LCDClient as TerraClient, - ModeInfo as TerraModeInfo, - MsgExecuteContract as TerraMsgExecuteContract, - MsgMultiSend as TerraMsgMultiSend, - MsgSend as TerraMsgSend, - MsgSubmitProposal as TerraMsgSubmitProposal, - ParameterChangeProposal as TerraParameterChangeProposal, - RawKey as TerraRawKey, - SignDoc as TerraSignDoc, - SignerInfo as TerraSignerInfo, -} from '@terra-money/terra.js'; -import { SignMode as TerraSignMode } from '@terra-money/terra.proto/cosmos/tx/signing/v1beta1/signing'; -import { HARDENED_OFFSET } from '../../src/constants'; -import { Constants } from '../../src/index'; -let test; - -//--------------------------------------- -// STATE DATA -//--------------------------------------- -const DEFAULT_TERRA_SIGNER = [ - HARDENED_OFFSET + 44, - HARDENED_OFFSET + 330, - HARDENED_OFFSET, - 0, - 0, -]; -let req, terra; -describe('Start Terra signing tests', () => { - test = global.test; -}); - -//--------------------------------------- -// TESTS -//--------------------------------------- -describe('[Terra]', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req = { - data: { - signerPath: DEFAULT_TERRA_SIGNER, - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.SHA256, - encodingType: Constants.SIGNING.ENCODINGS.TERRA, - payload: null, - }, - }; - terra = { - // The Terra SDK is a little strange. We need to instantiate a client with - // a known testnet, but we will be creating a static transaction that doesn't - // use the testnet connection. We are just trying to create a signed transaction - // and then validate Lattice signatures against the ones generated using - // the Terra/Cosmos SDK - client: new TerraClient({ - chainID: 'bombay-12', - URL: 'https://bombay-lcd.terra.dev', - gasPrices: { uluna: 0.38 }, - }), - // A random nonce for state pruning or something? - account_number: 111, - // The account's nonce. Hilarious naming. - sequence: 0, - }; - }); - - // Get a base account instance for the global seed at designated path - function getTerraAccount(path) { - const key = new TerraRawKey( - test.helpers.deriveSECP256K1Key(path, test.seed).priv, - ); - const account = TerraBaseAccount.fromData({ - address: key.accAddress, - pub_key: key.publicKey.toData(), - account_number: terra.account_number, - sequence: terra.sequence, - }); - const info = { - address: account.address, - publicKey: account.public_key, - sequenceNumber: account.getSequenceNumber(), - }; - return { - key, - account, - info, - }; - } - - // A "signDoc" is used to build the payload - function getSignDoc(signer, tx) { - return new TerraSignDoc( - terra.client.config.chainID, - signer.account.getAccountNumber(), - signer.account.getSequenceNumber(), - tx.auth_info, - tx.body, - ); - } - - // To get the payload, we create a sign doc and then overwrite - // the 'signer_infos' param to get the bytes we need to sign. - // https://github.com/terra-money/terra.js/blob/ - // 6fe2b2042e598842b5f99a93d929789a7a065b16/src/key/Key.ts#L94 - function getTerraPayload (signer, tx, isLegacy = false) { - const signDoc = getSignDoc(signer, tx); - if (isLegacy) { - return Buffer.from(signDoc.toAminoJSON()); - } - signDoc.auth_info.signer_infos = [ - new TerraSignerInfo( - signer.account.public_key, - signDoc.sequence, - new TerraModeInfo( - new TerraModeInfo.Single(TerraSignMode.SIGN_MODE_DIRECT), - ), - ), - ]; - return signDoc.toBytes(); - } - - // Get a signature from terra.js to compare against Lattice sig - async function getTerraJsSig (signer, tx, isLegacy = false) { - const signDoc = getSignDoc(signer, tx); - let _jsSig; - if (isLegacy) { - _jsSig = await signer.key.createSignatureAmino(signDoc); - } else { - _jsSig = await signer.key.createSignature(signDoc); - } - return Buffer.from(_jsSig.data.single.signature, 'base64'); - } - - it('Should test address derivations', async () => { - const path = req.data.signerPath; - for (let i = 0; i < 5; i++) { - path[4] += i; - const jsAccount = getTerraAccount(req.data.signerPath); - const jsPub = Buffer.from(jsAccount.account.public_key.key, 'base64').toString('hex'); - const latticePubs = await test.client.getAddresses({ - startPath: DEFAULT_TERRA_SIGNER, - n: 1, - flag: Constants.GET_ADDR_FLAGS.SECP256K1_PUB, - }) - const latticePub = test.helpers.compressPubKey(latticePubs[0]).toString('hex'); - test.expect(latticePub).to.equal(jsPub, 'Pubkeys did not match'); - } - }) - - it('Should decode MsgSend', async () => { - // Get signer account - const signer = getTerraAccount(req.data.signerPath); - // Construct tx - const gasCoins = new TerraCoins([ - TerraCoin.fromData({ amount: '23438', denomc: 'uusd' }), - ]); - const estimatedGas = 156249; - const fee = new TerraFee(estimatedGas, gasCoins); - const to = 'terra1f7m53lnz5w9arm2ks8jhqeuaphsu83lakmz4gr'; - const msgs = [ - new TerraMsgSend(signer.account.address, to, { uluna: 10000 }), - ]; - const txData = { fee, msgs, timeoutHeight: 1000 }; - const tx = await terra.client.tx.create([signer.info], txData); - req.data.payload = getTerraPayload(signer, tx); - // Get signature from Lattice and compare to Terra.js sig from derived key - const resp = await test.runGeneric(req, test); - const jsSig = await getTerraJsSig(signer, tx); - const latticeSig = `${resp.sig.r.toString('hex')}${resp.sig.s.toString( - 'hex', - )}`; - test - .expect(latticeSig) - .to.equal(jsSig.toString('hex'), 'Sigs did not match'); - }); - - it('Should decode MsgMultiSend', async () => { - const path = JSON.parse(JSON.stringify(DEFAULT_TERRA_SIGNER)); - const signerA = getTerraAccount(path); - path[4] = 1; - const signerB = getTerraAccount(path); - path[4] = 2; - const signerC = getTerraAccount(path); - const msgs = [ - new TerraMsgMultiSend( - [ - new TerraMsgMultiSend.Input(signerA.account.address, { - uluna: 10000, - }), - new TerraMsgMultiSend.Input(signerB.account.address, { - uluna: 10000, - }), - ], - [ - new TerraMsgMultiSend.Output(signerC.account.address, { - uluna: 20000, - }), - ], - ), - new TerraMsgMultiSend( - [ - new TerraMsgMultiSend.Input(signerA.account.address, { - uluna: 20000, - }), - new TerraMsgMultiSend.Input(signerB.account.address, { - uluna: 20000, - }), - ], - [ - new TerraMsgMultiSend.Output(signerC.account.address, { - uluna: 40000, - }), - ], - ), - ]; - const txData = { - msgs, - fee: new TerraFee('10009999999999999'), - timeoutHeight: 1000, - }; - const tx = await terra.client.tx.create( - [signerA.info, signerB.info], - txData, - ); - req.data.payload = getTerraPayload(signerA, tx); - - // Signer A - const respA = await test.runGeneric(req, test); - if (!test.continue) { - return; - } - const jsSigA = await getTerraJsSig(signerA, tx); - const latticeSigA = `${respA.sig.r.toString('hex')}${respA.sig.s.toString( - 'hex', - )}`; - test - .expect(latticeSigA) - .to.equal(jsSigA.toString('hex'), 'Sigs did not match'); - // Signer B - req.data.signerPath[4] = 1; - req.data.payload = getTerraPayload(signerB, tx); - const respB = await test.runGeneric(req, test); - const jsSigB = await getTerraJsSig(signerB, tx); - const latticeSigB = `${respB.sig.r.toString('hex')}${respB.sig.s.toString( - 'hex', - )}`; - test - .expect(latticeSigB) - .to.equal(jsSigB.toString('hex'), 'Sigs did not match'); - }); - - it('Should decode MsgExecuteContract', async () => { - // Get signer account - const signer = getTerraAccount(req.data.signerPath); - // Construct tx - const gasCoins = new TerraCoins([ - TerraCoin.fromData({ amount: '23438', denomc: 'uusd' }), - ]); - const estimatedGas = 156249; - const fee = new TerraFee(estimatedGas, gasCoins); - const to = 'terra1f7m53lnz5w9arm2ks8jhqeuaphsu83lakmz4gr'; - const msgs = [ - new TerraMsgExecuteContract( - signer.account.address, - to, - { - swap: { - offer_asset: { - amount: '1000000', - info: { - native_token: { - denom: 'uluna', - }, - }, - }, - }, - }, - { uluna: 1000000 }, - ), - ]; - const txData = { fee, msgs }; - const tx = await terra.client.tx.create([signer.info], txData); - req.data.payload = getTerraPayload(signer, tx); - // Get signature from Lattice and compare to Terra.js sig from derived key - const resp = await test.runGeneric(req, test); - const jsSig = await getTerraJsSig(signer, tx); - const latticeSig = `${resp.sig.r.toString('hex')}${resp.sig.s.toString( - 'hex', - )}`; - test - .expect(latticeSig) - .to.equal(jsSig.toString('hex'), 'Sigs did not match'); - }); - - it('Should fail decode unsupported message type but still decode the tx', async () => { - // Get signer account - const signer = getTerraAccount(req.data.signerPath); - // Construct tx - const gasCoins = new TerraCoins([ - TerraCoin.fromData({ amount: '23438', denomc: 'uusd' }), - ]); - const estimatedGas = 156249; - const fee = new TerraFee(estimatedGas, gasCoins); - const msgs = [ - // There are various message types that we do not decode, so while - // we can decode the transaction, the message data display as raw bytes - new TerraMsgSubmitProposal( - new TerraParameterChangeProposal('title', 'description', [ - { subspace: 'staking', key: 'MaxValidators', value: '130' }, - ]), - { uluna: 10000 }, - signer.account.address, - ), - ]; - const txData = { fee, msgs }; - const tx = await terra.client.tx.create([signer.info], txData); - req.data.payload = getTerraPayload(signer, tx); - // Get signature from Lattice and compare to Terra.js sig from derived key - const resp = await test.runGeneric(req, test); - const jsSig = await getTerraJsSig(signer, tx); - const latticeSig = `${resp.sig.r.toString('hex')}${resp.sig.s.toString( - 'hex', - )}`; - test - .expect(latticeSig) - .to.equal(jsSig.toString('hex'), 'Sigs did not match'); - }); - - it('Should sign a legacy Amino payload without the decoder', async () => { - // Get signer account - const signer = getTerraAccount(req.data.signerPath); - // Construct tx - const gasCoins = new TerraCoins([ - TerraCoin.fromData({ amount: '23438', denomc: 'uusd' }), - ]); - const estimatedGas = 156249; - const fee = new TerraFee(estimatedGas, gasCoins); - const to = 'terra1f7m53lnz5w9arm2ks8jhqeuaphsu83lakmz4gr'; - const msgs = [ - new TerraMsgSend(signer.account.address, to, { uluna: 10000 }), - ]; - const txData = { fee, msgs }; - const tx = await terra.client.tx.create([signer.info], txData); - req.data.payload = getTerraPayload(signer, tx, true); - req.data.encodingType = null; - // Get signature from Lattice and compare to Terra.js sig from derived key - const resp = await test.runGeneric(req, test); - const jsSig = await getTerraJsSig(signer, tx, true); - const latticeSig = `${resp.sig.r.toString('hex')}${resp.sig.s.toString( - 'hex', - )}`; - test - .expect(latticeSig) - .to.equal(jsSig.toString('hex'), 'Sigs did not match'); - }); -}); diff --git a/test/signing/unformatted.ts b/test/signing/unformatted.ts deleted file mode 100644 index 5ab71f9f..00000000 --- a/test/signing/unformatted.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { HARDENED_OFFSET } from '../../src/constants'; -import { Constants } from '../../src/index'; -let test; - -//--------------------------------------- -// STATE DATA -//--------------------------------------- -const DEFAULT_SIGNER = [ - HARDENED_OFFSET + 44, - HARDENED_OFFSET + 60, - HARDENED_OFFSET, - 0, - 0, -]; -let req; - -//--------------------------------------- -// TESTS -//--------------------------------------- -describe('Start unformatted signing tests', () => { - test = global.test; -}); - -describe('[Unformatted]', () => { - beforeEach(() => { - test.expect(test.continue).to.equal(true, 'Error in previous test.'); - req = { - data: { - signerPath: DEFAULT_SIGNER, - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.KECCAK256, - payload: null, - }, - }; - }); - - it('Should test pre-hashed messages', async () => { - const { extraDataFrameSz, extraDataMaxFrames, genericSigning } = - test.fwConstants; - const { baseDataSz } = genericSigning; - // Max size that won't be prehashed - const maxSz = baseDataSz + extraDataMaxFrames * extraDataFrameSz; - // Use extraData frames - req.data.payload = `0x${test.helpers - .prandomBuf(test.prng, maxSz, true) - .toString('hex')}`; - await test.runGeneric(req, test); - if (!test.continue) { - return; - } - // Prehash (keccak256) - req.data.payload = `0x${test.helpers - .prandomBuf(test.prng, maxSz + 1, true) - .toString('hex')}`; - await test.runGeneric(req, test); - if (!test.continue) { - return; - } - // Prehash (sha256) - req.data.hashType = Constants.SIGNING.HASHES.SHA256; - await test.runGeneric(req, test); - }); - - it('Should test ASCII text formatting', async () => { - // Build a payload that uses spaces and newlines - req.data.payload = JSON.stringify( - { - testPayload: 'json with spaces', - anotherThing: -1, - }, - null, - 2, - ); - await test.runGeneric(req, test); - }); - - it('Should validate SECP256K1/KECCAK signature against dervied key', async () => { - // ASCII message encoding - req.data.payload = 'test'; - await test.runGeneric(req, test); - if (!test.continue) { - return; - } - // Hex message encoding - req.data.payload = '0x123456'; - await test.runGeneric(req, test); - }); - - it('Should validate ED25519/NULL signature against dervied key', async () => { - // Make generic signing request - req.data.payload = '0x123456'; - req.data.curveType = Constants.SIGNING.CURVES.ED25519; - req.data.hashType = Constants.SIGNING.HASHES.NONE; - // ED25519 derivation requires hardened indices - req.data.signerPath = DEFAULT_SIGNER.slice(0, 3); - await test.runGeneric(req, test); - }); - - it('Should validate SECP256K1/KECCAK signature against ETH_MSG request (legacy)', async () => { - // Generic request - const msg = 'Testing personal_sign'; - const psMsg = test.helpers.ethPersonalSignMsg(msg); - // NOTE: The request contains some non ASCII characters so it will get - // encoded as hex automatically. - req.data.payload = psMsg; - // Legacy request - const legacyReq = { - currency: 'ETH_MSG', - data: { - signerPath: req.data.signerPath, - payload: msg, - protocol: 'signPersonal', - }, - }; - const respGeneric = await test.runGeneric(req, test); - const respLegacy = await test.client.sign(legacyReq); - test.expect(!!respLegacy.err).to.equal(false, respLegacy.err); - const genSig = `${respGeneric.sig.r.toString( - 'hex', - )}${respGeneric.sig.s.toString('hex')}`; - const legSig = `${respLegacy.sig.r.toString( - 'hex', - )}${respLegacy.sig.s.toString('hex')}`; - test - .expect(genSig) - .to.equal(legSig, 'Legacy and generic requests produced different sigs.'); - }); - - it('Should test random payloads', async () => { - for (let i = 0; i < test.numIter; i++) { - req.data.payload = test.helpers.prandomBuf( - test.prng, - test.fwConstants.genericSigning.baseDataSz, - ); - // 1. Secp256k1/keccak256 - req.data.curveType = Constants.SIGNING.CURVES.SECP256K1; - req.data.hashType = Constants.SIGNING.HASHES.KECCAK256; - await test.runGeneric(req, test); - if (!test.continue) { - return; - } - // 2. Secp256k1/sha256 - req.data.hashType = Constants.SIGNING.HASHES.SHA256; - await test.runGeneric(req, test); - if (!test.continue) { - return; - } - // 3. Ed25519 - req.data.curveType = Constants.SIGNING.CURVES.ED25519; - req.data.hashType = Constants.SIGNING.HASHES.NONE; - req.data.signerPath = DEFAULT_SIGNER.slice(0, 3); - await test.runGeneric(req, test); - if (!test.continue) { - return; - } - } - }); -}); diff --git a/test/testAll.ts b/test/testAll.ts deleted file mode 100644 index b1506ade..00000000 --- a/test/testAll.ts +++ /dev/null @@ -1,535 +0,0 @@ -/** - * Tests for establishing a connection to a target Lattice and validating - * basic functionality. - * - * This test suite serves two purposes: - * - * 1. You need to run this before you can run any other tests. Run it with `REUSE_KEY=1` - * as an `env` param. This will ask you for a device ID and will attempt a pairing - * with the target Lattice. Note that the Lattice cannot already be paired so you may - * need to remove the SDK permission before proceeding to re-pair. After you pair, - * the connection will be cached locally and you can run subsequent tests with - * `DEVICE_ID=` as an `env` param. This includes *any* test, including - * this one. - * - * 2. You can run this to just validate basic connectivity. If you don't need to cache - * the connection you can run this without any `env` params and it will attempt to - * pair with a target Lattice. - */ -import Common, { Chain, Hardfork } from '@ethereumjs/common'; -import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; -import { expect } from 'chai'; -import { question } from 'readline-sync'; -import { - getFwVersionConst, - HARDENED_OFFSET, - responseCodes, - responseMsgs, -} from '../src/constants'; -import { Constants } from '../src/index'; -import { randomBytes } from '../src/util'; -import helpers from './testUtil/helpers'; - -let client, id; -let continueTests = true; - -describe('Connect and Pair', () => { - before(() => { - client = helpers.setupTestClient(process.env); - if (process.env.DEVICE_ID) { - id = process.env.DEVICE_ID; - } - }); - - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Error found in prior test. Aborting.', - ); - continueTests = false; - }); - - //------------------------------------------- - // TESTS - //------------------------------------------- - it('Should connect to a Lattice', async () => { - // Again, we assume that if an `id` has already been set, we are paired - // with the hardcoded privkey above. - if (!process.env.DEVICE_ID) { - const _id = question('Please enter the ID of your test device: '); - id = _id; - const isPaired = await client.connect(id); - expect(isPaired).to.equal(false); - expect(client.isPaired).to.equal(false); - expect(client.hasActiveWallet()).to.equal(false); - } - continueTests = true; - }); - - it('Should attempt to pair with pairing secret', async () => { - if (!process.env.DEVICE_ID) { - const secret = question('Please enter the pairing secret: '); - const hasActiveWallet = await client.pair(secret); - expect(hasActiveWallet).to.equal(true); - expect(client.hasActiveWallet()).to.equal(true); - } - continueTests = true; - }); - - it('Should try to connect again but recognize the pairing already exists', async () => { - const isPaired = await client.connect(id); - expect(isPaired).to.equal(true); - expect(client.isPaired).to.equal(true); - expect(client.hasActiveWallet()).to.equal(true); - continueTests = true; - }); - - it('Should test SDK dehydration/rehydration', async () => { - const addrData = { - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_COIN, - HARDENED_OFFSET, - 0, - 0, - ], - n: 1, - }; - const addrs1 = await client.getAddresses(addrData); - // Test a second client - const stateData = client.getStateData(); - const clientTwo = helpers.setupTestClient(null, stateData); - const addrs2 = await clientTwo.getAddresses(addrData); - expect(JSON.stringify(addrs1)).to.equal( - JSON.stringify(addrs2), - 'Client not rehydrated properly', - ); - continueTests = true; - }); - - it('Should get addresses', async () => { - const fwConstants = getFwVersionConst(client.fwVersion); - const addrData = { - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_COIN, - HARDENED_OFFSET, - 0, - 0, - ], - n: 5, - }; - // Bitcoin addresses - // NOTE: The format of address will be based on the user's Lattice settings - // By default, this will be P2SH(P2WPKH), i.e. addresses that start with `3` - let addrs; - addrs = await client.getAddresses(addrData); - expect(addrs.length).to.equal(5); - expect(addrs[0][0]).to.equal('3'); - - // Ethereum addresses - addrData.startPath[0] = helpers.BTC_PURPOSE_P2PKH; - addrData.startPath[1] = helpers.ETH_COIN; - addrData.n = 1; - addrs = await client.getAddresses(addrData); - expect(addrs.length).to.equal(1); - expect(addrs[0].slice(0, 2)).to.equal('0x'); - // If firmware supports it, try shorter paths - if (fwConstants.flexibleAddrPaths) { - const flexData = { - startPath: [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - ], - n: 1, - }; - addrs = await client.getAddresses(flexData); - expect(addrs.length).to.equal(1); - expect(addrs[0].slice(0, 2)).to.equal('0x'); - } - // Should fail for non-EVM purpose and non-matching coin_type - addrData.startPath[0] = helpers.BTC_PURPOSE_P2WPKH; - addrData.n = 1; - await client.getAddresses(addrData); - // Switch to BTC coin. Should work now. - addrData.startPath[1] = helpers.BTC_COIN; - // Bech32 - addrs = await client.getAddresses(addrData); - expect(addrs.length).to.equal(1); - expect(addrs[0].slice(0, 3)).to.be.oneOf(['bc1']); - addrData.startPath[0] = helpers.BTC_PURPOSE_P2SH_P2WPKH; - addrData.n = 5; - - addrData.startPath[4] = 1000000; - addrData.n = 3; - addrs = await client.getAddresses(addrData); - expect(addrs.length).to.equal(addrData.n); - addrData.startPath[4] = 0; - addrData.n = 1; - - // Unsupported purpose (m//) - addrData.startPath[0] = 0; // Purpose 0 -- undefined - try { - addrs = await client.getAddresses(addrData); - } catch (err) { - expect(err.message).to.not.equal(null); - } - addrData.startPath[0] = helpers.BTC_PURPOSE_P2SH_P2WPKH; - - // Unsupported currency - addrData.startPath[1] = HARDENED_OFFSET + 5; // 5' currency - aka unknown - try { - addrs = await client.getAddresses(addrData); - throw new Error('Expected failure but got success.'); - } catch (err) { - expect(err.message).to.not.equal(null); - } - addrData.startPath[1] = helpers.BTC_COIN; - // Too many addresses (n>10) - addrData.n = 11; - try { - addrs = await client.getAddresses(addrData); - throw new Error('Expected failure but got success.'); - } catch (err) { - expect(err.message).to.not.equal(null); - } - continueTests = true; - }); - - it('Should sign Ethereum transactions', async () => { - if (client.fwVersion.major === 0 && client.fwVersion.minor < 15) { - console.warn('Please update firmware. Skipping ETH signing tests.'); - continueTests = true; - return; - } - const fwConstants = getFwVersionConst(client.fwVersion); - const signerPath = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ]; - const common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }); - let txData = { - type: 1, - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 1000000000000, - data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8', - }; - let tx = EthTxFactory.fromTxData(txData, { common }); - const req = { - data: { - signerPath, - payload: tx.getMessageToSign(false), - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.KECCAK256, - encodingType: Constants.SIGNING.ENCODINGS.EVM, - }, - }; - - // Legacy transaction - await client.sign(req); - - // Switch to newer type - txData = { - type: 2, - maxFeePerGas: 1200000000, - maxPriorityFeePerGas: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 1000000000000, - data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8', - }; - - // Test data range - const maxDataSz = - fwConstants.ethMaxDataSz + - fwConstants.extraDataMaxFrames * fwConstants.extraDataFrameSz; - // NOTE: This will display a prehashed payload for bridged general signing - // requests because `ethMaxDataSz` represents the `data` field for legacy - // requests, but it represents the entire payload for general signing requests. - txData.data = randomBytes(maxDataSz); - tx = EthTxFactory.fromTxData(txData, { common }); - req.data.payload = tx.getMessageToSign(false); - await client.sign(req); - question( - 'Please REJECT the next request if the warning screen displays. Press enter to continue.', - ); - req.data.data = randomBytes(maxDataSz + 1); - tx = EthTxFactory.fromTxData(txData, { common }); - req.data.payload = tx.getMessageToSign(false); - let rejected = false; - try { - await client.sign(req); - } catch (err) { - rejected = - err.message.indexOf(responseMsgs[responseCodes.RESP_ERR_USER_DECLINED]) > -1; - } finally { - expect(rejected).to.equal(true); - } - continueTests = true; - }); - - it('Should sign legacy Bitcoin inputs', async () => { - const txData = { - prevOuts: [ - { - txHash: - '6e78493091f80d89a92ae3152df7fbfbdc44df09cf01a9b76c5113c02eaf2e0f', - value: 10000, - index: 1, - signerPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 0, - 0, - ], - }, - ], - recipient: 'mhifA1DwiMPHTjSJM8FFSL8ibrzWaBCkVT', - value: 1000, - fee: 1000, - // isSegwit: false, // old encoding - changePath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 1, - 0, - ], - }; - const req = { - currency: 'BTC', - data: txData, - }; - - // Sign a legit tx - const sigResp = await client.sign(req); - expect(sigResp.tx).to.not.equal(null); - expect(sigResp.txHash).to.not.equal(null); - continueTests = true; - }); - - it('Should sign wrapped segwit Bitcoin inputs', async () => { - const txData = { - prevOuts: [ - { - txHash: - 'ab8288ef207f11186af98db115aa7120aa36ceb783e8792fb7b2f39c88109a99', - value: 10000, - index: 1, - signerPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 0, - 0, - ], - }, - ], - recipient: '2NGZrVvZG92qGYqzTLjCAewvPZ7JE8S8VxE', - value: 1000, - fee: 1000, - changePath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 1, - 0, - ], - }; - const req = { - currency: 'BTC', - data: txData, - }; - // Sign a legit tx - const sigResp = await client.sign(req); - expect(sigResp.tx).to.not.equal(null); - expect(sigResp.txHash).to.not.equal(null); - continueTests = true; - }); - - it('Should sign wrapped segwit Bitcoin inputs to a bech32 address', async () => { - const txData = { - prevOuts: [ - { - txHash: - 'f93d0a77f58b4274d84f427d647f1f27e38b4db79fd975691e15109fde7ea06e', - value: 1802440, - index: 1, - signerPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 1, - 0, - ], - }, - ], - recipient: 'tb1qym0z2a939lefrgw67ep5flhf43dvpg3h4s96tn', - value: 1000, - fee: 1000, - changePath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 1, - 0, - ], - }; - const req = { - currency: 'BTC', - data: txData, - }; - // Sign a legit tx - const sigResp = await client.sign(req); - expect(sigResp.tx).to.not.equal(null); - expect(sigResp.txHash).to.not.equal(null); - continueTests = true; - }); - - it('Should sign an input from a native segwit account', async () => { - const txData = { - prevOuts: [ - { - txHash: - 'b2efdbdd3340d2bc547671ce3993a6f05d70343c07578f9d7f5626fdfc06fa35', - value: 76800, - index: 0, - signerPath: [ - helpers.BTC_PURPOSE_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 0, - 0, - ], - }, - ], - recipient: '2N4gqWT4oqWL2gz9ps92z9fm2Bg3FUkqG7Q', - value: 70000, - fee: 4380, - isSegwit: true, - changePath: [ - helpers.BTC_PURPOSE_P2WPKH, - helpers.BTC_TESTNET_COIN, - HARDENED_OFFSET, - 1, - 0, - ], - }; - const req = { - currency: 'BTC', - data: txData, - }; - // Sign a legit tx - const sigResp = await client.sign(req); - expect(sigResp.tx).to.not.equal(null); - expect(sigResp.txHash).to.not.equal(null); - expect(sigResp.changeRecipient.slice(0, 2)).to.equal('tb'); - }); - - /* - This feature does not work with general signing requests and will - need to be deprecated in its current form and replaced with handlers - in decoder utils - it('Should test permission limits', async () => { - try { - continueTests = false; - // Fail to add permissions where limit or window is 0 - const opts = { - currency: 'ETH', - timeWindow: 0, - limit: 5, - decimals: 18, - asset: null, - }; - try { - await client.addPermissionV0(opts); - } catch (err) { - expect(err.message).to.equal('Time window and spending limit must be positive.'); - } - try { - opts.timeWindow = 300; - opts.limit = 0; - await client.addPermissionV0(opts); - } catch (err) { - expect(err.message).to.equal('Time window and spending limit must be positive.'); - } - // Add a 5-minute permission allowing 5 wei to be spent - opts.timeWindow = 300; - opts.limit = 5; - await client.addPermissionV0(opts); - // Fail to add the same permission again - try { - await client.addPermissionV0(opts); - } catch (err) { - const expectedCode = responseCodes.RESP_ERR_ALREADY; - expect( - err.message.indexOf(responseMsgs[expectedCode]) - ).to.be.greaterThan(-1); - } - // Spend 2 wei - const txData = { - nonce: 0, - gasPrice: 1200000000, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 2, - data: null, - }; - const req = { - currency: 'ETH', - data: { - signerPath: [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ], - ...txData, - chainId: 4, - }, - }; - // Test the spending limit. The first two requests should auto-sign. - // Spend once -> 3 wei left - let signResp = await client.sign(req); - expect(signResp.tx).to.not.equal(null); - // Spend again -> 1 wei left - signResp = await client.sign(req); - expect(signResp.tx).to.not.equal(null); - // Spend again. This time it should fail to load the permission - question( - 'Please REJECT the following transaction request. Press enter to continue.' - ); - try { - signResp = await client.sign(req); - expect(signResp.tx).to.equal(null); - } catch (err) { - const expectedCode = responseCodes.RESP_ERR_USER_DECLINED; - expect( - err.message.indexOf(responseMsgs[expectedCode]) - ).to.be.greaterThan(-1); - } - // Spend 1 wei this time. This should be allowed by the permission. - req.data.value = 1; - signResp = await client.sign(req); - expect(signResp.tx).to.not.equal(null); - continueTests = true; - } catch (err) { - expect(err.message).to.equal(null, err); - } - }); - */ -}); diff --git a/test/testBtc.ts b/test/testBtc.ts deleted file mode 100644 index 58274e04..00000000 --- a/test/testBtc.ts +++ /dev/null @@ -1,325 +0,0 @@ -// You must have `FEATURE_TEST_RUNNER10` enabled in firmware to run these tests. -import bip32 from 'bip32'; -import { expect } from 'chai'; -import seedrandom from 'seedrandom'; -import helpers from './testUtil/helpers'; -const prng = new seedrandom(process.env.SEED || 'myrandomseed'); -const TEST_TESTNET = !!process.env.TESTNET || false; -let client, - activeWalletUID, - wallet = null, - continueTests = true; - - -// Build the inputs. By default we will build 10. Note that there are `n` tests for -// *each category*, where `n` is the number of inputs. -function rand32Bit () { - return Math.floor(prng.quick() * 2 ** 32); -} -const inputs = []; -const count = process.env.N ? process.env.N : 3; -for (let i = 0; i < count; i++) { - const hash = Buffer.alloc(32); - for (let j = 0; j < 8; j++) { - // 32 bits of randomness per call - hash.writeUInt32BE(rand32Bit(), j * 4); - } - const value = Math.floor(rand32Bit()); - const signerIdx = Math.floor(prng.quick() * 19); // Random signer (keep it inside initial cache of 20) - const idx = Math.floor(prng.quick() * 25); // Random previous output index (keep it small) - inputs.push({ hash: hash.toString('hex'), value, signerIdx, idx }); -} - -async function testSign (req, signingKeys, sigHashes) { - const tx = await client.sign(req); - expect(tx.sigs.length).to.equal(signingKeys.length); - expect(tx.sigs.length).to.equal(sigHashes.length); - for (let i = 0; i < tx.sigs.length; i++) { - const sig = helpers.stripDER(tx.sigs[i]); - const verification = signingKeys[i].verify(sigHashes[i], sig); - if (!verification) continueTests = false; - expect(verification).to.equal(true, - `Signature validation failed for priv=${signingKeys[i].privateKey.toString('hex')}, ` - + `hash=${sigHashes[i].toString('hex')}, sig=${sig.toString('hex')}`); - } -} - -describe('Fetch wallet seed', () => { - before(() => { - client = helpers.setupTestClient(process.env); - }); - - it('Should connect to a Lattice and make sure it is already paired.', async () => { - continueTests = false; - expect(process.env.DEVICE_ID).to.not.equal(null); - await client.connect(process.env.DEVICE_ID); - expect(client.isPaired).to.equal(true); - expect(client.hasActiveWallet()).to.equal(true); - activeWalletUID = helpers.copyBuffer(client.getActiveWallet().uid); - continueTests = true; - }); -}); - -describe('exportSeed', () => { - it('Should get GP_SUCCESS for a known, connected wallet', async () => { - expect(activeWalletUID).to.not.equal(null, 'No wallet found'); - const jobType = helpers.jobTypes.WALLET_JOB_EXPORT_SEED; - const jobData = {}; - const jobReq = { - testID: 0, // wallet_job test ID - payload: helpers.serializeJobData(jobType, activeWalletUID, jobData), - }; - - const res = await client.test(jobReq); - const _res = helpers.parseWalletJobResp(res, client.fwVersion); - expect(_res.resultStatus).to.equal(0); - const data = helpers.deserializeExportSeedJobResult(_res.result); - const activeWalletSeed = helpers.copyBuffer(data.seed); - wallet = bip32.fromSeed(activeWalletSeed); - }); -}); - -async function run (p) { - await testSign(p.txReq, p.signingKeys, p.sigHashes); -} - -async function runTestSet (opts, wallet, inputsSlice) { - if (TEST_TESTNET) { - // Testnet + change - try { - opts.isTestnet = true; - opts.useChange = true; - await run( - helpers.setup_btc_sig_test(opts, wallet, inputsSlice, prng) - ); - } catch (err) { - expect(err.message).to.equal( - null, - `Failed in (testnet, change): ${err.message()}` - ); - continueTests = false; - } - // Testnet + no change - try { - opts.isTestnet = true; - opts.useChange = false; - await run( - helpers.setup_btc_sig_test(opts, wallet, inputsSlice, prng) - ); - } catch (err) { - expect(err.message).to.equal( - null, - `Failed in (testnet, !change): ${err.message()}` - ); - continueTests = false; - } - } - // Mainnet + change - try { - opts.isTestnet = false; - opts.useChange = true; - await run( - helpers.setup_btc_sig_test(opts, wallet, inputsSlice, prng) - ); - } catch (err) { - expect(err.message).to.equal( - null, - `Failed in (!testnet, change): ${err.message()}` - ); - continueTests = false; - } - // Mainnet + no change - try { - opts.isTestnet = false; - opts.useChange = false; - await run( - helpers.setup_btc_sig_test(opts, wallet, inputsSlice, prng) - ); - } catch (err) { - expect(err.message).to.equal( - null, - `Failed in (!testnet, !change): ${err.message()}` - ); - continueTests = false; - } -} - -describe('Test segwit spender (p2wpkh)', function () { - beforeEach(() => { - expect(continueTests).to.equal(true, 'Previous test failed. Aborting'); - }); - - it('Should test p2wpkh->p2pkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2WPKH, - recipientPurpose: helpers.BTC_PURPOSE_P2PKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) - - it('Should test p2wpkh->p2sh-p2wpkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2WPKH, - recipientPurpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) - - it('Should test p2wpkh->p2wpkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2WPKH, - recipientPurpose: helpers.BTC_PURPOSE_P2WPKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) -}) - -describe('Test wrapped segwit spender (p2sh-p2wpkh)', function () { - beforeEach(() => { - expect(continueTests).to.equal(true, 'Previous test failed. Aborting'); - }); - - it('Should test p2sh-p2wpkh->p2pkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - recipientPurpose: helpers.BTC_PURPOSE_P2PKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) - - it('Should test p2sh-p2wpkh->p2sh-p2wpkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - recipientPurpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) - - it('Should test p2sh-p2wpkh->p2wpkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - recipientPurpose: helpers.BTC_PURPOSE_P2WPKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) -}) - -describe('Test legacy spender (p2pkh)', function () { - beforeEach(() => { - expect(continueTests).to.equal(true, 'Previous test failed. Aborting'); - }); - - it('Should test p2pkh->p2pkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2PKH, - recipientPurpose: helpers.BTC_PURPOSE_P2PKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) - - it('Should test p2pkh->p2sh-p2wpkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2PKH, - recipientPurpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) - - it('Should test p2pkh->p2wpkh', async () => { - try { - continueTests = false; - for (let i = 0; i < inputs.length; i++) { - expect(wallet).to.not.equal(null, 'Wallet not available'); - const inputsSlice = inputs.slice(0, i + 1); - const opts = { - spenderPurpose: helpers.BTC_PURPOSE_P2PKH, - recipientPurpose: helpers.BTC_PURPOSE_P2WPKH, - }; - await runTestSet(opts, wallet, inputsSlice); - continueTests = true; - } - } catch (err) { - expect(err.message).to.equal(null, err); - } - }) -}) diff --git a/test/testChaosMonkey.ts b/test/testChaosMonkey.ts deleted file mode 100644 index 3e3c5ffa..00000000 --- a/test/testChaosMonkey.ts +++ /dev/null @@ -1,181 +0,0 @@ -// Tests for Isolated & Fuzzy SDK testing NOTE: You must run the following BEFORE executing these -// tests: -// -// 1. Connect with the same deviceID you specfied in 1: -// -// env DEVICE_ID='' npm run test-chaos-money -// -// 2. You can optionally specify an `baseUrl`: -// -// env DEVICE_ID='' baseUrl='' npm run test-chaos-money -// -// NOTE: It is highly suggested that you set `AUTO_SIGN_DEV_ONLY=1` in the firmware root -// CMakeLists.txt file (for dev units) To run these tests you will need a dev Lattice with: -// `FEATURE_TEST_RUNNER=1` - -import { sha256 } from 'hash.js/lib/hash/sha'; -import { Client } from '../src/index'; -import { question } from 'readline-sync'; - -const REUSABLE_KEY = - '3fb53b677f73e4d2b8c89c303f6f6b349f0075ad88ea126cb9f6632085815dca'; - -//------------------------------------------------------------------------------ -// Connect & Pair - HELPER -//------------------------------------------------------------------------------ -const CONNECT_AND_PAIR_LATTICE = ( - env = process.env, - appName = 'Chaos Monkey [Test]', - baseUrl = env.baseUrl || 'https://signing.gridpl.us', - id = () => env.DEVICE_ID || question('~ Enter Device ID: '), - passwrd = () => - env.REUSE_KEY === '1' - ? REUSABLE_KEY - : question('~ Enter device password: ', { hideEchoBack: true }), - secret = () => question('~ Enter pairing code: '), -) => - new Promise((res, rej) => { - console.log('~ Base URL: ', baseUrl); - //-------------------------------------------------------------------------- - // Retrieve 'device ID' - //-------------------------------------------------------------------------- - const deviceId = id(); - - //-------------------------------------------------------------------------- - // Retrieve 'private key' - //-------------------------------------------------------------------------- - const privateKey = (() => { - const password = passwrd(); - const privKeyPreImage = Buffer.concat([ - Buffer.from(deviceId), - Buffer.from(password), - Buffer.from(appName), - ]); - return Buffer.from(sha256().update(privKeyPreImage).digest('hex'), 'hex'); - })(); - - //-------------------------------------------------------------------------- - // Create 'client' - //-------------------------------------------------------------------------- - const clientOpts = { - name: appName, - baseUrl: baseUrl, - timeout: 180000, - privKey: privateKey, - skipRetryOnWrongWallet: false, - }; - // @ts-expect-error - Wrong buffer type - const client = new Client(clientOpts); - - //-------------------------------------------------------------------------- - // Connect - //-------------------------------------------------------------------------- - client.connect(deviceId, (err: any, isPaired: any) => { - if (err) { - rej(err); - } else { - if (!isPaired) { - //-------------------------------------------------------------- - // Retrieve 'secret pairing code' - //-------------------------------------------------------------- - const pairingCode = secret().toUpperCase(); - - //-------------------------------------------------------------- - // Pair - //-------------------------------------------------------------- - client.pair(pairingCode, (err: any, isActive: any) => { - if (err || !isActive) { - rej(err || new Error('No active wallet found!')); - } else { - res({ client, deviceId }); - } - }); - } else { - res({ client, deviceId }); - } - } - }); - }); - -const CREATE_HDPATH = ( - // Unused params: hardened = true, account = 0, index = 0, - coinType = 60, -): number[] => { - const HARDENED_OFFSET = 0x80000000; - return `m/44'/${coinType}'/0'/0/0` - .split('/') - .filter((component) => component !== 'm') - .map((component) => { - return Number( - component.endsWith('\'') - ? Number(component.slice(0, component.length - 1)) + HARDENED_OFFSET - : component, - ); - }); -}; - -const SIGN_MESSAGE = (message: string): Promise => { - return new Promise((resolved, rejected) => { - CONNECT_AND_PAIR_LATTICE().then((context: any) => { - const data = { - protocol: 'signPersonal', - payload: message, - signerPath: CREATE_HDPATH(), - }; - const signOpts = { - currency: 'ETH_MSG', - data: data, - }; - - context.client.sign(signOpts, (err: any, signedTx: any) => { - if (err) rejected(err); - else resolved(signedTx); - }); - }); - }); -}; - -const GET_ADDRESSES = (): Promise => { - return new Promise((resolved, rejected) => { - CONNECT_AND_PAIR_LATTICE().then((context: any) => { - const req = { - startPath: CREATE_HDPATH(), - n: 2, - }; - console.log(JSON.stringify(req, null, 2)); - - context.client.getAddresses(req, (err: any, addresses: any) => { - if (err) rejected(err); - else resolved(addresses as string[]); - }); - }); - }); -}; - -describe('Chaos Monkey', () => { - it('Should 1', async () => { - const answer = question( - ` - ~ Run which test? (Timeout in 10 seconds) - ~ 1. Signature - ~ 2. Addresses - ~ 3. Quit - `, - ); - switch (answer) { - case '1': { - await SIGN_MESSAGE('This is a message') - .catch(console.error) - .then((res) => console.log(`${JSON.stringify(res, null, 2)}`)); - return; - } - case '2': { - await GET_ADDRESSES() - .catch(console.error) - .then((res) => console.log(JSON.stringify(res, null, 2))); - return; - } - default: - } - }); -}); diff --git a/test/testEthMsg.ts b/test/testEthMsg.ts deleted file mode 100644 index 257c75b8..00000000 --- a/test/testEthMsg.ts +++ /dev/null @@ -1,1209 +0,0 @@ -// Tests for ETH transaction edge cases -// NOTE: You must run the following BEFORE executing these tests: -// -// 1. Pair with the device once. This will ask you for your deviceID, which will -// act as a salt for your pairing: -// -// env REUSE_KEY=1 npm run test -// -// 2. Connect with the same deviceID you specfied in 1: -// -// env DEVICE_ID='' npm test -// -// After you do the above, you can run this test with `npm run test-eth` -// -// NOTE: It is highly suggested that you set `AUTO_SIGN_DEV_ONLY=1` in the firmware -// root CMakeLists.txt file (for dev units) -import { expect } from 'chai'; -import randomWords from 'random-words'; -import seedrandom from 'seedrandom'; -import { getFwVersionConst, HARDENED_OFFSET } from '../src/constants'; -import { randomBytes } from '../src/util'; -import helpers from './testUtil/helpers'; -const prng = new seedrandom(process.env.SEED || 'myrandomseed'); -let client = null; -let numRandom = 20; // Number of random tests to conduct -const MSG_PAYLOAD_METADATA_SZ = 28; // Metadata that must go in ETH_MSG requests -let continueTests = true; - -function randInt (n) { - return Math.floor(n * prng.quick()); -} - -function buildRandomMsg (type = 'signPersonal') { - if (type === 'signPersonal') { - // A random string will do - const isHexStr = randInt(2) > 0 ? true : false; - const fwConstants = getFwVersionConst(client.fwVersion); - const L = randInt(fwConstants.ethMaxDataSz - MSG_PAYLOAD_METADATA_SZ); - if (isHexStr) return `0x${randomBytes(L).toString('hex')}`; - // Get L hex bytes (represented with a string with 2*L chars) - else return randomWords({ exactly: L, join: ' ' }).slice(0, L); // Get L ASCII characters (bytes) - } else if (type === 'eip712') { - return helpers.buildRandomEip712Object(randInt); - } -} - -function buildMsgReq ( - payload, - protocol, - signerPath = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, - ], -) { - return { - currency: 'ETH_MSG', - data: { - signerPath, - payload, - protocol, - }, - }; -} - -async function testMsg (req, expectPass = true) { - continueTests = false; - try { - const sig = await client.sign(req); - // Validation happens already in the client - if (expectPass) { - expect(sig.sig).to.not.equal(null); - continueTests = true; - } - } catch (err) { - if (!expectPass) { - expect(err.message).to.not.equal(null, 'Expected failure but got pass'); - continueTests = true; - } - } -} - -// Determine the number of random transactions we should build -if (process.env.N) numRandom = parseInt(process.env.N); - -describe('Setup client', () => { - it('Should setup the test client', () => { - client = helpers.setupTestClient(process.env); - expect(client).to.not.equal(null); - }); - - it('Should connect to a Lattice and make sure it is already paired.', async () => { - try { - continueTests = false; - // Again, we assume that if an `id` has already been set, we are paired - // with the hardcoded privkey above. - expect(process.env.DEVICE_ID).to.not.equal(null); - const isPaired = await client.connect(process.env.DEVICE_ID); - expect(isPaired).to.equal(true); - expect(client.isPaired).to.equal(true); - expect(client.hasActiveWallet()).to.equal(true); - continueTests = true; - } catch (err) { - expect(err.message).to.equal(null, err); - } - }); -}); - -describe('Test ETH personalSign', function () { - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Error found in prior test. Aborting.', - ); - }); - - it('Should throw error when message contains non-ASCII characters', async () => { - const protocol = 'signPersonal'; - const msg = '⚠️'; - const msg2 = 'ASCII plus ⚠️'; - await testMsg(buildMsgReq(msg, protocol), false); - await testMsg(buildMsgReq(msg2, protocol), false); - }); - - it('Should test ASCII buffers', async () => { - await testMsg( - buildMsgReq(Buffer.from('i am an ascii buffer'), 'signPersonal'), - ); - await testMsg( - buildMsgReq(Buffer.from('{\n\ttest: foo\n}'), 'signPersonal'), - ); - }); - - it('Should test hex buffers', async () => { - await testMsg(buildMsgReq(Buffer.from('abcdef', 'hex'), 'signPersonal')); - }); - - it('Should test a message that needs to be prehashed', async () => { - await testMsg(buildMsgReq(randomBytes(4000), 'signPersonal')); - }); - - it('Msg: sign_personal boundary conditions and auto-rejected requests', async () => { - const protocol = 'signPersonal'; - const fwConstants = getFwVersionConst(client.fwVersion); - // `personal_sign` requests have a max size smaller than other requests because a header - // is displayed in the text region of the screen. The size of this is captured - // by `fwConstants.personalSignHeaderSz`. - const maxMsgSz = - fwConstants.ethMaxMsgSz + - fwConstants.personalSignHeaderSz + - fwConstants.extraDataMaxFrames * fwConstants.extraDataFrameSz; - const maxValid = `0x${randomBytes(maxMsgSz).toString('hex')}`; - const minInvalid = `0x${randomBytes(maxMsgSz + 1).toString('hex')}`; - const zeroInvalid = '0x'; - // The largest non-hardened index which will take the most chars to print - const x = HARDENED_OFFSET - 1; - // Okay sooo this is a bit awkward. We have to use a known coin_type here (e.g. ETH) - // or else firmware will return an error, but the maxSz is based on the max length - // of a path, which is larger than we can actually print. - // I guess all this tests is that the first one is shown in plaintext while the second - // one (which is too large) gets prehashed. - const largeSignPath = [x, HARDENED_OFFSET + 60, x, x, x]; - await testMsg(buildMsgReq(maxValid, protocol, largeSignPath)); - await testMsg(buildMsgReq(minInvalid, protocol, largeSignPath)); - // Using a zero length payload should auto-reject - await testMsg(buildMsgReq(zeroInvalid, protocol), false); - }); - - it(`Should test ${numRandom} random payloads`, async () => { - for (let i = 0; i < numRandom; i++) { - await testMsg( - buildMsgReq(buildRandomMsg('signPersonal'), 'signPersonal'), - ); - } - }); -}); - -describe('Test ETH EIP712', function () { - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Error found in prior test. Aborting.', - ); - }); - - it('Should test a message that needs to be prehashed', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - ], - dYdX: [ - { type: 'string', name: 'action' }, - { type: 'string', name: 'onlySignOn' }, - ], - }, - domain: { - name: 'dYdX', - version: '1.0', - chainId: '1', - }, - primaryType: 'dYdX', - message: { - action: 'dYdX STARK Key', - onlySignOn: randomBytes(4000).toString('hex'), - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test simple dydx example', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - ], - dYdX: [ - { type: 'string', name: 'action' }, - { type: 'string', name: 'onlySignOn' }, - ], - }, - domain: { - name: 'dYdX', - version: '1.0', - chainId: '1', - }, - primaryType: 'dYdX', - message: { - action: 'dYdX STARK Key', - onlySignOn: 'https://trade.dydx.exchange', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a Loopring message with non-standard numerical type', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - AccountUpdate: [ - { name: 'owner', type: 'address' }, - { name: 'accountID', type: 'uint32' }, - { name: 'feeTokenID', type: 'uint16' }, - { name: 'maxFee', type: 'uint96' }, - { name: 'publicKey', type: 'uint256' }, - { name: 'validUntil', type: 'uint32' }, - { name: 'nonce', type: 'uint32' }, - ], - }, - primaryType: 'AccountUpdate', - domain: { - name: 'Loopring Protocol', - version: '3.6.0', - chainId: 1, - verifyingContract: '0x0BABA1Ad5bE3a5C0a66E7ac838a129Bf948f1eA4', - }, - message: { - owner: '0x8c3b776bdac9a7a4facc3cc20cdb40832bff9005', - accountID: 32494, - feeTokenID: 0, - maxFee: 100, - publicKey: - '11413934541425201845815969801249874136651857829494005371571206042985258823663', - validUntil: 1631655383, - nonce: 0, - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a large 1inch transaction', async () => { - const msg = JSON.parse( - '{"primaryType":"Order","types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Order":[{"name":"salt","type":"uint256"},{"name":"makerAsset","type":"address"},{"name":"takerAsset","type":"address"},{"name":"makerAssetData","type":"bytes"},{"name":"takerAssetData","type":"bytes"},{"name":"getMakerAmount","type":"bytes"},{"name":"getTakerAmount","type":"bytes"},{"name":"predicate","type":"bytes"},{"name":"permit","type":"bytes"},{"name":"interaction","type":"bytes"}]},"domain":{"name":"1inch Limit Order Protocol","version":"1","chainId":137,"verifyingContract":"0xb707d89d29c189421163515c59e42147371d6857"},"message":{"salt":"885135864076","makerAsset":"0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270","takerAsset":"0x8f3cf7ad23cd3cadbd9735aff958023239c6a063","makerAssetData":"0x23b872dd0000000000000000000000003e3e2ccdd7bae6bbd4a64e8d16ca8842061335eb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a7640000","takerAssetData":"0x23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e3e2ccdd7bae6bbd4a64e8d16ca8842061335eb00000000000000000000000000000000000000000000000018fae27693b40000","getMakerAmount":"0xf4a215c30000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000018fae27693b40000","getTakerAmount":"0x296637bf0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000018fae27693b40000","predicate":"0x961d5b1e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b707d89d29c189421163515c59e42147371d6857000000000000000000000000b707d89d29c189421163515c59e42147371d68570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000044cf6fc6e30000000000000000000000003e3e2ccdd7bae6bbd4a64e8d16ca8842061335eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002463592c2b00000000000000000000000000000000000000000000000000000000613e28e500000000000000000000000000000000000000000000000000000000","permit":"0x","interaction":"0x"}}', - ); - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test an example with 0 values', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'host', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Test: [ - { name: 'owner', type: 'string' }, - { name: 'testArray', type: 'uint256[]' }, - ], - }, - domain: { - name: 'Opensea on Matic', - verifyingContract: '0x0', - version: '1', - chainId: '', - host: '', - }, - primaryType: 'Test', - message: { - owner: '0x56626bd0d646ce9da4a12403b2c1ba00fb9e1c43', - testArray: [], - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test canonical EIP712 example', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'address' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - }, - primaryType: 'Mail', - domain: { - name: 'Ether Mail', - version: '1', - chainId: 12, - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - message: { - from: { - name: 'Cow', - wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - }, - to: { - name: 'Bob', - wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - }, - contents: 'foobar', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test canonical EIP712 example with 2nd level nesting', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Wallet: [ - { name: 'address', type: 'address' }, - { name: 'balance', type: 'uint256' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'Wallet' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - }, - primaryType: 'Mail', - domain: { - name: 'Ether Mail', - version: '1', - chainId: 12, - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - message: { - from: { - name: 'Cow', - wallet: { - address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - balance: '0x12345678', - }, - }, - to: { - name: 'Bob', - wallet: { - address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - balance: '0xabcdef12', - }, - }, - contents: 'foobar', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test canonical EIP712 example with 3rd level nesting', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Wallet: [ - { name: 'address', type: 'address' }, - { name: 'balance', type: 'Balance' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'Wallet' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - Balance: [ - { name: 'value', type: 'uint256' }, - { name: 'currency', type: 'string' }, - ], - }, - primaryType: 'Mail', - domain: { - name: 'Ether Mail', - version: '1', - chainId: 12, - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - message: { - from: { - name: 'Cow', - wallet: { - address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - balance: { - value: '0x12345678', - currency: 'ETH', - }, - }, - }, - to: { - name: 'Bob', - wallet: { - address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - balance: { - value: '0xabcdef12', - currency: 'UNI', - }, - }, - }, - contents: 'foobar', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test canonical EIP712 example with 3rd level nesting and params in a different order', async () => { - const msg = { - types: { - Balance: [ - { name: 'value', type: 'uint256' }, - { name: 'currency', type: 'string' }, - ], - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'Wallet' }, - ], - Wallet: [ - { name: 'address', type: 'address' }, - { name: 'balance', type: 'Balance' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - }, - primaryType: 'Mail', - domain: { - name: 'Ether Mail', - version: '1', - chainId: 12, - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - message: { - contents: 'foobar', - from: { - name: 'Cow', - wallet: { - address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - balance: { - value: '0x12345678', - currency: 'ETH', - }, - }, - }, - to: { - name: 'Bob', - wallet: { - address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - balance: { - value: '0xabcdef12', - currency: 'UNI', - }, - }, - }, - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a payload with an array type', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - ], - UserVotePayload: [ - { - name: 'allocations', - type: 'UserVoteAllocationItem[]', - }, - ], - UserVoteAllocationItem: [ - { - name: 'reactorKey', - type: 'bytes32', - }, - { - name: 'amount', - type: 'uint256', - }, - ], - }, - primaryType: 'UserVotePayload', - domain: { - name: 'Tokemak Voting', - version: '1', - chainId: 1, - verifyingContract: '0x4495982ea5ed9c1b7cec37434cbf930b9472e823', - }, - message: { - allocations: [ - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - amount: '1', - }, - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - amount: '2', - }, - ], - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test multiple array types', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - ], - UserVotePayload: [ - { - name: 'integer', - type: 'uint256', - }, - { - name: 'allocations', - type: 'UserVoteAllocationItem[]', - }, - { - name: 'dummy', - type: 'uint256', - }, - { - name: 'integerArray', - type: 'uint256[]', - }, - ], - UserVoteAllocationItem: [ - { - name: 'reactorKey', - type: 'bytes32', - }, - { - name: 'amount', - type: 'uint256', - }, - ], - }, - primaryType: 'UserVotePayload', - domain: { - name: 'Tokemak Voting', - }, - message: { - integer: 56, - allocations: [ - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - amount: '1', - }, - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - amount: '2', - }, - ], - dummy: 52, - integerArray: [1, 2, 3], - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a nested array', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - ], - UserVotePayload: [ - { - name: 'allocations', - type: 'UserVoteAllocationItem[]', - }, - ], - UserVoteAllocationItem: [ - { - name: 'reactorKey', - type: 'bytes32', - }, - { - name: 'amount', - type: 'uint256[]', - }, - ], - }, - primaryType: 'UserVotePayload', - domain: { - name: 'Tokemak Voting', - }, - message: { - allocations: [ - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - amount: ['1', '2'], - }, - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - amount: ['2', '3'], - }, - ], - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a nested array of custom type', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - ], - DummyThing: [ - { - name: 'foo', - type: 'bytes', - }, - ], - UserVotePayload: [ - { - name: 'test', - type: 'string', - }, - { - name: 'athing', - type: 'uint32', - }, - { - name: 'allocations', - type: 'UserVoteAllocationItem[]', - }, - ], - UserVoteAllocationItem: [ - { - name: 'reactorKey', - type: 'bytes32', - }, - { - name: 'dummy', - type: 'DummyThing[]', - }, - ], - }, - primaryType: 'UserVotePayload', - domain: { - name: 'Tokemak Voting', - }, - message: { - athing: 5, - test: 'hello', - allocations: [ - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - dummy: [ - { - foo: '0xabcd', - }, - { - foo: '0x123456', - }, - ], - }, - { - reactorKey: - '0x6f686d2d64656661756c74000000000000000000000000000000000000000000', - dummy: [ - { - foo: '0xdeadbeef', - }, - { - foo: '0x', - }, - ], - }, - ], - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a bunch of EIP712 data types', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - { - name: 'version', - type: 'string', - }, - { - name: 'chainId', - type: 'uint256', - }, - { - name: 'verifyingContract', - type: 'address', - }, - ], - PrimaryStuff: [ - { name: 'UINT8', type: 'uint8' }, - { name: 'UINT16', type: 'uint16' }, - { name: 'UINT32', type: 'uint32' }, - { name: 'UINT64', type: 'uint64' }, - { name: 'UINT256', type: 'uint256' }, - { name: 'BYTES1', type: 'bytes1' }, - { name: 'BYTES5', type: 'bytes5' }, - { name: 'BYTES7', type: 'bytes7' }, - { name: 'BYTES12', type: 'bytes12' }, - { name: 'BYTES16', type: 'bytes16' }, - { name: 'BYTES20', type: 'bytes20' }, - { name: 'BYTES21', type: 'bytes21' }, - { name: 'BYTES31', type: 'bytes31' }, - { name: 'BYTES32', type: 'bytes32' }, - { name: 'BYTES', type: 'bytes' }, - { name: 'STRING', type: 'string' }, - { name: 'BOOL', type: 'bool' }, - { name: 'ADDRESS', type: 'address' }, - ], - }, - primaryType: 'PrimaryStuff', - domain: { - name: 'Muh Domainz', - version: '1', - chainId: 270, - verifyingContract: '0xcc9c93cef8c70a7b46e32b3635d1a746ee0ec5b4', - }, - message: { - UINT8: '0xab', - UINT16: '0xb1d7', - UINT32: '0x80bb335b', - UINT64: '0x259528d5bc', - UINT256: '0xad2693f24ba507750d1763ebae3661c07504', - BYTES1: '0x2f', - BYTES5: '0x9485269fa5', - BYTES7: '0xc4e8d65ce8c3cf', - BYTES12: '0x358eb7b28e8e1643e7c4737f', - BYTES16: '0x7ace034ab088fdd434f1e817f32171a0', - BYTES20: '0x4ab51f2d5bfdc0f1b96f83358d5f356c98583573', - BYTES21: '0x6ecdc19b30c7fa712ba334458d77377b6a586bbab5', - BYTES31: - '0x06c21824a98643f96643b3220962f441210b007f4c19dfdf0dea53d097fc28', - BYTES32: - '0x59cfcbf35256451756b02fa644d3d0748bd98f5904febf3433e6df19b4df7452', - BYTES: - '0x0354b2c449772905b2598a93f5da69962f0444e0a6e2429e8f844f1011446f6fe81815846fb6ebe2d213968d1f8532749735f5702f565db0429b2fe596d295d9c06241389fe97fb2f3b91e1e0f2d978fb26e366737451f1193097bd0a2332e0bfc0cdb631005', - STRING: 'I am a string hello there human', - BOOL: true, - ADDRESS: '0x078a8d6eba928e7ea787ed48f71c5936aed4625d', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a payload with a nested type in multiple nesting levels', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - ], - PrimaryType: [ - { - name: 'one', - type: 'Type1', - }, - { - name: 'zero', - type: 'Type0', - }, - ], - Type1: [ - { - name: '1s', - type: 'string', - }, - ], - Type0: [ - { - name: 'one', - type: 'Type1', - }, - ], - }, - primaryType: 'PrimaryType', - domain: { - name: 'Domain', - }, - message: { - one: { - '1s': 'nestedOne', - }, - zero: { - one: { - '1s': 'nestedTwo', - }, - }, - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a payload that requires use of extraData frames', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Wallet: [ - { name: 'address', type: 'address' }, - { name: 'balance', type: 'Balance' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'Wallet' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - Balance: [ - { name: 'value', type: 'uint256' }, - { name: 'currency', type: 'string' }, - ], - }, - primaryType: 'Mail', - domain: { - name: 'Ether Mail', - version: '1', - chainId: 12, - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - message: { - from: { - name: 'Cow', - wallet: { - address: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - balance: { - value: '0x12345678', - currency: 'ETH', - }, - }, - }, - to: { - name: 'Bob', - wallet: { - address: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - balance: { - value: '0xabcdef12', - currency: 'UNI', - }, - }, - }, - contents: - 'stupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimesstupidlylongstringthatshouldstretchintomultiplepageswhencopiedmanytimes', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test a message with very large types', async () => { - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - { - name: 'version', - type: 'string', - }, - { - name: 'chainId', - type: 'uint256', - }, - { - name: 'verifyingContract', - type: 'address', - }, - ], - Order: [ - { - name: 'exchange', - type: 'address', - }, - { - name: 'maker', - type: 'address', - }, - { - name: 'taker', - type: 'address', - }, - { - name: 'makerRelayerFee', - type: 'uint256', - }, - { - name: 'takerRelayerFee', - type: 'uint256', - }, - { - name: 'makerProtocolFee', - type: 'uint256', - }, - { - name: 'takerProtocolFee', - type: 'uint256', - }, - { - name: 'feeRecipient', - type: 'address', - }, - { - name: 'feeMethod', - type: 'uint8', - }, - { - name: 'side', - type: 'uint8', - }, - { - name: 'saleKind', - type: 'uint8', - }, - { - name: 'target', - type: 'address', - }, - { - name: 'howToCall', - type: 'uint8', - }, - { - name: 'calldata', - type: 'bytes', - }, - { - name: 'replacementPattern', - type: 'bytes', - }, - { - name: 'staticTarget', - type: 'address', - }, - { - name: 'staticExtradata', - type: 'bytes', - }, - { - name: 'paymentToken', - type: 'address', - }, - { - name: 'basePrice', - type: 'uint256', - }, - { - name: 'extra', - type: 'uint256', - }, - { - name: 'listingTime', - type: 'uint256', - }, - { - name: 'expirationTime', - type: 'uint256', - }, - { - name: 'salt', - type: 'uint256', - }, - { - name: 'nonce', - type: 'uint256', - }, - ], - }, - domain: { - name: 'Wyvern Exchange Contract', - version: '2.3', - chainId: 1, - verifyingContract: '0x7f268357a8c2552623316e2562d90e642bb538e5', - }, - primaryType: 'Order', - message: { - maker: '0x44fa5d521a02db7ce5a88842a6842496f84009bc', - exchange: '0x7f268357a8c2552623316e2562d90e642bb538e5', - taker: '0x0000000000000000000000000000000000000000', - makerRelayerFee: '750', - takerRelayerFee: '0', - makerProtocolFee: '0', - takerProtocolFee: '0', - feeRecipient: '0x5b3256965e7c3cf26e11fcaf296dfc8807c01073', - feeMethod: 1, - side: 1, - saleKind: 0, - target: '0xbaf2127b49fc93cbca6269fade0f7f31df4c88a7', - howToCall: 1, - calldata: - '0xfb16a59500000000000000000000000044fa5d521a02db7ce5a88842a6842496f84009bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a9f037d4cd7da318ab097a47acd4dea3abc083000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000', - replacementPattern: - '0x000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', - staticTarget: '0x0000000000000000000000000000000000000000', - staticExtradata: '0x', - paymentToken: '0x0000000000000000000000000000000000000000', - basePrice: '1000000000000000000', - extra: '0', - listingTime: '1645233344', - expirationTime: '1645838240', - salt: '35033335384310326785897317545538185126505283328747281434561962939625063440824', - nonce: 0, - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it('Should test random edge case #1', async () => { - // This was a randomly generated payload which caused an edge case. - // It has been slimmed down but definition structure is preserved. - const msg = { - types: { - EIP712Domain: [ - { - name: 'name', - type: 'string', - }, - { - name: 'version', - type: 'string', - }, - { - name: 'chainId', - type: 'uint256', - }, - { - name: 'verifyingContract', - type: 'address', - }, - ], - Primary_Click: [ - { - name: 'utility', - type: 'Expose', - }, - { - name: 'aisle', - type: 'Cancel', - }, - { - name: 'gym', - type: 'Razor', - }, - { - name: 'drift_patch_cable_bi', - type: 'bytes1', - }, - ], - Expose: [ - { - name: 'favorite', - type: 'bytes21', - }, - ], - Cancel: [ - { - name: 'clever', - type: 'uint200', - }, - ], - Razor: [ - { - name: 'private', - type: 'bytes2', - }, - ], - }, - primaryType: 'Primary_Click', - domain: { - name: 'Domain_Avocado_luggage_twel', - version: '1', - chainId: '0x324e', - verifyingContract: '0x69f758a7911448c2f7aa6df15ca27d69ffa1c6b7', - }, - message: { - utility: { - favorite: '0x891b56dc6ab87ab73cf69761183d499283f1925871', - }, - aisle: { - clever: '0x0102', - }, - gym: { - private: '0xbb42', - }, - drift_patch_cable_bi: '0xb4', - }, - }; - await testMsg(buildMsgReq(msg, 'eip712')); - }); - - it(`Should test ${numRandom} random payloads`, async () => { - for (let i = 0; i < numRandom; i++) { - await testMsg(buildMsgReq(buildRandomMsg('eip712'), 'eip712')); - } - }); -}); diff --git a/test/testNonExportable.ts b/test/testNonExportable.ts deleted file mode 100644 index cdb9c18c..00000000 --- a/test/testNonExportable.ts +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Legacy SafeCards had the ability to block export of the seed from the card. - * This was beneficial from a security standpoint, but limited the cryptography - * by what was available on the card. This option has been deprecated in newer - * versions of GridPlus firmware, but we still want to support cards that do - * not allow seed export, as we may bring that feature back in the future. - * - * In addition to the limitied cryptogrpahy, signature determinism is not possible - * in the SafeCard applet as it exists today. These tests simply confirm that - * signing the same message multiple times results in signatures that all appear - * different, but cryptographically validate on the secp256k1 curve. - * - * You must have `FEATURE_TEST_RUNNER=1` enabled in firmware to run these tests. - */ -import Common, { Chain, Hardfork } from '@ethereumjs/common'; -import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; -import { expect } from 'chai'; -import { question } from 'readline-sync'; -import { ecdsaRecover } from 'secp256k1'; -import { HARDENED_OFFSET } from '../src/constants'; -import { Constants } from '../src/index'; -import helpers from './testUtil/helpers'; - -//--------- -// Constants -//--------- -let client, - txReq, - continueTests = false; -const DEFAULT_SIGNER = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, -]; - -//--------- -// Tests -//--------- -describe('Connect', () => { - before(() => { - // Setup the SDK client - client = helpers.setupTestClient(process.env); - }); - - it('Should connect to a Lattice and make sure it is already paired.', async () => { - continueTests = false; - expect(process.env.DEVICE_ID).to.not.equal(null); - await client.connect(process.env.DEVICE_ID); - expect(client.isPaired).to.equal(true); - expect(client.hasActiveWallet()).to.equal(true); - continueTests = true; - }); - - it('Should ask if the user wants to test a card with a non-exportable seed', async () => { - // NOTE: non-exportable seeds were deprecated from the normal setup pathway in firmware v0.12.0 - const result = question( - 'Do you have a non-exportable SafeCard seed loaded and wish to continue? (Y/N) ', - ); - if (result.toLowerCase() !== 'y') { - console.log( - '\nTest must be run with a SafeCard loaded with a non-exportable seed.\n', - ); - process.exit(1); - } - }); -}); - -describe('Test non-exportable seed on SafeCard', () => { - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - }); - - it('Should test that ETH transaction sigs differ and validate on secp256k1', async () => { - // Test ETH transactions - const tx = EthTxFactory.fromTxData( - { - type: 2, - maxFeePerGas: 1200000000, - maxPriorityFeePerGas: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 100, - data: '0xdeadbeef', - }, - { - common: new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }), - }, - ); - txReq = { - data: { - signerPath: DEFAULT_SIGNER, - payload: tx.getMessageToSign(false), - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.KECCAK256, - encodingType: Constants.SIGNING.ENCODINGS.EVM, - }, - }; - // Validate that tx sigs are non-uniform - const tx1Resp = await client.sign(txReq); - validateSig(tx1Resp, tx.getMessageToSign(true)); - const tx2Resp = await client.sign(txReq); - validateSig(tx2Resp, tx.getMessageToSign(true)); - const tx3Resp = await client.sign(txReq); - validateSig(tx3Resp, tx.getMessageToSign(true)); - const tx4Resp = await client.sign(txReq); - validateSig(tx4Resp, tx.getMessageToSign(true)); - const tx5Resp = await client.sign(txReq); - validateSig(tx5Resp, tx.getMessageToSign(true)); - // Check sig 1 - expect(helpers.getSigStr(tx1Resp, tx)).to.not.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx1Resp, tx)).to.not.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx1Resp, tx)).to.not.equal( - helpers.getSigStr(tx4Resp, tx), - ); - expect(helpers.getSigStr(tx1Resp, tx)).to.not.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 2 - expect(helpers.getSigStr(tx2Resp, tx)).to.not.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx2Resp, tx)).to.not.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx2Resp, tx)).to.not.equal( - helpers.getSigStr(tx4Resp, tx), - ); - expect(helpers.getSigStr(tx2Resp, tx)).to.not.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 3 - expect(helpers.getSigStr(tx3Resp, tx)).to.not.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx3Resp, tx)).to.not.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx3Resp, tx)).to.not.equal( - helpers.getSigStr(tx4Resp, tx), - ); - expect(helpers.getSigStr(tx3Resp, tx)).to.not.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 4 - expect(helpers.getSigStr(tx4Resp, tx)).to.not.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx4Resp, tx)).to.not.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx4Resp, tx)).to.not.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx4Resp, tx)).to.not.equal( - helpers.getSigStr(tx5Resp, tx), - ); - // Check sig 5 - expect(helpers.getSigStr(tx5Resp, tx)).to.not.equal( - helpers.getSigStr(tx1Resp, tx), - ); - expect(helpers.getSigStr(tx5Resp, tx)).to.not.equal( - helpers.getSigStr(tx2Resp, tx), - ); - expect(helpers.getSigStr(tx5Resp, tx)).to.not.equal( - helpers.getSigStr(tx3Resp, tx), - ); - expect(helpers.getSigStr(tx5Resp, tx)).to.not.equal( - helpers.getSigStr(tx4Resp, tx), - ); - continueTests = true; - }); - - it('Should test that ETH message sigs differ and validate on secp256k1', async () => { - // Validate that signPersonal message sigs are non-uniform - const msgReq = { - currency: 'ETH_MSG', - data: { - signerPath: DEFAULT_SIGNER, - protocol: 'signPersonal', - payload: 'test message', - }, - }; - // NOTE: This uses the legacy signing pathway, which validates the signature - // Once we move this to generic signing, we will need to validate these. - const msg1Resp = await client.sign(msgReq); - const msg2Resp = await client.sign(msgReq); - const msg3Resp = await client.sign(msgReq); - const msg4Resp = await client.sign(msgReq); - const msg5Resp = await client.sign(msgReq); - // Check sig 1 - expect(helpers.getSigStr(msg1Resp)).to.not.equal( - helpers.getSigStr(msg2Resp), - ); - expect(helpers.getSigStr(msg1Resp)).to.not.equal( - helpers.getSigStr(msg3Resp), - ); - expect(helpers.getSigStr(msg1Resp)).to.not.equal( - helpers.getSigStr(msg4Resp), - ); - expect(helpers.getSigStr(msg1Resp)).to.not.equal( - helpers.getSigStr(msg5Resp), - ); - // Check sig 2 - expect(helpers.getSigStr(msg2Resp)).to.not.equal( - helpers.getSigStr(msg1Resp), - ); - expect(helpers.getSigStr(msg2Resp)).to.not.equal( - helpers.getSigStr(msg3Resp), - ); - expect(helpers.getSigStr(msg2Resp)).to.not.equal( - helpers.getSigStr(msg4Resp), - ); - expect(helpers.getSigStr(msg2Resp)).to.not.equal( - helpers.getSigStr(msg5Resp), - ); - // Check sig 3 - expect(helpers.getSigStr(msg3Resp)).to.not.equal( - helpers.getSigStr(msg1Resp), - ); - expect(helpers.getSigStr(msg3Resp)).to.not.equal( - helpers.getSigStr(msg2Resp), - ); - expect(helpers.getSigStr(msg3Resp)).to.not.equal( - helpers.getSigStr(msg4Resp), - ); - expect(helpers.getSigStr(msg3Resp)).to.not.equal( - helpers.getSigStr(msg5Resp), - ); - // Check sig 4 - expect(helpers.getSigStr(msg4Resp)).to.not.equal( - helpers.getSigStr(msg1Resp), - ); - expect(helpers.getSigStr(msg4Resp)).to.not.equal( - helpers.getSigStr(msg2Resp), - ); - expect(helpers.getSigStr(msg4Resp)).to.not.equal( - helpers.getSigStr(msg3Resp), - ); - expect(helpers.getSigStr(msg4Resp)).to.not.equal( - helpers.getSigStr(msg5Resp), - ); - // Check sig 5 - expect(helpers.getSigStr(msg5Resp)).to.not.equal( - helpers.getSigStr(msg1Resp), - ); - expect(helpers.getSigStr(msg5Resp)).to.not.equal( - helpers.getSigStr(msg2Resp), - ); - expect(helpers.getSigStr(msg5Resp)).to.not.equal( - helpers.getSigStr(msg3Resp), - ); - expect(helpers.getSigStr(msg5Resp)).to.not.equal( - helpers.getSigStr(msg4Resp), - ); - continueTests = true; - }); -}); - -function validateSig(resp, hash) { - const rs = new Uint8Array(Buffer.concat([resp.sig.r, resp.sig.s])); - const pubkeyA = Buffer.from(ecdsaRecover(rs, 0, hash, false)).toString('hex'); - const pubkeyB = Buffer.from(ecdsaRecover(rs, 1, hash, false)).toString('hex'); - if ( - resp.pubkey.toString('hex') !== pubkeyA && - resp.pubkey.toString('hex') !== pubkeyB - ) { - throw new Error('Signature did not validate.'); - } -} diff --git a/test/testWalletJobs.ts b/test/testWalletJobs.ts deleted file mode 100644 index cd5293ed..00000000 --- a/test/testWalletJobs.ts +++ /dev/null @@ -1,1161 +0,0 @@ -/** - * Tests against the wallet_jobs module in Lattice firmware. These tests use - * the `test` hook, which is not available in production firmware. Most of these - * tests are automatic, but a few signing requests are also included. - * - * The main purpose of these tests is to validation derivations for a known - * seed in Lattice firmware. - * - * To run these tests you will need a dev Lattice with: `FEATURE_TEST_RUNNER=1` - */ - -import Common, { Chain, Hardfork } from '@ethereumjs/common'; -import { TransactionFactory as EthTxFactory } from '@ethereumjs/tx'; -import bip32 from 'bip32'; -import { mnemonicToSeedSync } from 'bip39'; -import { expect } from 'chai'; -import { privateToAddress, privateToPublic } from 'ethereumjs-util'; -import { question } from 'readline-sync'; -import seedrandom from 'seedrandom'; -import { getFwVersionConst, HARDENED_OFFSET } from '../src/constants'; -import { Constants } from '../src/index'; -import { randomBytes } from '../src/util'; -import helpers from './testUtil/helpers'; - -//--------------------------------------- -// STATE DATA -//--------------------------------------- -let client, - currentWalletUID, - jobType, - jobData, - jobReq, - origWalletSeed = null, - continueTests = true; -// Define the default parent path. We use BTC as the default -const BTC_PARENT_PATH = { - pathDepth: 4, - purpose: helpers.BTC_PURPOSE_P2SH_P2WPKH, - coin: helpers.BTC_COIN, - account: helpers.BTC_COIN, - change: 0, - addr: 0, // Not used for pathDepth=4 -}; -// For testing leading zero sigs -let parentPathStr = 'm/44\'/60\'/0\'/0'; -let basePath = [ - helpers.BTC_PURPOSE_P2PKH, - helpers.ETH_COIN, - HARDENED_OFFSET, - 0, - 0, -]; -const mnemonic = - 'erosion loan violin drip laundry harsh social mercy leaf original habit buffalo'; -const KNOWN_SEED = mnemonicToSeedSync(mnemonic); -const wallet = bip32.fromSeed(KNOWN_SEED); -//--------------------------------------- -// TESTS -//--------------------------------------- -describe('Test Wallet Jobs', () => { - before(() => { - client = helpers.setupTestClient(process.env); - }); - - beforeEach(() => { - expect(continueTests).to.equal(true, 'Error in previous test. Aborting.'); - continueTests = false; - }); - - it('Should connect to a Lattice and make sure it is already paired.', async () => { - expect(process.env.DEVICE_ID).to.not.equal(null); - await client.connect(process.env.DEVICE_ID); - expect(client.isPaired).to.equal(true); - const EMPTY_WALLET_UID = Buffer.alloc(32); - const internalUID = client.activeWallets.internal.uid; - const externalUID = client.activeWallets.external.uid; - const checkOne = !EMPTY_WALLET_UID.equals(internalUID); - const checkTwo = !EMPTY_WALLET_UID.equals(externalUID); - const checkThree = !!client.hasActiveWallet(); - const checkFour = !!client.getActiveWallet().uid.equals(externalUID); - continueTests = checkOne && checkTwo && checkThree && checkFour; - expect(checkOne).to.equal(true, 'Internal A90 must be enabled.'); - expect(checkTwo).to.equal( - true, - 'P60 with exportable seed must be inserted.', - ); - expect(checkThree).to.equal(true, 'No active wallet discovered'); - expect(checkFour).to.equal( - true, - 'P60 should be active wallet but is not registered as it.', - ); - currentWalletUID = getCurrentWalletUID(); - const fwConstants = getFwVersionConst(client.fwVersion); - if (fwConstants) { - // If firmware supports bech32 segwit addresses, they are the default address - BTC_PARENT_PATH.purpose = fwConstants.allowBtcLegacyAndSegwitAddrs - ? helpers.BTC_PURPOSE_P2WPKH - : helpers.BTC_PURPOSE_P2SH_P2WPKH; - } - // Make sure firmware works with signing requests - if (client.fwVersion.major === 0 && client.fwVersion.minor < 15) { - throw new Error('Please update Lattice firmware.'); - } - continueTests = true; - }); -}); - -describe('exportSeed', () => { - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - jobType = helpers.jobTypes.WALLET_JOB_EXPORT_SEED; - jobData = {}; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - }); - - it('Should get GP_SUCCESS for a known, connected wallet', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeExportSeedJobResult(_res.result); - origWalletSeed = helpers.copyBuffer(res.seed); - continueTests = true; - }); - - it('Should get GP_ENODEV for unknown (random) wallet', async () => { - const dummyWalletUID = randomBytes(32); - jobReq.payload = helpers.serializeJobData(jobType, dummyWalletUID, jobData); - await runTestCase(helpers.gpErrors.GP_ENODEV); - continueTests = true; - }); -}); - -describe('getAddresses', () => { - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - expect(origWalletSeed).to.not.equal(null, 'Prior test failed. Aborting.'); - jobType = helpers.jobTypes.WALLET_JOB_GET_ADDRESSES; - jobData = { - parent: JSON.parse(JSON.stringify(BTC_PARENT_PATH)), - first: 0, - count: 1, - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - }); - - it('Should get GP_SUCCESS for active wallet', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); - - it('Should get GP_EWALLET for unknown (random) wallet', async () => { - const dummyWalletUID = randomBytes(32); - jobReq.payload = helpers.serializeJobData(jobType, dummyWalletUID, jobData); - await runTestCase(helpers.gpErrors.GP_EWALLET); - continueTests = true; - }); - - it('Should get GP_EINVAL if `count` exceeds the max request size', async () => { - jobData.count = 11; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EINVAL); - continueTests = true; - }); - - it('Should validate first ETH', async () => { - jobData.parent.purpose = helpers.BTC_PURPOSE_P2PKH; - jobData.parent.coin = helpers.ETH_COIN; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeGetAddressesJobResult(_res.result); - helpers.validateETHAddresses(res, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should validate an ETH address from a different EVM coin type', async () => { - jobData.parent.purpose = helpers.BTC_PURPOSE_P2PKH; - jobData.parent.coin = HARDENED_OFFSET + 1007; // Fantom coin_type via SLIP44 - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeGetAddressesJobResult(_res.result); - helpers.validateETHAddresses(res, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should validate the first BTC address', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeGetAddressesJobResult(_res.result); - helpers.validateBTCAddresses(res, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should validate first BTC change address', async () => { - jobData.parent.change = 1; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeGetAddressesJobResult(_res.result); - helpers.validateBTCAddresses(res, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should validate the first BTC address (testnet)', async () => { - jobData.parent.coin = helpers.BTC_TESTNET_COIN; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeGetAddressesJobResult(_res.result); - helpers.validateBTCAddresses(res, jobData, origWalletSeed, true); - continueTests = true; - }); - - it('Should validate first BTC change address (testnet)', async () => { - jobData.parent.change = 1; - jobData.parent.coin = helpers.BTC_TESTNET_COIN; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeGetAddressesJobResult(_res.result); - helpers.validateBTCAddresses(res, jobData, origWalletSeed, true); - continueTests = true; - }); - - it('Should fetch a set of BTC addresses', async () => { - const req = { - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_COIN, - helpers.BTC_COIN, - 0, - 28802208, - ], - n: 3, - }; - const addrs = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 4, - purpose: req.startPath[0], - coin: req.startPath[1], - account: req.startPath[2], - change: req.startPath[3], - }, - count: req.n, - first: req.startPath[4], - }; - helpers.validateBTCAddresses(resp, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should fetch a set of BTC addresses (bech32)', async () => { - const req = { - startPath: [ - helpers.BTC_PURPOSE_P2WPKH, - helpers.BTC_COIN, - helpers.BTC_COIN, - 0, - 28802208, - ], - n: 3, - }; - const addrs = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 4, - purpose: req.startPath[0], - coin: req.startPath[1], - account: req.startPath[2], - change: req.startPath[3], - }, - count: req.n, - first: req.startPath[4], - }; - helpers.validateBTCAddresses(resp, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should fetch a set of BTC addresses (legacy)', async () => { - const req = { - startPath: [ - helpers.BTC_PURPOSE_P2PKH, - helpers.BTC_COIN, - helpers.BTC_COIN, - 0, - 28802208, - ], - n: 3, - }; - const addrs = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 4, - purpose: req.startPath[0], - coin: req.startPath[1], - account: req.startPath[2], - change: req.startPath[3], - }, - count: req.n, - first: req.startPath[4], - }; - helpers.validateBTCAddresses(resp, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should fetch address with nonstandard path', async () => { - const req = { - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_COIN, - 2532356, - 5828, - 28802208, - ], - n: 3, - }; - const addrs: any = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 4, - purpose: req.startPath[0], - coin: req.startPath[1], - account: req.startPath[2], - change: req.startPath[3], - }, - count: req.n, - first: req.startPath[4], - }; - // Let the validator know this is a nonstandard purpose - helpers.validateBTCAddresses(resp, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should fail to fetch from path with an unknown currency type', async () => { - const req = { - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.BTC_COIN + 2, - 2532356, - 5828, - 28802208, - ], - n: 3, - }; - try { - await client.getAddresses(req); - } catch (err) { - continueTests = true; - } - }); - - it('Should validate address with pathDepth=4', async () => { - const req = { - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - helpers.ETH_COIN, - 2532356, - 7, - ], - n: 3, - }; - const addrs: any = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 3, - purpose: req.startPath[0], - coin: req.startPath[1], - account: req.startPath[2], - }, - count: req.n, - first: req.startPath[3], - }; - helpers.validateETHAddresses(resp, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should validate address with pathDepth=3', async () => { - const req = { - startPath: [helpers.BTC_PURPOSE_P2SH_P2WPKH, helpers.ETH_COIN, 2532356], - n: 3, - }; - const addrs: any = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 2, - purpose: req.startPath[0], - coin: req.startPath[1], - }, - count: req.n, - first: req.startPath[2], - }; - helpers.validateETHAddresses(resp, jobData, origWalletSeed); - continueTests = true; - }); - - it('Should validate random Bitcoin addresses of all types', async () => { - const prng = new seedrandom('btctestseed'); - async function testRandomBtcAddrs(purpose) { - const account = Math.floor((HARDENED_OFFSET + 100000) * prng.quick()); - const addr = Math.floor((HARDENED_OFFSET + 100000) * prng.quick()); - const req = { - startPath: [purpose, helpers.BTC_COIN, account, 0, addr], - n: 1, - }; - const addrs: any = await client.getAddresses(req); - const resp = { - count: addrs.length, - addresses: addrs, - }; - const jobData = { - parent: { - pathDepth: 4, - purpose: req.startPath[0], - coin: req.startPath[1], - account: req.startPath[2], - change: req.startPath[3], - }, - count: req.n, - first: req.startPath[4], - }; - helpers.validateBTCAddresses(resp, jobData, origWalletSeed); - } - - // Wrapped Segwit (x3) - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2WPKH); - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2WPKH); - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2WPKH); - // Legacy (x3) - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2PKH); - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2PKH); - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2PKH); - // Segwit (x3) - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2WPKH); - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2WPKH); - await testRandomBtcAddrs(helpers.BTC_PURPOSE_P2WPKH); - continueTests = true; - }); - - it('Should test export of SECP256K1 public keys', async () => { - const req = { - // Test with random coin_type to ensure we can export pubkeys for - // any derivation path - startPath: [ - helpers.BTC_PURPOSE_P2SH_P2WPKH, - 19497, - HARDENED_OFFSET, - 0, - 0, - ], - n: 3, - flag: Constants.GET_ADDR_FLAGS.SECP256K1_PUB, - }; - // Should fail to export keys from a path with unhardened indices - const pubkeys = await client.getAddresses(req); - helpers.validateDerivedPublicKeys( - pubkeys, - req.startPath, - origWalletSeed, - req.flag, - ); - continueTests = true; - }); - - it('Should test export of ED25519 public keys', async () => { - const req = { - startPath: [helpers.BTC_PURPOSE_P2SH_P2WPKH, helpers.ETH_COIN, 0], - n: 3, - flag: Constants.GET_ADDR_FLAGS.ED25519_PUB, - }; - try { - // Should fail to export keys from a path with unhardened indices - await client.getAddresses(req); - } catch (err) { - // Convert to all hardened indices and expect success - req.startPath[2] = HARDENED_OFFSET; - const pubkeys = await client.getAddresses(req); - helpers.validateDerivedPublicKeys( - pubkeys, - req.startPath, - origWalletSeed, - req.flag, - ); - continueTests = true; - } - }); -}); - -describe('signTx', () => { - beforeEach(() => { - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - expect(origWalletSeed).to.not.equal(null, 'Prior test failed. Aborting.'); - jobType = helpers.jobTypes.WALLET_JOB_SIGN_TX; - const path = JSON.parse(JSON.stringify(BTC_PARENT_PATH)); - path.pathDepth = 5; - jobData = { - numRequests: 1, - sigReq: [ - { - data: randomBytes(32), - signerPath: path, - }, - ], - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - }); - - it('Should get GP_SUCCESS for active wallet', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeSignTxJobResult(_res.result); - // Ensure correct number of outputs returned - expect(res.numOutputs).to.equal(jobData.numRequests); - // Ensure signatures validate against provided pubkey - const outputKey = res.outputs[0].pubkey; - const outputPubStr = outputKey.getPublic().encode('hex'); - expect( - outputKey.verify(jobData.sigReq[0].data, res.outputs[0].sig), - ).to.equal(true); - // Ensure pubkey is correctly derived - const wallet = bip32.fromSeed(origWalletSeed); - const derivedKey = wallet.derivePath( - helpers.stringifyPath(jobData.sigReq[0].signerPath), - ); - const derivedPubStr = `04${privateToPublic(derivedKey.privateKey).toString( - 'hex', - )}`; - expect(outputPubStr).to.equal(derivedPubStr); - continueTests = true; - }); - - it('Should get GP_SUCCESS for signing out of shorter (but allowed) paths', async () => { - jobData.sigReq[0].signerPath = { - pathDepth: 3, - purpose: helpers.BTC_PURPOSE_P2PKH, - coin: helpers.ETH_COIN, - account: 1572, - change: 0, // Not used for pathDepth=3 - addr: 0, // Not used for pathDepth=4 - }; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeSignTxJobResult(_res.result); - // Ensure correct number of outputs returned - expect(res.numOutputs).to.equal(jobData.numRequests); - // Ensure signatures validate against provided pubkey - const outputKey = res.outputs[0].pubkey; - const outputPubStr = outputKey.getPublic().encode('hex'); - expect( - outputKey.verify(jobData.sigReq[0].data, res.outputs[0].sig), - ).to.equal(true); - // Ensure pubkey is correctly derived - const wallet = bip32.fromSeed(origWalletSeed); - const derivedKey = wallet.derivePath( - helpers.stringifyPath(jobData.sigReq[0].signerPath), - ); - const derivedPubStr = `04${privateToPublic(derivedKey.privateKey).toString( - 'hex', - )}`; - expect(outputPubStr).to.equal(derivedPubStr); - continueTests = true; - }); - - it('Should get GP_EWALLET for unknown (random) wallet', async () => { - const dummyWalletUID = randomBytes(32); - jobReq.payload = helpers.serializeJobData(jobType, dummyWalletUID, jobData); - await runTestCase(helpers.gpErrors.GP_EWALLET); - continueTests = true; - }); - - it('Should get GP_EWALLET for known wallet that is inactive', async () => { - const EMPTY_WALLET_UID = Buffer.alloc(32); - const wallets = client.activeWallets; - - // This test requires a wallet on each interface, which means the active wallet needs - // to be external and the internal wallet needs to exist. - const ERR_MSG = - 'ERROR: This test requires an enabled Lattice wallet and active SafeCard wallet!'; - expect(helpers.copyBuffer(wallets.external.uid).toString('hex')).to.equal( - currentWalletUID.toString('hex'), - ERR_MSG, - ); - expect( - helpers.copyBuffer(wallets.internal.uid).toString('hex'), - ).to.not.equal(EMPTY_WALLET_UID.toString('hex'), ERR_MSG); - const incurrentWalletUID = helpers.copyBuffer(wallets.internal.uid); - jobReq.payload = helpers.serializeJobData( - jobType, - incurrentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EWALLET); - continueTests = true; - }); - - it('Should get GP_EINVAL when `numRequests` is 0', async () => { - jobData.numRequests = 0; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EINVAL); - continueTests = true; - }); - - it('Should get GP_EINVAL when `numRequests` exceeds the max allowed', async () => { - jobData.numRequests = 11; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EINVAL); - continueTests = true; - }); - - it('Should return GP_EINVAL when a signer `pathDepth` is of invalid size', async () => { - jobData.sigReq[0].signerPath.pathDepth = 1; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EINVAL); - jobData.sigReq[0].signerPath.pathDepth = 6; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EINVAL); - jobData.sigReq[0].signerPath.pathDepth = 5; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); - - it('Should get GP_SUCCESS when signing from a non-ETH EVM path', async () => { - jobData.sigReq[0].signerPath.coin = HARDENED_OFFSET + 1007; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); -}); - -describe('Get delete permission', () => { - beforeEach(() => { - expect(continueTests).to.equal(true, 'Error in previous test. Aborting.'); - }); - - it('Should get permission to remove seed.', () => { - question( - '\nThe following tests will remove your seed.\n' + - 'It should be added back in a later test, but these tests could fail!\n' + - 'Press enter to continue.', - ); - }); -}); - -describe('Test leading zeros', () => { - beforeEach(() => { - expect(origWalletSeed).to.not.equal(null, 'Prior test failed. Aborting.'); - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - }); - - it('Should remove the current seed', async () => { - jobType = helpers.jobTypes.WALLET_JOB_DELETE_SEED; - jobData = { - iface: 1, - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); - - it('Should load the new seed', async () => { - jobType = helpers.jobTypes.WALLET_JOB_LOAD_SEED; - jobData = { - iface: 1, // external SafeCard interface - seed: KNOWN_SEED, - exportability: 2, // always exportable - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); - - it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { - question( - '\nPlease remove your SafeCard, then re-insert and unlock it.\n' + - 'Press enter to continue.', - ); - continueTests = true; - }); - - it('Should reconnect to update the wallet UIDs', async () => { - await client.connect(process.env.DEVICE_ID); - currentWalletUID = getCurrentWalletUID(); - continueTests = true; - }); - - it('Should make sure the first address is correct', async () => { - const ref = `0x${privateToAddress( - wallet.derivePath(`${parentPathStr}/0`).privateKey, - ) - .toString('hex') - .toLowerCase()}`; - const addrs = await client.getAddresses({ startPath: basePath, n: 1 }); - if (addrs[0].toLowerCase() !== ref) { - continueTests = false; - expect(addrs[0].toLowerCase()).to.equal( - ref, - 'Failed to derive correct address for known seed', - ); - } - continueTests = true; - }); - - // One leading privKey zero -> P(1/256) - it('Should test address m/44\'/60\'/0\'/0/396 (1 leading zero byte)', async () => { - await runZerosTest(396, 1); - continueTests = true; - }); - it('Should test address m/44\'/60\'/0\'/0/406 (1 leading zero byte)', async () => { - await runZerosTest(406, 1); - continueTests = true; - }); - it('Should test address m/44\'/60\'/0\'/0/668 (1 leading zero byte)', async () => { - await runZerosTest(668, 1); - continueTests = true; - }); - - // Two leading privKey zeros -> P(1/65536) - it('Should test address m/44\'/60\'/0\'/0/71068 (2 leading zero bytes)', async () => { - await runZerosTest(71068, 2); - continueTests = true; - }); - it('Should test address m/44\'/60\'/0\'/0/82173 (2 leading zero bytes)', async () => { - await runZerosTest(82173, 2); - continueTests = true; - }); - - // Three leading privKey zeros -> P(1/16777216) - // Unlikely any user ever runs into these but I wanted to derive the addrs for funsies - it('Should test address m/44\'/60\'/0\'/0/11981831 (3 leading zero bytes)', async () => { - await runZerosTest(11981831, 3); - continueTests = true; - }); - - // Pubkeys are also used in the signature process, so we need to test paths with - // leading zeros in the X component of the pubkey (compressed pubkeys are used) - // We will test with a modification to the base path, which will produce a pubkey - // with a leading zero byte. - // We want this leading-zero pubkey to be a parent derivation path to then - // test all further derivations - it('Should switch to testing public keys', async () => { - parentPathStr = 'm/44\'/60\'/0\''; - basePath[3] = 153; - basePath = basePath.slice(0, 4); - continueTests = true; - }); - - // There should be no problems with the parent path here because the result - // is the leading-zero pubkey directly. Since we do not do a further derivation - // with that leading-zero pubkey, there should never be any issues. - it('Should test address m/44\'/60\'/0\'/153', async () => { - await runZerosTest(153, 1, true); - continueTests = true; - }); - - it('Should prepare for one more derivation step', async () => { - parentPathStr = 'm/44\'/60\'/0\'/153'; - basePath.push(0); - continueTests = true; - }); - - // Now we will derive one more step with the leading zero pubkey feeding - // into the derivation. This tests an edge case in firmware. - it('Should test address m/44\'/60\'/0\'/153/0', async () => { - await runZerosTest(0, 0); - continueTests = true; - }); - - it('Should test address m/44\'/60\'/0\'/153/1', async () => { - await runZerosTest(1, 0); - continueTests = true; - }); - - it('Should test address m/44\'/60\'/0\'/153/5', async () => { - await runZerosTest(5, 0); - continueTests = true; - }); - - it('Should test address m/44\'/60\'/0\'/153/10000', async () => { - await runZerosTest(10000, 0); - continueTests = true; - }); - - it('Should test address m/44\'/60\'/0\'/153/9876543', async () => { - await runZerosTest(9876543, 0); - continueTests = true; - }); -}); - -describe('deleteSeed', () => { - beforeEach(() => { - expect(origWalletSeed).to.not.equal(null, 'Prior test failed. Aborting.'); - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - jobType = helpers.jobTypes.WALLET_JOB_DELETE_SEED; - jobData = { - iface: 1, - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - }); - - it('Should get GP_EINVAL for unknown (random) wallet', async () => { - const dummyWalletUID = randomBytes(32); - jobReq.payload = helpers.serializeJobData(jobType, dummyWalletUID, jobData); - await runTestCase(helpers.gpErrors.GP_EINVAL); - continueTests = true; - }); - - it('Should get GP_SUCCESS for a known, connected wallet.', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); -}); - -describe('Load Original Seed Back', () => { - beforeEach(() => { - expect(origWalletSeed).to.not.equal(null, 'Prior test failed. Aborting.'); - expect(continueTests).to.equal( - true, - 'Unauthorized or critical failure. Aborting', - ); - continueTests = false; - jobType = helpers.jobTypes.WALLET_JOB_LOAD_SEED; - jobData = { - iface: 1, // external SafeCard interface - seed: origWalletSeed, - exportability: 2, // always exportable - }; - jobReq = { - testID: 0, // wallet_job test ID - payload: null, - }; - }); - - it('Should get GP_EINVAL if `exportability` option is invalid', async () => { - jobData.exportability = 3; // past range - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EINVAL); - continueTests = true; - }); - - it('Should get GP_SUCCESS when valid seed is provided to valid interface', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_SUCCESS); - continueTests = true; - }); - - it('Should wait for the user to remove and re-insert the card (triggering SafeCard wallet sync)', () => { - question( - '\n\nPlease remove your SafeCard, then re-insert and unlock it.\n' + - 'Press enter to continue.', - ); - continueTests = true; - }); - - it('Should reconnect to update the wallet UIDs', async () => { - await client.connect(process.env.DEVICE_ID); - currentWalletUID = getCurrentWalletUID(); - continueTests = true; - }); - - it('Should ensure export seed matches the seed we just loaded', async () => { - // Export the seed and make sure it matches! - jobType = helpers.jobTypes.WALLET_JOB_EXPORT_SEED; - jobData = {}; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeExportSeedJobResult(_res.result); - const exportedSeed = helpers.copyBuffer(res.seed); - expect(exportedSeed.toString('hex')).to.equal( - origWalletSeed.toString('hex'), - ); - continueTests = true; - }); - - // Test both safecard and a90 - it('Should get GP_FAILURE if interface already has a seed', async () => { - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_FAILURE); - continueTests = true; - }); - - // Wait for user to remove safecard - it('Should get GP_EAGAIN when trying to load seed into SafeCard when none exists', async () => { - question( - 'Please remove your SafeCard to run this test.\n' + - 'Press enter to continue.', - ); - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - await runTestCase(helpers.gpErrors.GP_EAGAIN); - continueTests = true; - }); - - it('Should wait for the card to be re-inserted', async () => { - question( - '\nPlease re-insert and unlock your SafeCard to continue.\n' + - 'Press enter to continue.', - ); - jobType = helpers.jobTypes.WALLET_JOB_EXPORT_SEED; - jobData = {}; - jobReq.payload = helpers.serializeJobData( - jobType, - currentWalletUID, - jobData, - ); - const _res = await runTestCase(helpers.gpErrors.GP_SUCCESS); - const res = helpers.deserializeExportSeedJobResult(_res.result); - const currentSeed = helpers.copyBuffer(res.seed); - expect(currentSeed.toString('hex')).to.equal( - origWalletSeed.toString('hex'), - ); - continueTests = true; - }); -}); - -//--------------------------------------- -// HELPERS -//--------------------------------------- -async function runTestCase(expectedCode) { - continueTests = false; - const res = await client.test(jobReq); - const parsedRes = helpers.parseWalletJobResp(res, client.fwVersion); - continueTests = parsedRes.resultStatus === expectedCode; - expect(parsedRes.resultStatus).to.equal( - expectedCode, - helpers.getCodeMsg(parsedRes.resultStatus, expectedCode), - ); - continueTests = true; - return parsedRes; -} - -function getCurrentWalletUID() { - return helpers.copyBuffer(client.getActiveWallet().uid); -} - -async function runZerosTest(idx, numZeros, testPub = false) { - const w = wallet.derivePath(`${parentPathStr}/${idx}`); - const refPriv = w.privateKey; - const refPub = privateToPublic(refPriv); - for (let i = 0; i < numZeros; i++) { - if (testPub) { - expect(refPub[i]).to.equal( - 0, - `Should be ${numZeros} leading pubKey zeros but got ${i}.`, - ); - } else { - expect(refPriv[i]).to.equal( - 0, - `Should be ${numZeros} leading privKey zeros but got ${i}.`, - ); - } - } - // Validate the exported address - const path = basePath; - path[path.length - 1] = idx; - const ref = `0x${privateToAddress(refPriv).toString('hex').toLowerCase()}`; - const addrs = await client.getAddresses({ startPath: path, n: 1 }); - if (addrs[0].toLowerCase() !== ref) { - continueTests = false; - expect(addrs[0].toLowerCase()).to.equal( - ref, - 'Failed to derive correct address for known seed', - ); - } - // Validate the signer coming back from the sign request - const tx = EthTxFactory.fromTxData( - { - type: 1, - gasPrice: 1200000000, - nonce: 0, - gasLimit: 50000, - to: '0xe242e54155b1abc71fc118065270cecaaf8b7768', - value: 1000000000000, - data: '0x17e914679b7e160613be4f8c2d3203d236286d74eb9192f6d6f71b9118a42bb033ccd8e8', - }, - { - common: new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.London, - }), - }, - ); - const txReq = { - data: { - signerPath: path, - curveType: Constants.SIGNING.CURVES.SECP256K1, - hashType: Constants.SIGNING.HASHES.KECCAK256, - encodingType: Constants.SIGNING.ENCODINGS.EVM, - payload: tx.getMessageToSign(false), - }, - }; - const resp = await client.sign(txReq); - // Make sure the exported signer matches expected - expect(resp.pubkey.slice(1).toString('hex')).to.equal( - refPub.toString('hex'), - 'Incorrect signer', - ); - // Make sure we can recover the same signer from the sig. - // `getV` will only return non-null if it can successfully - // ecrecover a pubkey that matches the one provided. - expect(helpers.getV(tx, resp)).to.not.equal(null, 'Incorrect signer'); -} diff --git a/tsconfig.json b/tsconfig.json index b390825a..a6994e7d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,18 +4,18 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, - "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist" /* Redirect output structure to the directory. */, - "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + "outDir": "./dist" /* Redirect output structure to the directory. */, + "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ @@ -25,8 +25,8 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": false /* Enable all strict type-checking options. */, - "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */, + "strict": false /* Enable all strict type-checking options. */, + "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */, // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ @@ -50,7 +50,7 @@ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ @@ -63,10 +63,13 @@ /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - + "resolveJsonModule": true, /* Advanced Options */ - "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "types": ["node", "jest", "vitest", "vitest/globals"], + "typeRoots": ["node_modules/@types", "src/**/types"] }, - "include": ["./src"] + "include": ["./src", ], + "exclude": ["node_modules", "**/__test__","**/*.spec.ts", "**/*.test.ts"], } diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..b0a455f3 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,31 @@ +// vite.config.ts +import * as path from 'path'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + build: { + lib: { + entry: path.resolve(__dirname, 'src/index.ts'), + name: 'gridplus-sdk', + fileName: (format) => `gridplus-sdk.${format}.js`, + }, + rollupOptions: { + external: [], + output: { + globals: {}, + }, + }, + }, + test: { + coverage: { + reporter: ['lcov'], + }, + update: false, + reporters: ['default'], + globals: true, + testTimeout: 120000, + threads: false, + setupFiles: ['./src/__test__/utils/setup.ts'], + watchExclude: ['**/*.json'], + }, +});