diff --git a/.env b/.env index 0e6fec4dd..a801d5ef9 100644 --- a/.env +++ b/.env @@ -5,3 +5,6 @@ REACT_APP_LOG_LEVEL=error REACT_APP_NETWORK=ganache REACT_APP_REQUIRED_NETWORK_ID=8545 REACT_APP_REQUIRED_NETWORK_NAME="Localhost 8545" +REACT_APP_TRACKING_URL=https://plausible.io/js/plausible.js +REACT_APP_TRACKING_DATADOMAIN=marketplace.rifos.org +REACT_APP_ALLOW_INSECURE_CONNECTIONS=0 diff --git a/.eslintrc b/.eslintrc index 5375f0039..bddd9020a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -33,7 +33,9 @@ "no-only-tests" ], "rules": { + "no-restricted-syntax": "off", "react/prop-types": "off", + "react/require-default-props": "off", "no-unused-vars": [ "error", { @@ -179,10 +181,14 @@ "overrides": [ { "files": [ - "*.spec.ts" + "*.spec.ts", + "*.spec.tsx", + "*.test.ts", + "*.test.tsx" ], "rules": { "@typescript-eslint/ban-ts-ignore": "off", + "no-underscore-dangle": "off", "max-nested-callbacks": [ "error", 10 diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml new file mode 100644 index 000000000..c69164fd8 --- /dev/null +++ b/.github/workflows/develop.yml @@ -0,0 +1,51 @@ +name: RIF Marketplace UI deploy + +on: + push: + branches: + - develop + +jobs: + deploy-develop: + name: RIF Marketplace UI - Develop + runs-on: ubuntu-latest + environment: develop + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Node 14 + uses: actions/setup-node@v1 + with: + node-version: '14' + + - name: Install dependencies + run: | + npm ci + + - name: Build site + env: + REACT_APP_CACHE_ADDR: ${{ secrets.DEVELOP_REACT_APP_CACHE_ADDR }} + REACT_APP_UPLOAD_ADDR: ${{ secrets.DEVELOP_REACT_APP_UPLOAD_ADDR }} + REACT_APP_LOG_LEVEL: error + REACT_APP_NETWORK: rskdevnet + REACT_APP_REQUIRED_NETWORK_ID: 33 + REACT_APP_REQUIRED_NETWORK_NAME: RSK Regtest + run: | + npm run build:prod + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.DEVELOP_AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.DEVELOP_AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.DEVELOP_AWS_REGION }} + + - name: Deploy site to S3 + run: | + aws s3 sync --delete --only-show-errors build/ ${{ secrets.DEVELOP_S3_BUCKET }} + + - name: Invalidate CloudFront cache + run: | + aws cloudfront create-invalidation --distribution-id ${{ secrets.DEVELOP_CLOUDFRONT_DISTRIBUTION }} --paths "/*" diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 50e7ed170..0f25c35c2 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -29,7 +29,6 @@ jobs: ${{ runner.os }}-node- - name: Install dependencies - if: steps.cache.outputs.cache-hit != 'true' run: | npm ci diff --git a/.github/workflows/testnet.yml b/.github/workflows/testnet.yml index f4d5a56ef..0206a6a8e 100644 --- a/.github/workflows/testnet.yml +++ b/.github/workflows/testnet.yml @@ -31,7 +31,6 @@ jobs: ${{ runner.os }}-node- - name: Install dependencies - if: steps.cache.outputs.cache-hit != 'true' run: | npm ci diff --git a/.gitignore b/.gitignore index 70ad89a57..c0b464a8e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* .vscode/ +tsconfig.json diff --git a/package-lock.json b/package-lock.json index 7a29224c3..e0ea1f86c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "rif-marketplace-ui", - "version": "1.3.5", + "version": "1.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==" + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" }, "@babel/core": { "version": "7.9.0", @@ -41,40 +41,40 @@ } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.14.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-compilation-targets": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", - "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", "semver": "^6.3.0" }, "dependencies": { @@ -86,30 +86,31 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -129,202 +130,213 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" } }, "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" } }, "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.14.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz", - "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==" + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "dependencies": { + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "requires": { + "@babel/types": "^7.14.5" + } + } } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", - "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { @@ -338,106 +350,127 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.14.5" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", - "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "dependencies": { + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "requires": { + "@babel/types": "^7.14.5" + } + } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { @@ -456,12 +489,20 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", + "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -481,11 +522,11 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", + "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-json-strings": { @@ -497,11 +538,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -552,110 +593,118 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "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==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-flow-strip-types": { @@ -668,196 +717,187 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", - "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", + "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz", - "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", + "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.13.12" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" + "@babel/plugin-transform-react-jsx": "^7.14.5" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz", + "integrity": "sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-runtime": { @@ -872,98 +912,111 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "dependencies": { + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "requires": { + "@babel/types": "^7.14.5" + } + } } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", + "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.14.6", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/preset-env": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", - "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", - "requires": { - "@babel/compat-data": "^7.13.12", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.13.8", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@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-json-strings": "^7.8.3", @@ -973,45 +1026,46 @@ "@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-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@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.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.12", - "babel-plugin-polyfill-corejs2": "^0.1.4", - "babel-plugin-polyfill-corejs3": "^0.1.3", - "babel-plugin-polyfill-regenerator": "^0.1.2", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", "semver": "^6.3.0" }, "dependencies": { @@ -1035,16 +1089,27 @@ } }, "@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "dependencies": { + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + } } }, "@babel/preset-typescript": { @@ -1057,54 +1122,54 @@ } }, "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", - "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", + "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", "requires": { - "core-js-pure": "^3.0.0", + "core-js-pure": "^3.15.0", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/traverse": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz", - "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.13", - "@babel/types": "^7.13.13", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", - "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" } }, @@ -1132,6 +1197,80 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, + "@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" + }, + "dependencies": { + "@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": "*" + } + }, + "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==" + }, + "ethereumjs-util": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz", + "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, + "@ethereumjs/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" + }, + "dependencies": { + "@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": "*" + } + }, + "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==" + }, + "ethereumjs-util": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz", + "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + } + } + } + }, "@ethersproject/abi": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", @@ -1149,98 +1288,98 @@ } }, "@ethersproject/abstract-provider": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.1.0.tgz", - "integrity": "sha512-8dJUnT8VNvPwWhYIau4dwp7qe1g+KgdRm4XTWvjkI9gAT2zZa90WF5ApdZ3vl1r6NDmnn6vUVvyphClRZRteTQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz", + "integrity": "sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA==", "requires": { - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/networks": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/transactions": "^5.1.0", - "@ethersproject/web": "^5.1.0" + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/networks": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/transactions": "^5.4.0", + "@ethersproject/web": "^5.4.0" } }, "@ethersproject/abstract-signer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.1.0.tgz", - "integrity": "sha512-qQDMkjGZSSJSKl6AnfTgmz9FSnzq3iEoEbHTYwjDlEAv+LNP7zd4ixCcVWlWyk+2siud856M5CRhAmPdupeN9w==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz", + "integrity": "sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew==", "requires": { - "@ethersproject/abstract-provider": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0" + "@ethersproject/abstract-provider": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0" } }, "@ethersproject/address": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.1.0.tgz", - "integrity": "sha512-rfWQR12eHn2cpstCFS4RF7oGjfbkZb0oqep+BfrT+gWEGWG2IowJvIsacPOvzyS1jhNF4MQ4BS59B04Mbovteg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", + "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", "requires": { - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/rlp": "^5.1.0" + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/rlp": "^5.4.0" } }, "@ethersproject/base64": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.1.0.tgz", - "integrity": "sha512-npD1bLvK4Bcxz+m4EMkx+F8Rd7CnqS9DYnhNu0/GlQBXhWjvfoAZzk5HJ0f1qeyp8d+A86PTuzLOGOXf4/CN8g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", + "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", "requires": { - "@ethersproject/bytes": "^5.1.0" + "@ethersproject/bytes": "^5.4.0" } }, "@ethersproject/bignumber": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.1.0.tgz", - "integrity": "sha512-wUvQlhTjPjFXIdLPOuTrFeQmSa6Wvls1bGXQNQWvB/SEn1NsTCE8PmumIEZxmOPjSHl1eV2uyHP5jBm5Cgj92Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.0.tgz", + "integrity": "sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "bn.js": "^4.4.0" + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "bn.js": "^4.11.9" } }, "@ethersproject/bytes": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.1.0.tgz", - "integrity": "sha512-sGTxb+LVjFxJcJeUswAIK6ncgOrh3D8c192iEJd7mLr95V6du119rRfYT/b87WPkZ5I3gRBUYIYXtdgCWACe8g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", + "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", "requires": { - "@ethersproject/logger": "^5.1.0" + "@ethersproject/logger": "^5.4.0" } }, "@ethersproject/constants": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.1.0.tgz", - "integrity": "sha512-0/SuHrxc8R8k+JiLmJymxHJbojUDWBQqO+b+XFdwaP0jGzqC09YDy/CAlSZB6qHsBifY8X3I89HcK/oMqxRdBw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", + "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", "requires": { - "@ethersproject/bignumber": "^5.1.0" + "@ethersproject/bignumber": "^5.4.0" } }, "@ethersproject/hash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.1.0.tgz", - "integrity": "sha512-fNwry20yLLPpnRRwm3fBL+2ksgO+KMadxM44WJmRIoTKzy4269+rbq9KFoe2LTqq2CXJM2CE70beGaNrpuqflQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", + "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", "requires": { - "@ethersproject/abstract-signer": "^5.1.0", - "@ethersproject/address": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/strings": "^5.1.0" + "@ethersproject/abstract-signer": "^5.4.0", + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" } }, "@ethersproject/keccak256": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.1.0.tgz", - "integrity": "sha512-vrTB1W6AEYoadww5c9UyVJ2YcSiyIUTNDRccZIgwTmFFoSHwBtcvG1hqy9RzJ1T0bMdATbM9Hfx2mJ6H0i7Hig==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", + "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", "requires": { - "@ethersproject/bytes": "^5.1.0", + "@ethersproject/bytes": "^5.4.0", "js-sha3": "0.5.7" }, "dependencies": { @@ -1252,83 +1391,84 @@ } }, "@ethersproject/logger": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.1.0.tgz", - "integrity": "sha512-wtUaD1lBX10HBXjjKV9VHCBnTdUaKQnQ2XSET1ezglqLdPdllNOIlLfhyCRqXm5xwcjExVI5ETokOYfjPtaAlw==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz", + "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ==" }, "@ethersproject/networks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.1.0.tgz", - "integrity": "sha512-A/NIrIED/G/IgU1XUukOA3WcFRxn2I4O5GxsYGA5nFlIi+UZWdGojs85I1VXkR1gX9eFnDXzjE6OtbgZHjFhIA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.1.tgz", + "integrity": "sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig==", "requires": { - "@ethersproject/logger": "^5.1.0" + "@ethersproject/logger": "^5.4.0" } }, "@ethersproject/properties": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.1.0.tgz", - "integrity": "sha512-519KKTwgmH42AQL3+GFV3SX6khYEfHsvI6v8HYejlkigSDuqttdgVygFTDsGlofNFchhDwuclrxQnD5B0YLNMg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz", + "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==", "requires": { - "@ethersproject/logger": "^5.1.0" + "@ethersproject/logger": "^5.4.0" } }, "@ethersproject/rlp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.1.0.tgz", - "integrity": "sha512-vDTyHIwNPrecy55gKGZ47eJZhBm8LLBxihzi5ou+zrSvYTpkSTWRcKUlXFDFQVwfWB+P5PGyERAdiDEI76clxw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", + "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0" + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0" } }, "@ethersproject/signing-key": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.1.0.tgz", - "integrity": "sha512-tE5LFlbmdObG8bY04NpuwPWSRPgEswfxweAI1sH7TbP0ml1elNfqcq7ii/3AvIN05i5U0Pkm3Tf8bramt8MmLw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", + "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "bn.js": "^4.4.0", - "elliptic": "6.5.4" + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" } }, "@ethersproject/strings": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.1.0.tgz", - "integrity": "sha512-perBZy0RrmmL0ejiFGUOlBVjMsUceqLut3OBP3zP96LhiJWWbS8u1NqQVgN4/Gyrbziuda66DxiQocXhsvx+Sw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", + "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", "requires": { - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/logger": "^5.1.0" + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/logger": "^5.4.0" } }, "@ethersproject/transactions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.1.0.tgz", - "integrity": "sha512-s10crRLZEA0Bgv6FGEl/AKkTw9f+RVUrlWDX1rHnD4ZncPFeiV2AJr4nT7QSUhxJdFPvjyKRDb3nEH27dIqcPQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", + "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", "requires": { - "@ethersproject/address": "^5.1.0", - "@ethersproject/bignumber": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/constants": "^5.1.0", - "@ethersproject/keccak256": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/rlp": "^5.1.0", - "@ethersproject/signing-key": "^5.1.0" + "@ethersproject/address": "^5.4.0", + "@ethersproject/bignumber": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/constants": "^5.4.0", + "@ethersproject/keccak256": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/rlp": "^5.4.0", + "@ethersproject/signing-key": "^5.4.0" } }, "@ethersproject/web": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.1.0.tgz", - "integrity": "sha512-LTeluWgTq04+RNqAkVhpydPcRZK/kKxD2Vy7PYGrAD27ABO9kTqTBKwiOuzTyAHKUQHfnvZbXmxBXJAGViSDcA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", + "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", "requires": { - "@ethersproject/base64": "^5.1.0", - "@ethersproject/bytes": "^5.1.0", - "@ethersproject/logger": "^5.1.0", - "@ethersproject/properties": "^5.1.0", - "@ethersproject/strings": "^5.1.0" + "@ethersproject/base64": "^5.4.0", + "@ethersproject/bytes": "^5.4.0", + "@ethersproject/logger": "^5.4.0", + "@ethersproject/properties": "^5.4.0", + "@ethersproject/strings": "^5.4.0" } }, "@feathersjs/authentication": { @@ -1640,14 +1780,14 @@ } }, "@material-ui/core": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.3.tgz", - "integrity": "sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.1.tgz", + "integrity": "sha512-C6hYsjkWCTfBx9FaqxhCZCITBagh7fyCKFtHyvO3tTOcBw6NJaktdhNZ2n82jQdQdgfFvg6OOxi7OOzsAdAcBQ==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.3", - "@material-ui/system": "^4.11.3", - "@material-ui/types": "^5.1.0", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.2", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.4", @@ -1667,9 +1807,9 @@ } }, "@material-ui/lab": { - "version": "4.0.0-alpha.57", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.57.tgz", - "integrity": "sha512-qo/IuIQOmEKtzmRD2E4Aa6DB4A87kmY6h0uYhjUmrrgmEAgbbw9etXpWPVXuRK6AGIQCjFzV6WO2i21m1R4FCw==", + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -1679,13 +1819,13 @@ } }, "@material-ui/styles": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.3.tgz", - "integrity": "sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", "requires": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", - "@material-ui/types": "^5.1.0", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.2", "clsx": "^1.0.4", "csstype": "^2.5.2", @@ -1702,9 +1842,9 @@ } }, "@material-ui/system": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.3.tgz", - "integrity": "sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -1756,6 +1896,11 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-ethereum-package/-/contracts-ethereum-package-3.0.0.tgz", "integrity": "sha512-Xg33RtX7FGbSK/YnroLhcGNAvH30/C84NRW8KvbSdXXYiLA8YqM1bOA9sAeLjmQxXqYUn/YL4AUVTgDnG51NOw==" }, + "@openzeppelin/contracts-upgradeable": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-3.4.1.tgz", + "integrity": "sha512-wBGlUzEkOxcj/ghtcF2yKc8ZYh+PTUtm1mK38zoENulJ6aplij7eH8quo3lMugfzPJy+V6V5qI8QhdQmCn7hkQ==" + }, "@rsksmart/erc677": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@rsksmart/erc677/-/erc677-1.0.2.tgz", @@ -1779,6 +1924,22 @@ } } }, + "@rsksmart/rif-marketplace-notifier": { + "version": "0.0.1-dev.2", + "resolved": "https://registry.npmjs.org/@rsksmart/rif-marketplace-notifier/-/rif-marketplace-notifier-0.0.1-dev.2.tgz", + "integrity": "sha512-PtM7TeoL0KqQxoJc0QZYASJYn4eP8bwjF5MQKQ9EmRgYrBayv2s1oYWLV1ASDVeUpHcJpRjmdqMqt4FTFwKNJg==", + "requires": { + "@openzeppelin/contracts": "^3.4.0", + "@openzeppelin/contracts-upgradeable": "^3.4.0" + }, + "dependencies": { + "@openzeppelin/contracts": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1.tgz", + "integrity": "sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ==" + } + } + }, "@rsksmart/rif-marketplace-storage": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@rsksmart/rif-marketplace-storage/-/rif-marketplace-storage-0.1.0.tgz", @@ -1796,9 +1957,9 @@ } }, "@rsksmart/rif-ui": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rsksmart/rif-ui/-/rif-ui-0.6.0.tgz", - "integrity": "sha512-txf3jpH1bUrshqpyTre/GTRT3cTi0nC+sy3qNYn5xZWX8q0dTgmo0UEfKwMeWzBjapGcwXyjtrjEYs1Fslko/A==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@rsksmart/rif-ui/-/rif-ui-0.6.1.tgz", + "integrity": "sha512-5r1EimLJPYz0kWal77l9ySxI0n/EnhGO0Al/uyBtnukNEJflLfEyY312uEN3W7nui2Py7qmGwy0Td3bkIQ8tZg==" }, "@rsksmart/rsk-utils": { "version": "1.1.0", @@ -1807,6 +1968,19 @@ "requires": { "keccak": "^2.0.0", "rlp": "^2.2.4" + }, + "dependencies": { + "keccak": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", + "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", + "requires": { + "bindings": "^1.5.0", + "inherits": "^2.0.4", + "nan": "^2.14.0", + "safe-buffer": "^5.2.0" + } + } } }, "@sindresorhus/is": { @@ -1932,9 +2106,9 @@ } }, "@testing-library/dom": { - "version": "7.30.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.30.3.tgz", - "integrity": "sha512-7JhIg2MW6WPwyikH2iL3o7z+FTVgSOd2jqCwTAHqK7Qal2gRRYiUQyURAxtbK9VXm/UTyG9bRihv8C5Tznr2zw==", + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", @@ -1942,7 +2116,7 @@ "@types/aria-query": "^4.2.0", "aria-query": "^4.2.2", "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.4", + "dom-accessibility-api": "^0.5.6", "lz-string": "^1.4.4", "pretty-format": "^26.6.2" }, @@ -1961,18 +2135,18 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -1998,9 +2172,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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", @@ -2022,6 +2196,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "dom-accessibility-api": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz", + "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2052,9 +2232,9 @@ } }, "@testing-library/jest-dom": { - "version": "5.11.10", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.10.tgz", - "integrity": "sha512-FuKiq5xuk44Fqm0000Z9w0hjOdwZRNzgx7xGGxQYepWFZy+OYUMOT/wPI4nLYXCaVltNVpU1W/qmD88wLWDsqQ==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz", + "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==", "dev": true, "requires": { "@babel/runtime": "^7.9.2", @@ -2063,6 +2243,7 @@ "chalk": "^3.0.0", "css": "^3.0.0", "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", "lodash": "^4.17.15", "redent": "^3.0.0" }, @@ -2122,6 +2303,12 @@ "source-map-resolve": "^0.6.0" } }, + "dom-accessibility-api": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz", + "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2156,9 +2343,9 @@ } }, "@testing-library/react": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.6.tgz", - "integrity": "sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -2185,15 +2372,15 @@ } }, "@types/aria-query": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", - "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", "dev": true }, "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -2228,9 +2415,9 @@ } }, "@types/big.js": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.0.2.tgz", - "integrity": "sha512-7NdmOT3zjtghMofDwP1nAJCJWVjc/96V5msXRAZ4lPrvpGlajA95VQec7OXwA2wQaVmhjt+F5ko8pjvQU1tTFA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.1.1.tgz", + "integrity": "sha512-Zns+nT0hj96ie+GDbL5NeHxhL4wNz8QMxCHqBvxgc4x0hhgQ/o92rPwqxvPBhY3ZYnH8TJGw/8oCkjhOy2Rfzw==", "dev": true }, "@types/bn.js": { @@ -2284,9 +2471,9 @@ } }, "@types/jest": { - "version": "26.0.22", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.22.tgz", - "integrity": "sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw==", + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", "dev": true, "requires": { "jest-diff": "^26.0.0", @@ -2307,18 +2494,18 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2334,9 +2521,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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", @@ -2436,9 +2623,9 @@ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" }, "@types/node": { - "version": "14.14.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", - "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" + "version": "14.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz", + "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==" }, "@types/parse-json": { "version": "4.0.0", @@ -2464,9 +2651,9 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz", + "integrity": "sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2474,25 +2661,25 @@ }, "dependencies": { "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" } } }, "@types/react-dom": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.3.tgz", - "integrity": "sha512-4NnJbCeWE+8YBzupn/YrJxZ8VnjcJq5iR1laqQ1vkpQgBiA7bwk0Rp24fxsdNinzJY2U+HHS4dJJDPdoMjdJ7w==", + "version": "17.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", + "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", "dev": true, "requires": { "@types/react": "*" } }, "@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.16.tgz", + "integrity": "sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg==", "dev": true, "requires": { "@types/history": "*", @@ -2533,9 +2720,9 @@ "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" }, "@types/secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", "requires": { "@types/node": "*" } @@ -2557,6 +2744,16 @@ "dev": true, "requires": { "@types/jest": "*" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "@types/testing-library__react-hooks": { @@ -2590,6 +2787,13 @@ "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" + }, + "dependencies": { + "@openzeppelin/contracts": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.3.0.tgz", + "integrity": "sha512-AemZEsQYtUp1WRkcmZm1div5ORfTpLquLaziCIrSagjxyKdmObxuaY1yjQ5SHFMctR8rLwp706NXTbiIRJg7pw==" + } } }, "@typescript-eslint/experimental-utils": { @@ -2806,12 +3010,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "optional": true - }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -2826,11 +3024,6 @@ "negotiator": "0.6.2" } }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, "acorn-globals": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", @@ -2956,7 +3149,8 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -2995,7 +3189,22 @@ "requires": { "ast-types-flow": "0.0.7", "commander": "^2.11.0" - } + }, + "dependencies": { + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, + "cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "requires": { + "bignumber.js": "^9.0.1" + } + } + } }, "arity-n": { "version": "1.0.4", @@ -3022,16 +3231,6 @@ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, "array-includes": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", @@ -3070,6 +3269,133 @@ "call-bind": "^1.0.0", "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "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==" + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "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==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "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" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "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" + } + } + } + } } }, "array.prototype.flatmap": { @@ -3082,6 +3408,145 @@ "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1", "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "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==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, + "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, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + } } }, "arraybuffer.slice": { @@ -3210,12 +3675,9 @@ } }, "available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "requires": { - "array-filter": "^1.0.0" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" }, "aws-sign2": { "version": "0.7.0", @@ -3228,9 +3690,9 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axe-core": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.3.tgz", - "integrity": "sha512-vwPpH4Aj4122EW38mxO/fxhGKtwWTMLDIJfZ1He0Edbtjcfna/R3YB67yVhezUMzqc3Jr3+Ii50KRntlENL4xQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.0.tgz", + "integrity": "sha512-99FZt8qS/xukgxU/8daV8WT7wAakqBzt6lF3XCweO6pwcf50/NgxxBj6ZC7/ejR+F4PWeFpkb9lAMH3y2quBXA==", "dev": true }, "axobject-query": { @@ -3275,6 +3737,34 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3287,6 +3777,131 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "swarm-js": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", + "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "requires": { + "bluebird": "^3.5.0", + "eth-lib": "^0.1.26", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + }, + "dependencies": { + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "web3": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz", + "integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==", + "requires": { + "web3-bzz": "1.2.9", + "web3-core": "1.2.9" + } + }, + "web3-bzz": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.9.tgz", + "integrity": "sha512-ogVQr9jHodu9HobARtvUSmWG22cv2EUQzlPeejGWZ7j5h20HX40EDuWyomGY5VclIj5DdLY76Tmq88RTf/6nxA==", + "requires": { + "got": "9.6.0", + "swarm-js": "^0.1.40" + } + }, + "web3-core": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.9.tgz", + "integrity": "sha512-fSYv21IP658Ty2wAuU9iqmW7V+75DOYMVZsDH/c14jcF/1VXnedOcxzxSj3vArsCvXZNe6XC5/wAuGZyQwR9RA==", + "requires": { + "@types/bn.js": "^4.11.4", + "@types/node": "^12.6.1", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.2.9", + "web3-core-method": "1.2.9", + "web3-core-requestmanager": "1.2.9" + }, + "dependencies": { + "@types/node": { + "version": "12.20.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", + "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" + } + } + }, + "web3-core-helpers": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.9.tgz", + "integrity": "sha512-t0WAG3orLCE3lqi77ZoSRNFok3VQWZXTniZigDQjyOJYMAX7BU3F3js8HKbjVnAxlX3tiKoDxI0KBk9F3AxYuw==" + }, + "web3-core-method": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.9.tgz", + "integrity": "sha512-bjsIoqP3gs7A/gP8+QeLUCyOKJ8bopteCSNbCX36Pxk6TYfYWNuC6hP+2GzUuqdP3xaZNe+XEElQFUNpR3oyAg==", + "requires": { + "@ethersproject/transactions": "^5.0.0-beta.135", + "web3-core-helpers": "1.2.9", + "web3-core-promievent": "1.2.9", + "web3-core-subscriptions": "1.2.9" + } + }, + "web3-core-promievent": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz", + "integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==" + }, + "web3-core-requestmanager": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz", + "integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==", + "requires": { + "web3-core-helpers": "1.2.9" + } + }, + "web3-core-subscriptions": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz", + "integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==", + "requires": { + "web3-core-helpers": "1.2.9" + } } } }, @@ -3337,6 +3952,14 @@ "schema-utils": "^2.6.5" }, "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -3361,6 +3984,46 @@ "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } } }, "babel-plugin-jest-hoist": { @@ -3431,12 +4094,12 @@ "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==" }, "babel-plugin-polyfill-corejs2": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", - "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", "requires": { - "@babel/compat-data": "^7.13.0", - "@babel/helper-define-polyfill-provider": "^0.1.5", + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", "semver": "^6.1.1" }, "dependencies": { @@ -3448,20 +4111,20 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", - "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5" + "@babel/helper-define-polyfill-provider": "^0.2.2" } }, "babel-plugin-syntax-object-rest-spread": { @@ -3644,7 +4307,113 @@ "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", "requires": { "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "web3-eth-accounts": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.9.tgz", + "integrity": "sha512-jkbDCZoA1qv53mFcRHCinoCsgg8WH+M0YUO1awxmqWXRmCRws1wW0TsuSQ14UThih5Dxolgl+e+aGWxG58LMwg==", + "requires": { + "crypto-browserify": "3.12.0", + "eth-lib": "^0.2.8", + "scrypt-js": "^3.0.1" + }, + "dependencies": { + "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==" + }, + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, + "web3-eth-contract": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.9.tgz", + "integrity": "sha512-PYMvJf7EG/HyssUZa+pXrc8IB06K/YFfWYyW4R7ed3sab+9wWUys1TlWxBCBuiBXOokSAyM6H6P6/cKEx8FT8Q==", + "requires": { + "@types/bn.js": "^4.11.4" + } + }, + "web3-eth-ens": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.9.tgz", + "integrity": "sha512-kG4+ZRgZ8I1WYyOBGI8QVRHfUSbbJjvJAGA1AF/NOW7JXQ+x7gBGeJw6taDWJhSshMoEKWcsgvsiuoG4870YxQ==", + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-eth-contract": "1.2.9" + } + }, + "web3-eth-iban": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.9.tgz", + "integrity": "sha512-RtdVvJE0pyg9dHLy0GzDiqgnLnssSzfz/JYguhC1wsj9+Gnq1M6Diy3NixACWUAp6ty/zafyOaZnNQ+JuH9TjQ==", + "requires": { + "bn.js": "4.11.8" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "web3-eth-personal": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.9.tgz", + "integrity": "sha512-cFiNrktxZ1C/rIdJFzQTvFn3/0zcsR3a+Jf8Y3KxeQDHszQtosjLWptP7bsUmDwEh4hzh0Cy3KpOxlYBWB8bJQ==", + "requires": { + "@types/node": "^12.6.1", + "web3-net": "1.2.9" + }, + "dependencies": { + "@types/node": { + "version": "12.20.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", + "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" + } } + }, + "web3-net": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.9.tgz", + "integrity": "sha512-d2mTn8jPlg+SI2hTj2b32Qan6DmtU9ap/IUlJTeQbZQSkTLf0u9suW8Vjwyr4poJYXTurdSshE7OZsPNn30/ZA==" + }, + "web3-providers-http": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.9.tgz", + "integrity": "sha512-F956tCIj60Ttr0UvEHWFIhx+be3He8msoPzyA44/kfzzYoMAsCFRn5cf0zQG6al0znE75g6HlWVSN6s3yAh51A==", + "requires": { + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.9.tgz", + "integrity": "sha512-NQ8QnBleoHA2qTJlqoWu7EJAD/FR5uimf7Ielzk4Z2z+m+6UAuJdJMSuQNj+Umhz9L/Ys6vpS1vHx9NizFl+aQ==" } } }, @@ -3680,9 +4449,9 @@ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -3704,6 +4473,13 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + } } }, "is-accessor-descriptor": { @@ -3736,6 +4512,67 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "web3-shh": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.9.tgz", + "integrity": "sha512-PWa8b/EaxaMinFaxy6cV0i0EOi2M7a/ST+9k9nhyhCjVa2vzXuNoBNo2IUOmeZ0WP2UQB8ByJ2+p4htlJaDOjA==" + }, + "web3-utils": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.9.tgz", + "integrity": "sha512-9hcpuis3n/LxFzEVjwnVgvJzTirS2S9/MiNAa7l4WOEoywY+BSNwnRX4MuHnjkh9NY25B6QOjuNG6FNnSjTw1w==", + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, + "websocket": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz", + "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + } + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -3747,11 +4584,6 @@ "safe-buffer": "^5.0.1" } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -3771,9 +4603,9 @@ } }, "big.js": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.0.3.tgz", - "integrity": "sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA==" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.1.1.tgz", + "integrity": "sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg==" }, "bignumber.js": { "version": "9.0.1", @@ -3830,11 +4662,6 @@ "type-is": "~1.6.17" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3843,6 +4670,11 @@ "ms": "2.0.0" } }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3866,6 +4698,13 @@ "dns-txt": "^2.0.2", "multicast-dns": "^6.0.1", "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } } }, "boolbase": { @@ -3978,9 +4817,9 @@ }, "dependencies": { "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==" + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" } } }, @@ -4001,9 +4840,29 @@ }, "dependencies": { "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==" + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + }, + "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" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "web3": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.9.tgz", + "integrity": "sha512-Mo5aBRm0JrcNpN/g4VOrDzudymfOnHRC3s2VarhYxRA8aWgF5rnhQ0ziySaugpic1gksbXPe105pUWyRqw8HUA==" } } }, @@ -4016,15 +4875,15 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" } }, "bs-logger": { @@ -4062,23 +4921,6 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -4118,9 +4960,9 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cacache": { "version": "13.0.1", @@ -4147,26 +4989,77 @@ "unique-filename": "^1.1.1" }, "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { - "glob": "^7.1.3" + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "web3-core-promievent": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.9.tgz", + "integrity": "sha512-0eAUA2zjgXTleSrnc1wdoKQPPIHU6KHf4fAscu4W9kKrR+mqP1KsjYrxY9wUyjNnXxfQ+5M29ipvbiaK8OqdOw==" + }, + "web3-core-requestmanager": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.9.tgz", + "integrity": "sha512-1PwKV2m46ALUnIN5VPPgjOj8yMLJhhqZYvYJE34hTN5SErOkwhzx5zScvo5MN7v7KyQGFnpVCZKKGCiEnDmtFA==" + }, + "web3-core-subscriptions": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.9.tgz", + "integrity": "sha512-Y48TvXPSPxEM33OmXjGVDMzTd0j8X0t2+sDw66haeBS8eYnrEzasWuBZZXDq0zNUsqyxItgBGDn+cszkgEnFqg==" + }, + "web3-eth": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.9.tgz", + "integrity": "sha512-sIKO4iE9FEBa/CYUd6GdPd7GXt/wISqxUd8PlIld6+hvMJj02lgO7Z7p5T9mZIJcIZJGvZX81ogx8oJ9yif+Ag==", + "requires": { + "web3-core-subscriptions": "1.2.9" } }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -4214,9 +5107,9 @@ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" } } }, @@ -4281,9 +5174,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001205", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz", - "integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==" + "version": "1.0.30001244", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001244.tgz", + "integrity": "sha512-Wb4UFZPkPoJoKKVfELPWytRzpemjP/s0pe22NriANru1NoI+5bGNxzKtk7edYL8rmCWTfQO8eRiF0pn1Dqzx7Q==" }, "capture-exit": { "version": "2.0.0", @@ -4319,24 +5212,24 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "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.5.0" + "readdirp": "~3.6.0" }, "dependencies": { "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4374,6 +5267,14 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4389,20 +5290,10 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { "version": "2.0.0", @@ -4410,9 +5301,9 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cids": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.6.tgz", - "integrity": "sha512-5P+Jas2bVpjiHibp/SOwKY+v7JhAjTChaAZN+vCIrsWXn/JZV0frX22Vp5zZgEyJRPco79pX+yNQ2S3LkRukHQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/cids/-/cids-1.1.7.tgz", + "integrity": "sha512-dlh+K0hMwFAFFjWQ2ZzxOhgGVNVREPdmk8cqHFui2U4sOodcemLMxdE5Ujga4cDcDQhWfldEPThkfu6KWBt1eA==", "requires": { "multibase": "^4.0.1", "multicodec": "^3.0.1", @@ -4481,6 +5372,22 @@ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "requires": { "restore-cursor": "^3.1.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + } } }, "cli-width": { @@ -4498,11 +5405,6 @@ "wrap-ansi": "^5.1.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -4673,6 +5575,11 @@ "vary": "~1.1.2" }, "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4776,6 +5683,11 @@ "safe-buffer": "5.1.2" }, "dependencies": { + "@types/node": { + "version": "14.14.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz", + "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4793,15 +5705,6 @@ "multihashes": "^0.4.15" }, "dependencies": { - "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" - } - }, "cids": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", @@ -4814,6 +5717,24 @@ "multihashes": "~0.4.15" }, "dependencies": { + "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" + } + }, + "multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "requires": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, "multicodec": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", @@ -4825,15 +5746,6 @@ } } }, - "multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, "multicodec": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", @@ -4852,6 +5764,15 @@ "varint": "^5.0.0" }, "dependencies": { + "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" + } + }, "multibase": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", @@ -4911,6 +5832,16 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "copy-descriptor": { @@ -4919,16 +5850,16 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.0.tgz", - "integrity": "sha512-MQx/7TLgmmDVamSyfE+O+5BHvG1aUGj/gHhLn1wVtm2B5u1eVIPvh7vkfjwWKNCjrTJB8+He99IntSQ1qP+vYQ==" + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz", + "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==" }, "core-js-compat": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.0.tgz", - "integrity": "sha512-9yVewub2MXNYyGvuLnMHcN1k9RkvB7/ofktpeKTIaASyB88YYqGzUnu0ywMMhJrDHOMiTjSHWGzR+i7Wb9Z1kQ==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", "requires": { - "browserslist": "^4.16.3", + "browserslist": "^4.16.6", "semver": "7.0.0" }, "dependencies": { @@ -4940,9 +5871,9 @@ } }, "core-js-pure": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.10.0.tgz", - "integrity": "sha512-CC582enhrFZStO4F8lGI7QL3SYx7/AIRc+IdSi3btrQGrVsTawo5K/crmKbRrQ+MOMhNX4v+PATn0k2NN6wI7A==" + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", + "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==" }, "core-util-is": { "version": "1.0.2", @@ -4967,6 +5898,26 @@ "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" } }, "create-ecdh": { @@ -5118,6 +6069,11 @@ "schema-utils": "^2.6.0" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5196,20 +6152,20 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "requires": { "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", + "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "requires": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", @@ -5239,7 +6195,7 @@ "postcss-ordered-values": "^4.1.2", "postcss-reduce-initial": "^4.0.3", "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", + "postcss-svgo": "^4.0.3", "postcss-unique-selectors": "^4.0.1" } }, @@ -5275,9 +6231,9 @@ }, "dependencies": { "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -5309,9 +6265,9 @@ } }, "csstype": { - "version": "2.6.16", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.16.tgz", - "integrity": "sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q==" + "version": "2.6.17", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", + "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==" }, "cyclist": { "version": "1.0.1", @@ -5328,9 +6284,9 @@ } }, "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" }, "dashdash": { "version": "1.14.1", @@ -5413,6 +6369,34 @@ "requires": { "execa": "^1.0.0", "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } } }, "defer-to-connect": { @@ -5545,9 +6529,9 @@ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" }, "detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port-alt": { "version": "1.1.6", @@ -5595,6 +6579,21 @@ "requires": { "arrify": "^1.0.1", "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "dns-equal": { @@ -5603,9 +6602,9 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -5627,12 +6626,6 @@ "esutils": "^2.0.2" } }, - "dom-accessibility-api": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz", - "integrity": "sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ==", - "dev": true - }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -5642,18 +6635,18 @@ } }, "dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "requires": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" }, "dependencies": { "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" } } }, @@ -5696,14 +6689,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -5818,9 +6803,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.704", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.704.tgz", - "integrity": "sha512-6cz0jvawlUe4h5AbfQWxPzb+8LzVyswGAWiGc32EJEmfj39HTQyNPkLXirc7+L4x5I6RgRkzua8Ryu5QZqc8cA==" + "version": "1.3.774", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.774.tgz", + "integrity": "sha512-Fggh17Q1yyv1uMzq8Qn1Ci58P50qcRXMXd2MBcB9sxo6rJxjUutWcNw8uCm3gFWMdcblBO6mDT5HzX/RVRRECA==" }, "elliptic": { "version": "6.5.4", @@ -5837,9 +6822,9 @@ } }, "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==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { "version": "3.0.0", @@ -5860,9 +6845,9 @@ } }, "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", "requires": { "component-emitter": "~1.3.0", "component-inherit": "0.0.3", @@ -5873,7 +6858,7 @@ "parseqs": "0.0.6", "parseuri": "0.0.6", "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", + "xmlhttprequest-ssl": "~1.6.2", "yeast": "0.1.2" }, "dependencies": { @@ -5891,9 +6876,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" } } }, @@ -5907,58 +6892,12 @@ "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" } } }, @@ -5984,9 +6923,9 @@ } }, "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -5996,14 +6935,14 @@ "has-symbols": "^1.0.2", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -6149,6 +7088,14 @@ "resolve-from": "^4.0.0" } }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -6175,6 +7122,20 @@ "eslint-config-airbnb-base": "^14.2.1", "object.assign": "^4.1.2", "object.entries": "^1.1.2" + }, + "dependencies": { + "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, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "eslint-config-airbnb-base": { @@ -6186,6 +7147,25 @@ "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", "object.entries": "^1.1.2" + }, + "dependencies": { + "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, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "eslint-config-react-app": { @@ -6196,6 +7176,12 @@ "confusing-browser-globals": "^1.0.9" } }, + "eslint-config-standard": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz", + "integrity": "sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw==", + "dev": true + }, "eslint-import-resolver-node": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", @@ -6230,23 +7216,35 @@ "loader-utils": "^1.2.3", "object-hash": "^2.0.1", "schema-utils": "^2.6.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", "requires": { - "debug": "^2.6.9", + "debug": "^3.2.7", "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "find-up": { @@ -6266,11 +7264,6 @@ "path-exists": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -6321,23 +7314,25 @@ } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", + "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.4.0", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", "tsconfig-paths": "^3.9.0" }, "dependencies": { @@ -6351,13 +7346,12 @@ } }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, "find-up": { @@ -6369,24 +7363,6 @@ "locate-path": "^2.0.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -6427,49 +7403,23 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { + "pkg-up": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "find-up": "^2.1.0" } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "read-pkg": "^3.0.0" } }, "resolve": { @@ -6514,9 +7464,9 @@ } }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", "dev": true }, "jsx-ast-utils": { @@ -6528,13 +7478,25 @@ "array-includes": "^3.1.2", "object.assign": "^4.1.2" } + }, + "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, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } } } }, "eslint-plugin-no-only-tests": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.4.0.tgz", - "integrity": "sha512-azP9PwQYfGtXJjW273nIxQH9Ygr+5/UyeW2wEjYoDtVYPI+WPKwbj0+qcAKYUXFZLRumq4HKkFaoDBAwBoXImQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", + "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", "dev": true }, "eslint-plugin-node": { @@ -6572,9 +7534,9 @@ "dev": true }, "eslint-plugin-react": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.1.tgz", - "integrity": "sha512-MvFGhZjI8Z4HusajmSw0ougGrq3Gs4vT/0WgwksZgf5RrLrRa2oYAw56okU4tZJl8+j7IYNuTM+2RnFEuTSdRQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", "dev": true, "requires": { "array-includes": "^3.1.3", @@ -6583,12 +7545,12 @@ "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", - "object.entries": "^1.1.3", + "object.entries": "^1.1.4", "object.fromentries": "^2.0.4", - "object.values": "^1.1.3", + "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.4" + "string.prototype.matchall": "^4.0.5" }, "dependencies": { "doctrine": { @@ -6600,6 +7562,17 @@ "esutils": "^2.0.2" } }, + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, "resolve": { "version": "2.0.0-next.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", @@ -6647,6 +7620,13 @@ "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } } }, "esprima": { @@ -6775,6 +7755,15 @@ "setimmediate": "^1.0.5" }, "dependencies": { + "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" + } + }, "keccak": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", @@ -6783,37 +7772,14 @@ "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" } } }, - "ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==" - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -6839,11 +7805,6 @@ "strip-hex-prefix": "1.0.0" } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -6871,25 +7832,16 @@ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, + "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==" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -7029,9 +7981,9 @@ }, "dependencies": { "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" } } }, @@ -7309,6 +8261,22 @@ "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } } }, "find-up": { @@ -7327,6 +8295,16 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -7383,9 +8361,9 @@ } }, "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" }, "for-in": { "version": "1.0.2", @@ -7423,6 +8401,13 @@ "semver": "^5.6.0", "tapable": "^1.0.0", "worker-rpc": "^0.1.0" + }, + "dependencies": { + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + } } }, "form-data": { @@ -7506,14 +8491,6 @@ "universalify": "^0.1.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -7564,12 +8541,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7627,9 +8598,9 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7710,6 +8681,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -7781,9 +8757,9 @@ } }, "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "has": { "version": "1.0.3", @@ -7875,6 +8851,29 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -7893,6 +8892,18 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" + }, + "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" + } + } } }, "hash.js": { @@ -7904,11 +8915,6 @@ "minimalistic-assert": "^1.0.1" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -7953,9 +8959,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "hpack.js": { "version": "2.1.6", @@ -8012,11 +9018,6 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -8053,6 +9054,11 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" } } }, @@ -8069,6 +9075,11 @@ "util.promisify": "1.0.0" }, "dependencies": { + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", @@ -8080,26 +9091,6 @@ } } }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } - } - }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -8142,6 +9133,13 @@ "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + } } }, "http-proxy-middleware": { @@ -8340,6 +9338,11 @@ "through": "^2.3.6" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8462,9 +9465,9 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" }, "is-binary-path": { "version": "2.1.0", @@ -8475,18 +9478,13 @@ } }, "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "is-callable": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", @@ -8514,9 +9512,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", "requires": { "has": "^1.0.3" } @@ -8530,9 +9528,9 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" }, "is-descriptor": { "version": "0.1.6", @@ -8557,9 +9555,9 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-extendable": { "version": "0.1.1", @@ -8587,9 +9585,9 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, "is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" }, "is-glob": { "version": "4.0.1", @@ -8623,9 +9621,9 @@ } }, "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" }, "is-obj": { "version": "2.0.0", @@ -8672,12 +9670,12 @@ } }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-regexp": { @@ -8706,24 +9704,16 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.0" - } + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-typed-array": { @@ -8736,6 +9726,100 @@ "es-abstract": "^1.18.0-next.2", "foreach": "^2.0.5", "has-symbols": "^1.0.1" + }, + "dependencies": { + "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" + } + }, + "es-abstract": { + "version": "1.18.0-next.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.3.tgz", + "integrity": "sha512-VMzHx/Bczjg59E6jZOQjHeN3DEoptdhejpARgflAViidlqSpjdq9zA6lKwlhRRs/lOw1gHJv2xkkSFRgvEwbQg==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "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==" + } + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "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==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } } }, "is-typedarray": { @@ -8753,11 +9837,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -8809,6 +9888,20 @@ "supports-color": "^6.1.0" }, "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -8831,6 +9924,20 @@ "source-map": "^0.6.1" }, "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8864,6 +9971,39 @@ "jest-cli": "^24.9.0" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "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==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "jest-cli": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", @@ -8883,6 +10023,99 @@ "realpath-native": "^1.1.0", "yargs": "^13.3.0" } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -8894,6 +10127,34 @@ "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } } }, "jest-config": { @@ -9076,6 +10337,15 @@ "walker": "^1.0.7" }, "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -9085,6 +10355,14 @@ "bindings": "^1.5.0", "nan": "^2.12.1" } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } } } }, @@ -9155,9 +10433,9 @@ } }, "jest-mock-extended": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-1.0.13.tgz", - "integrity": "sha512-fs621RgUK9Z6frJWDA75Gb9Vpm1d9HbpuAWjIu12hZTNls+VVdlJl/43xrqz70CYUbJPnfkiTfLwue9mkKC1ww==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-1.0.16.tgz", + "integrity": "sha512-W1lI7cO0ZYmTQUBZH11nSDKyU36SxAyzBjZNxBWcpFnCKHGNWIPdFA8RJMhmobLQ8WLI4y9AMIbYzMN9q/GiRQ==", "dev": true, "requires": { "ts-essentials": "^4.0.0" @@ -9249,6 +10527,134 @@ "slash": "^2.0.0", "strip-bom": "^3.0.0", "yargs": "^13.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "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==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "jest-serializer": { @@ -9276,6 +10682,14 @@ "semver": "^6.2.0" }, "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -9307,6 +10721,14 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9325,6 +10747,13 @@ "jest-get-type": "^24.9.0", "leven": "^3.1.0", "pretty-format": "^24.9.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } } }, "jest-watch-typeahead": { @@ -9458,6 +10887,14 @@ "version": "5.7.4", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } } } }, @@ -9564,78 +11001,77 @@ } }, "jss": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.6.0.tgz", - "integrity": "sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz", + "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==", "requires": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", - "indefinite-observable": "^2.0.1", "is-in-browser": "^1.1.3", "tiny-warning": "^1.0.2" }, "dependencies": { "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" } } }, "jss-plugin-camel-case": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz", - "integrity": "sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz", + "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==", "requires": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", - "jss": "10.6.0" + "jss": "10.7.1" } }, "jss-plugin-default-unit": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz", - "integrity": "sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz", + "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.6.0" + "jss": "10.7.1" } }, "jss-plugin-global": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz", - "integrity": "sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz", + "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.6.0" + "jss": "10.7.1" } }, "jss-plugin-nested": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz", - "integrity": "sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz", + "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.6.0", + "jss": "10.7.1", "tiny-warning": "^1.0.2" } }, "jss-plugin-props-sort": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz", - "integrity": "sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz", + "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.6.0" + "jss": "10.7.1" } }, "jss-plugin-rule-value-function": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz", - "integrity": "sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz", + "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==", "requires": { "@babel/runtime": "^7.3.1", - "jss": "10.6.0", + "jss": "10.7.1", "tiny-warning": "^1.0.2" } }, @@ -9647,6 +11083,25 @@ "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", "jss": "10.6.0" + }, + "dependencies": { + "csstype": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", + "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + }, + "jss": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.6.0.tgz", + "integrity": "sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "indefinite-observable": "^2.0.1", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + } } }, "jsx-ast-utils": { @@ -9677,17 +11132,6 @@ "safe-buffer": "^5.0.1" } }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -9707,6 +11151,13 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + } } }, "kleur": { @@ -9779,6 +11230,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -9814,6 +11266,14 @@ "pinkie-promise": "^2.0.0" } }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -9990,6 +11450,13 @@ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "lz-string": { @@ -9998,22 +11465,6 @@ "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", "dev": true }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -10174,10 +11625,90 @@ "to-regex": "^3.0.2" }, "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -10196,16 +11727,16 @@ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", "requires": { - "mime-db": "1.46.0" + "mime-db": "1.48.0" } }, "mimic-fn": { @@ -10252,6 +11783,31 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -10301,6 +11857,21 @@ "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "minipass-flush": { @@ -10309,6 +11880,21 @@ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "minipass-pipeline": { @@ -10317,6 +11903,21 @@ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "minizlib": { @@ -10412,9 +12013,9 @@ } }, "mock-fs": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.13.0.tgz", - "integrity": "sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA==" + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, "move-concurrently": { "version": "1.0.1", @@ -10427,6 +12028,16 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "ms": { @@ -10435,12 +12046,11 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multibase": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.2.tgz", - "integrity": "sha512-l0XMK4O5I9cCfxC0/UMDX/UxlIlrqkjEZQNG+ZUUrsGhnXWgFXgatYOQSONiR/lQGfBO463UyZkh3SiQBpjRIQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.4.tgz", + "integrity": "sha512-8/JmrdSGzlw6KTgAJCOqUBSGd1V6186i/X8dDCGy/lbCKrQ+1QB6f3HE+wPr7Tpdj4U3gutaj9jG2rNX6UpiJg==", "requires": { - "@multiformats/base-x": "^4.0.1", - "web-encoding": "^1.1.0" + "@multiformats/base-x": "^4.0.1" } }, "multicast-dns": { @@ -10458,12 +12068,19 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, "multicodec": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.0.1.tgz", - "integrity": "sha512-Y6j3wiPojvkF/z6KFIGt84KdJdP2oILEdzc/3YbD3qQ3EerhqtYlfsZTPPNVoCCxNZZdzIpCKrdYFSav17sIrQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-3.1.0.tgz", + "integrity": "sha512-f6d4DhbQ9a8WiJ/wpbKgeJSeR0/juP/1wnjbKdZ0KAWDkC/z7Lb3xOegMUG+uTcfwSYf6j1eTvFf8HDgqPRGmQ==", "requires": { - "uint8arrays": "^2.1.3", - "varint": "^5.0.2" + "uint8arrays": "^2.1.5", + "varint": "^6.0.0" + }, + "dependencies": { + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + } } }, "multihashes": { @@ -10600,10 +12217,22 @@ "vm-browserify": "^1.0.1" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } }, "punycode": { "version": "1.4.1", @@ -10624,6 +12253,11 @@ "util-deprecate": "~1.0.1" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -10659,9 +12293,9 @@ } }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" }, "normalize-package-data": { "version": "2.5.0", @@ -10687,17 +12321,6 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -10776,9 +12399,9 @@ "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" }, "object-is": { "version": "1.1.5", @@ -10822,6 +12445,38 @@ "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "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==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "object.fromentries": { @@ -10854,14 +12509,13 @@ } }, "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "oboe": { @@ -11135,6 +12789,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -11209,26 +12864,19 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { "pify": "^3.0.0" } }, "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "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", @@ -11243,14 +12891,15 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "pinkie": { "version": "2.0.4", @@ -11279,6 +12928,46 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } } }, "pkg-up": { @@ -11287,6 +12976,46 @@ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } } }, "pn": { @@ -11324,6 +13053,14 @@ "requires": { "ms": "^2.1.1" } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -11635,11 +13372,10 @@ } }, "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", "requires": { - "lodash.template": "^4.5.0", "postcss": "^7.0.2" } }, @@ -12205,22 +13941,19 @@ } }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "requires": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -12263,11 +13996,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -12305,6 +14033,11 @@ } } }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -12439,15 +14172,6 @@ "side-channel": "^1.0.4" } }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -12507,13 +14231,6 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - } } }, "react": { @@ -12536,6 +14253,13 @@ "raf": "^3.4.1", "regenerator-runtime": "^0.13.3", "whatwg-fetch": "^3.0.0" + }, + "dependencies": { + "whatwg-fetch": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz", + "integrity": "sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==" + } } }, "react-dev-utils": { @@ -12578,9 +14302,9 @@ } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "big.js": { "version": "5.2.2", @@ -12613,6 +14337,11 @@ "which": "^2.0.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==" + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -12652,6 +14381,11 @@ "through": "^2.3.6" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -12662,14 +14396,6 @@ } } }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, "loader-utils": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", @@ -12678,6 +14404,16 @@ "big.js": "^5.2.2", "emojis-list": "^2.0.0", "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } } }, "locate-path": { @@ -12688,6 +14424,14 @@ "p-locate": "^4.1.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -12696,6 +14440,11 @@ "p-limit": "^2.2.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12725,13 +14474,6 @@ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } } }, "which": { @@ -12769,6 +14511,11 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, + "react-hook-form": { + "version": "6.15.8", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-6.15.8.tgz", + "integrity": "sha512-prq82ofMbnRyj5wqDe8hsTRcdR25jQ+B8KtCS7BLCzjFHAwNuCjRwzPuP4eYLsEBjEIeYd6try+pdLdw0kPkpg==" + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -12791,6 +14538,19 @@ "tiny-warning": "^1.0.0" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -12872,6 +14632,11 @@ "workbox-webpack-plugin": "4.3.1" }, "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12894,6 +14659,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, "eslint-plugin-import": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", @@ -12975,11 +14745,25 @@ "locate-path": "^2.0.0" } }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -12991,6 +14775,16 @@ "strip-bom": "^3.0.0" } }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -13047,6 +14841,16 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -13066,10 +14870,48 @@ "read-pkg": "^2.0.0" } }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-url-loader": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "requires": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -13088,39 +14930,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "requires": { - "picomatch": "^2.2.1" - } - }, "realpath-native": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", @@ -13245,15 +15061,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", - "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -13261,6 +15077,75 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "requires": { + "boolbase": "^1.0.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -13272,9 +15157,9 @@ } }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", @@ -13354,10 +15239,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -13384,76 +15270,6 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", - "requires": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -13513,9 +15329,9 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -13602,6 +15418,51 @@ "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "sanitize.css": { @@ -13704,9 +15565,9 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "requires": { "node-forge": "^0.10.0" } @@ -13900,6 +15761,11 @@ "mixin-object": "^2.0.1" }, "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "kind-of": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", @@ -14132,31 +15998,6 @@ "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, "dependencies": { "debug": { "version": "3.1.0", @@ -14175,6 +16016,16 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } } } }, @@ -14301,9 +16152,9 @@ } }, "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" }, "spdy": { "version": "4.0.2", @@ -14328,6 +16179,18 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" + }, + "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" + } + } } }, "split-string": { @@ -14360,9 +16223,9 @@ } }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz", + "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==", "requires": { "figgy-pudding": "^3.5.1", "minipass": "^3.1.1" @@ -14374,9 +16237,9 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", - "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", "requires": { "escape-string-regexp": "^2.0.0" }, @@ -14559,6 +16422,16 @@ "strip-ansi": "^6.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==" + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -14570,14 +16443,15 @@ } }, "string.prototype.matchall": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", - "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has-symbols": "^1.0.1", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.3.1", "side-channel": "^1.0.4" @@ -14756,6 +16630,16 @@ "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "swarm-js": { @@ -14826,6 +16710,16 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -14857,11 +16751,6 @@ "string-width": "^3.0.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -14875,6 +16764,13 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + } } } } @@ -14915,6 +16811,14 @@ "yallist": "^3.0.0" } }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -14932,6 +16836,11 @@ "source-map-support": "~0.5.12" }, "dependencies": { + "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==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -15004,6 +16913,14 @@ "semver": "^6.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -15012,6 +16929,11 @@ "p-limit": "^2.2.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -15054,6 +16976,103 @@ "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + } } }, "text-table": { @@ -15237,9 +17256,9 @@ "dev": true }, "ts-jest": { - "version": "26.5.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.4.tgz", - "integrity": "sha512-I5Qsddo+VTm94SukBJ4cPimOoFZsYTeElR2xy6H2TOVs+NsvgYglW8KuQgKoApOKuaU/Ix/vrF9ebFZlb5D2Pg==", + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", "dev": true, "requires": { "bs-logger": "0.x", @@ -15268,18 +17287,18 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -15304,9 +17323,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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", @@ -15364,13 +17383,13 @@ } }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mkdirp": { @@ -15407,9 +17426,9 @@ } }, "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "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 } } @@ -15443,9 +17462,9 @@ } }, "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "tsutils": { "version": "3.21.0", @@ -15521,9 +17540,9 @@ } }, "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==" + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==" }, "uberproto": { "version": "2.0.6", @@ -15531,12 +17550,11 @@ "integrity": "sha512-68H97HffZoFaa3HFtpstahWorN9dSp5uTU6jo3GjIQ6JkJBR3hC2Nx/e/HFOoYHdUyT/Z1MRWfxN1EiQJZUyCQ==" }, "uint8arrays": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.3.tgz", - "integrity": "sha512-2h2Z2OIqzrhHmZTv9ViJVyZZreFkHRHeihh7SxLVY/nLUVJhU4ey/u74tWsgMR6hhMSO2g5rhKmdLQIg3lKiUQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.5.tgz", + "integrity": "sha512-CSR7AO+4AHUeSOnZ/NBNCElDeWfRh9bXtOck27083kc7SznmmHIhNEkEOCQOn0wvrIMjS3IH0TNLR16vuc46mA==", "requires": { - "multibase": "^4.0.1", - "web-encoding": "^1.1.0" + "multibase": "^4.0.1" } }, "ultron": { @@ -15555,11 +17573,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -15661,6 +17674,13 @@ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "requires": { "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } } } } @@ -15669,11 +17689,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, @@ -15719,6 +17734,13 @@ "loader-utils": "^1.2.3", "mime": "^2.4.4", "schema-utils": "^2.5.0" + }, + "dependencies": { + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==" + } } }, "url-parse": { @@ -15761,9 +17783,9 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "utf-8-validate": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", - "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", + "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", "requires": { "node-gyp-build": "^4.2.0" } @@ -15914,12 +17936,51 @@ "chokidar": "^2.1.8" }, "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -15938,6 +17999,35 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" } }, "fsevents": { @@ -15980,33 +18070,21 @@ "binary-extensions": "^1.0.0" } }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "optional": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -16016,6 +18094,23 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } } }, "safe-buffer": { @@ -16032,6 +18127,16 @@ "requires": { "safe-buffer": "~5.1.0" } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, @@ -16043,94 +18148,105 @@ "minimalistic-assert": "^1.0.0" } }, - "web-encoding": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.3.tgz", - "integrity": "sha512-7yliVJ2PZZKbwOSypc3EHZvZTby0Cp7N3oz9hwKtuKy175u5x84gLHYb7D608lufMjPTQm/p5fJ5Pu0oztMBPw==", - "requires": { - "@zxing/text-encoding": "0.9.0" - } - }, "web3": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.3.4.tgz", - "integrity": "sha512-D6cMb2EtTMLHgdGbkTPGl/Qi7DAfczR+Lp7iFX3bcu/bsD9V8fZW69hA8v5cRPNGzXUwVQebk3bS17WKR4cD2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.4.0.tgz", + "integrity": "sha512-faT3pIX+1tuo+wqmUFQPe10MUGaB1UvRYxw9dmVJFLxaRAIfXErSilOf3jFhSwKbbPNkwG0bTiudCLN9JgeS7A==", "requires": { - "web3-bzz": "1.3.4", - "web3-core": "1.3.4", - "web3-eth": "1.3.4", - "web3-eth-personal": "1.3.4", - "web3-net": "1.3.4", - "web3-shh": "1.3.4", - "web3-utils": "1.3.4" + "web3-bzz": "1.4.0", + "web3-core": "1.4.0", + "web3-eth": "1.4.0", + "web3-eth-personal": "1.4.0", + "web3-net": "1.4.0", + "web3-shh": "1.4.0", + "web3-utils": "1.4.0" } }, "web3-bzz": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.3.4.tgz", - "integrity": "sha512-DBRVQB8FAgoAtZCpp2GAGPCJjgBgsuwOKEasjV044AAZiONpXcKHbkO6G1SgItIixnrJsRJpoGLGw52Byr6FKw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.4.0.tgz", + "integrity": "sha512-KhXmz8hcfGsqhplB7NrekAeNkG2edHjXV4bL3vnXde8RGMWpabpSNxuwiGv+dv/3nWlrHatH0vGooONYCkP5TA==", "requires": { "@types/node": "^12.12.6", "got": "9.6.0", "swarm-js": "^0.1.40", - "underscore": "1.9.1" + "underscore": "1.12.1" }, "dependencies": { "@types/node": { - "version": "12.20.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", - "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" + "version": "12.20.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.16.tgz", + "integrity": "sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==" + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" } } }, "web3-core": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.3.4.tgz", - "integrity": "sha512-7OJu46RpCEfTerl+gPvHXANR2RkLqAfW7l2DAvQ7wN0pnCzl9nEfdgW6tMhr31k3TR2fWucwKzCyyxMGzMHeSA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.4.0.tgz", + "integrity": "sha512-VRNMNqwzvPeKIet2l9BMApPHoUv0UqwaZH0lZJhG2RBko42w9Xls+pQwfVNSV16j04t/ehm1aLRV2Sx6lzVfRg==", "requires": { "@types/bn.js": "^4.11.5", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.4", - "web3-core-method": "1.3.4", - "web3-core-requestmanager": "1.3.4", - "web3-utils": "1.3.4" + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-requestmanager": "1.4.0", + "web3-utils": "1.4.0" }, "dependencies": { "@types/node": { - "version": "12.20.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", - "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" + "version": "12.20.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.16.tgz", + "integrity": "sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==" } } }, "web3-core-helpers": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.4.tgz", - "integrity": "sha512-n7BqDalcTa1stncHMmrnFtyTgDhX5Fy+avNaHCf6qcOP2lwTQC8+mdHVBONWRJ6Yddvln+c8oY/TAaB6PzWK0A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.4.0.tgz", + "integrity": "sha512-8Ebq0nmRfzw7iPoXbIRHEWOuPh+1cOV3OOEvKm5Od3McZOjja914vdk+DM3MgmbSpDzYJRFM6KoF0+Z/U/1bPw==", "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.4", - "web3-utils": "1.3.4" + "underscore": "1.12.1", + "web3-eth-iban": "1.4.0", + "web3-utils": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-core-method": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.3.4.tgz", - "integrity": "sha512-JxmQrujsAWYRRN77P/RY7XuZDCzxSiiQJrgX/60Lfyf7FF1Y0le4L/UMCi7vUJnuYkbU1Kfl9E0udnqwyPqlvQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.4.0.tgz", + "integrity": "sha512-KW9922fEkgKu8zDcJR8Iikg/epsuWMArAUVTipKVwzAI5TVdvOMRgSe/b7IIDRUIeoeXMARmJ+PrAlx+IU2acQ==", "requires": { "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.4", - "web3-core-promievent": "1.3.4", - "web3-core-subscriptions": "1.3.4", - "web3-utils": "1.3.4" + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-utils": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-core-promievent": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.3.4.tgz", - "integrity": "sha512-V61dZIeBwogg6hhZZUt0qL9hTp1WDhnsdjP++9fhTDr4vy/Gz8T5vibqT2LLg6lQC8i+Py33yOpMeMNjztaUaw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.4.0.tgz", + "integrity": "sha512-YEwko22kcry7lHwbe0k80BrjXCZ+73jMdvZtptRH5k2B+XZ1XtmXwYL1PFIlZy9V0zgZijdg+3GabCnAHjVXAw==", "requires": { "eventemitter3": "4.0.4" }, @@ -16143,22 +18259,27 @@ } }, "web3-core-requestmanager": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.3.4.tgz", - "integrity": "sha512-xriouCrhVnVDYQ04TZXdEREZm0OOJzkSEsoN5bu4JYsA6e/HzROeU+RjDpMUxFMzN4wxmFZ+HWbpPndS3QwMag==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.4.0.tgz", + "integrity": "sha512-qIwKJO5T0KkUAIL7y9JRSUkk3+LaCwghdUHK8FzbMvq6R1W9lgCBnccqFGEI76EJjHvsiw4kEKBEXowdB3xenQ==", "requires": { - "underscore": "1.9.1", + "underscore": "1.12.1", "util": "^0.12.0", - "web3-core-helpers": "1.3.4", - "web3-providers-http": "1.3.4", - "web3-providers-ipc": "1.3.4", - "web3-providers-ws": "1.3.4" + "web3-core-helpers": "1.4.0", + "web3-providers-http": "1.4.0", + "web3-providers-ipc": "1.4.0", + "web3-providers-ws": "1.4.0" }, "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, "util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -16171,70 +18292,98 @@ } }, "web3-core-subscriptions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.3.4.tgz", - "integrity": "sha512-drVHVDxh54hv7xmjIm44g4IXjfGj022fGw4/meB5R2D8UATFI40F73CdiBlyqk3DysP9njDOLTJFSQvEkLFUOg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.4.0.tgz", + "integrity": "sha512-/UMC9rSLEd0U+h6Qanx6CM29o/cfUyGWgl/HM6O/AIuth9G+34QBuKDa11Gr2Qg6F8Lr9tSFm8QIGVniOx9i5A==", "requires": { "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.4" + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0" }, "dependencies": { "eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" } } }, "web3-eth": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.3.4.tgz", - "integrity": "sha512-8OIVMLbvmx+LB5RZ4tDhXuFGWSdNMrCZ4HM0+PywQ08uEcmAcqTMFAn4vdPii+J8gCatZR501r1KdzX3SDLoPw==", - "requires": { - "underscore": "1.9.1", - "web3-core": "1.3.4", - "web3-core-helpers": "1.3.4", - "web3-core-method": "1.3.4", - "web3-core-subscriptions": "1.3.4", - "web3-eth-abi": "1.3.4", - "web3-eth-accounts": "1.3.4", - "web3-eth-contract": "1.3.4", - "web3-eth-ens": "1.3.4", - "web3-eth-iban": "1.3.4", - "web3-eth-personal": "1.3.4", - "web3-net": "1.3.4", - "web3-utils": "1.3.4" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.4.0.tgz", + "integrity": "sha512-L990eMJeWh4h/Z3M8MJb9HrKq8tqvzdGZ7igdzd6Ba3B/VKgGFAJ/4XIqtLwAJ1Wg5Cj8my60tYY+34c2cLefw==", + "requires": { + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-eth-accounts": "1.4.0", + "web3-eth-contract": "1.4.0", + "web3-eth-ens": "1.4.0", + "web3-eth-iban": "1.4.0", + "web3-eth-personal": "1.4.0", + "web3-net": "1.4.0", + "web3-utils": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-eth-abi": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.3.4.tgz", - "integrity": "sha512-PVSLXJ2dzdXsC+R24llIIEOS6S1KhG5qwNznJjJvXZFe3sqgdSe47eNvwUamZtCBjcrdR/HQr+L/FTxqJSf80Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.4.0.tgz", + "integrity": "sha512-FtmWipG/dSSkTGFb72JCwky7Jd0PIvd0kGTInWQwIEZlw5qMOYl61WZ9gwfojFHvHF6q1eKncerQr+MRXHO6zg==", "requires": { "@ethersproject/abi": "5.0.7", - "underscore": "1.9.1", - "web3-utils": "1.3.4" + "underscore": "1.12.1", + "web3-utils": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-eth-accounts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.3.4.tgz", - "integrity": "sha512-gz9ReSmQEjqbYAjpmAx+UZF4CVMbyS4pfjSYWGAnNNI+Xz0f0u0kCIYXQ1UEaE+YeLcYiE+ZlZdgg6YoatO5nA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.4.0.tgz", + "integrity": "sha512-tETHBvfO3Z7BXZ7HJIwuX7ol6lPefP55X7b4IiX82C1PujHwsxENY7c/3wyxzqKoDyH6zfyEQo17yhxkhsM1oA==", "requires": { + "@ethereumjs/common": "^2.3.0", + "@ethereumjs/tx": "^3.2.1", "crypto-browserify": "3.12.0", "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", - "underscore": "1.9.1", + "underscore": "1.12.1", "uuid": "3.3.2", - "web3-core": "1.3.4", - "web3-core-helpers": "1.3.4", - "web3-core-method": "1.3.4", - "web3-utils": "1.3.4" + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-utils": "1.4.0" }, "dependencies": { + "@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": "*" + } + }, "eth-lib": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", @@ -16245,6 +18394,31 @@ "xhr-request-promise": "^0.1.2" } }, + "ethereumjs-util": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz", + "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" + }, + "dependencies": { + "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==" + } + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -16253,103 +18427,124 @@ } }, "web3-eth-contract": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.3.4.tgz", - "integrity": "sha512-Fvy8ZxUksQY2ePt+XynFfOiSqxgQtMn4m2NJs6VXRl2Inl17qyRi/nIJJVKTcENLocm+GmZ/mxq2eOE5u02nPg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.4.0.tgz", + "integrity": "sha512-GfIhOzfp/ZXKd+1tFEH3ePq0DEsvq9XO5tOsI0REDtEYUj2GNxO5e/x/Fhekk7iLZ7xAqSzDMweFruDQ1fxn0A==", "requires": { "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.4", - "web3-core-helpers": "1.3.4", - "web3-core-method": "1.3.4", - "web3-core-promievent": "1.3.4", - "web3-core-subscriptions": "1.3.4", - "web3-eth-abi": "1.3.4", - "web3-utils": "1.3.4" + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-utils": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-eth-ens": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.3.4.tgz", - "integrity": "sha512-b0580tQyQwpV2wyacwQiBEfQmjCUln5iPhge3IBIMXaI43BUNtH3lsCL9ERFQeOdweB4o+6rYyNYr6xbRcSytg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.4.0.tgz", + "integrity": "sha512-jR1KorjU1erpYFpFzsMXAWZnHhqUqWPBq/4+BGVj7/pJ43+A3mrE1eB0zl91Dwc1RTNwOhB02iOj1c9OlpGr3g==", "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.4", - "web3-core-helpers": "1.3.4", - "web3-core-promievent": "1.3.4", - "web3-eth-abi": "1.3.4", - "web3-eth-contract": "1.3.4", - "web3-utils": "1.3.4" + "underscore": "1.12.1", + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-promievent": "1.4.0", + "web3-eth-abi": "1.4.0", + "web3-eth-contract": "1.4.0", + "web3-utils": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-eth-iban": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.4.tgz", - "integrity": "sha512-Y7/hLjVvIN/OhaAyZ8L/hxbTqVX6AFTl2RwUXR6EEU9oaLydPcMjAx/Fr8mghUvQS3QJSr+UGubP3W4SkyNiYw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.4.0.tgz", + "integrity": "sha512-YNx748VzwiBe0gvtZjvU9BQsooZ9s9sAlmiDWJOMcvMbUTDhC7SvxA7vV/vrnOxL6oGHRh0U/azsYNxxlKiTBw==", "requires": { "bn.js": "^4.11.9", - "web3-utils": "1.3.4" + "web3-utils": "1.4.0" } }, "web3-eth-personal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.3.4.tgz", - "integrity": "sha512-JiTbaktYVk1j+S2EDooXAhw5j/VsdvZfKRmHtXUe/HizPM9ETXmj1+ne4RT6m+950jQ7DJwUF3XU1FKYNtEDwQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.4.0.tgz", + "integrity": "sha512-8Ip6xZ8plmWqAD4ESbKUIPVV9gfTAFFm0ff1FQIw9I9kYvFlBIPzukvm852w2SftGem+/iRH+2+2mK7HvuKXZQ==", "requires": { "@types/node": "^12.12.6", - "web3-core": "1.3.4", - "web3-core-helpers": "1.3.4", - "web3-core-method": "1.3.4", - "web3-net": "1.3.4", - "web3-utils": "1.3.4" + "web3-core": "1.4.0", + "web3-core-helpers": "1.4.0", + "web3-core-method": "1.4.0", + "web3-net": "1.4.0", + "web3-utils": "1.4.0" }, "dependencies": { "@types/node": { - "version": "12.20.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", - "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" + "version": "12.20.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.16.tgz", + "integrity": "sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==" } } }, "web3-net": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.3.4.tgz", - "integrity": "sha512-wVyqgVC3Zt/0uGnBiR3GpnsS8lvOFTDgWZMxAk9C6Guh8aJD9MUc7pbsw5rHrPUVe6S6RUfFJvh/Xq8oMIQgSw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.4.0.tgz", + "integrity": "sha512-41WkKobL+KnKC0CY0RZ1KhMMyR/hMFGlbHZQac4KtB7ro1UdXeK+RiYX+GzSr1h7j9Dj+dQZqyBs70cxmL9cPQ==", "requires": { - "web3-core": "1.3.4", - "web3-core-method": "1.3.4", - "web3-utils": "1.3.4" + "web3-core": "1.4.0", + "web3-core-method": "1.4.0", + "web3-utils": "1.4.0" } }, "web3-providers-http": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.4.tgz", - "integrity": "sha512-aIg/xHXvxpqpFU70sqfp+JC3sGkLfAimRKTUhG4oJZ7U+tTcYTHoxBJj+4A3Id4JAoKiiv0k1/qeyQ8f3rMC3g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.4.0.tgz", + "integrity": "sha512-A9nLF4XGZfDb1KYYuKRwHY1H90Ee/0I0CqQQEELI0yuY9eca50qdCHEg3sJhvqBIG44JCm83amOGxR8wi+76tQ==", "requires": { - "web3-core-helpers": "1.3.4", + "web3-core-helpers": "1.4.0", "xhr2-cookies": "1.1.0" } }, "web3-providers-ipc": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.4.tgz", - "integrity": "sha512-E0CvXEJElr/TIlG1YfJeO3Le5NI/4JZM+1SsEdiPIfBUAJN18oOoum138EBGKv5+YaLKZUtUuJSXWjIIOR/0Ig==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.4.0.tgz", + "integrity": "sha512-ul/tSNUI5anhdBGBV+FWFH9EJgO73/G21haFDEXvTnSJQa9/byj401H/E2Xd8BXGk+2XB+CCGLZBiuAjhhhtTA==", "requires": { "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.4" + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + } } }, "web3-providers-ws": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.4.tgz", - "integrity": "sha512-WBd9hk2fUAdrbA3kUyUk94ZeILtE6txLeoVVvIKAw2bPegx+RjkLyxC1Du0oceKgQ/qQWod8CCzl1E/GgTP+MQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.4.0.tgz", + "integrity": "sha512-E5XfF58RLXuCtGiMSXxXEtjceCfPli+I4MDYCKx/J/bDJ6qvLUM2OnnGEmE7pq1Z03h0xh1ZezaB/qoweK3ZIQ==", "requires": { "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.4", + "underscore": "1.12.1", + "web3-core-helpers": "1.4.0", "websocket": "^1.0.32" }, "dependencies": { @@ -16357,24 +18552,29 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" } } }, "web3-shh": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.3.4.tgz", - "integrity": "sha512-zoeww5mxLh3xKcqbX85irQbtFe5pc5XwrgjvmdMkhkOdZzPASlWOgqzUFtaPykpLwC3yavVx4jG5RqifweXLUA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.4.0.tgz", + "integrity": "sha512-OZMkMgo+VZnu1ErhIFXW+5ExnPKQg9v8/2DHGVtNEwuC5OHYuAEF5U7MQgbxYJYwbRmxQCt/hA3VwKjnkbmSAA==", "requires": { - "web3-core": "1.3.4", - "web3-core-method": "1.3.4", - "web3-core-subscriptions": "1.3.4", - "web3-net": "1.3.4" + "web3-core": "1.4.0", + "web3-core-method": "1.4.0", + "web3-core-subscriptions": "1.4.0", + "web3-net": "1.4.0" } }, "web3-utils": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.4.tgz", - "integrity": "sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.4.0.tgz", + "integrity": "sha512-b8mEhwh/J928Xk+SQFjtqrR2EGPhpknWLcIt9aCpVPVRXiqjUGo/kpOHKz0azu9c6/onEJ9tWXZt0cVjmH0N5Q==", "requires": { "bn.js": "^4.11.9", "eth-lib": "0.2.8", @@ -16382,7 +18582,7 @@ "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", "randombytes": "^2.1.0", - "underscore": "1.9.1", + "underscore": "1.12.1", "utf8": "3.0.0" }, "dependencies": { @@ -16395,6 +18595,11 @@ "elliptic": "^6.4.0", "xhr-request-promise": "^0.1.2" } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" } } }, @@ -16460,6 +18665,43 @@ "y18n": "^4.0.0" } }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + } + } + } + } + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -16469,14 +18711,39 @@ "estraverse": "^4.1.1" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" } }, + "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==" + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -16500,6 +18767,19 @@ "figgy-pudding": "^3.5.1" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, "terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -16602,6 +18882,13 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } } }, "fsevents": { @@ -16651,7 +18938,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "normalize-path": { + "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" @@ -16678,6 +18965,22 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } } }, "safe-buffer": { @@ -16790,9 +19093,9 @@ } }, "websocket": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz", - "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", "requires": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -16838,11 +19141,6 @@ "iconv-lite": "0.4.24" } }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", @@ -16895,6 +19193,133 @@ "function-bind": "^1.1.1", "has-symbols": "^1.0.1", "is-typed-array": "^1.1.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.3.tgz", + "integrity": "sha512-VMzHx/Bczjg59E6jZOQjHeN3DEoptdhejpARgflAViidlqSpjdq9zA6lKwlhRRs/lOw1gHJv2xkkSFRgvEwbQg==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "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==" + } + } + }, + "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" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "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==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "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" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "dependencies": { + "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" + } + } + } + } } }, "word-wrap": { @@ -17134,14 +19559,6 @@ "signal-exit": "^3.0.2" } }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - }, "xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", @@ -17206,9 +19623,9 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==" }, "xregexp": { "version": "4.4.1", @@ -17224,9 +19641,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yaeti": { "version": "0.0.6", @@ -17260,11 +19677,6 @@ "yargs-parser": "^13.1.2" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", diff --git a/package.json b/package.json index 5b463b49f..b20d7ae44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rif-marketplace-ui", - "version": "1.3.5", + "version": "1.4.0", "description": "RIF Marketplace provides a digital catalogue with a wide range of decentralised services.", "keywords": [ "RIF", @@ -42,14 +42,16 @@ "@material-ui/lab": "^4.0.0-alpha.56", "@rsksmart/erc677": "^1.0.2", "@rsksmart/erc721": "^1.0.0", + "@rsksmart/rif-marketplace-notifier": "0.0.1-dev.2", "@rsksmart/rif-marketplace-storage": "^0.1.0", - "@rsksmart/rif-ui": "^0.6.0", + "@rsksmart/rif-ui": "^0.6.1", "@rsksmart/rsk-utils": "^1.1.0", "big.js": "^6.0.2", "cids": "^1.0.2", "material-ui-dropzone": "^3.5.0", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-hook-form": "^6.15.1", "react-router-dom": "^5.2.0", "react-scripts": "^3.4.3", "socket.io-client": "^2.3.0", @@ -72,6 +74,7 @@ "@types/react-router-dom": "^5.1.6", "eslint": "^6.6.0", "eslint-config-airbnb": "^18.2.1", + "eslint-config-standard": "^16.0.2", "eslint-import-resolver-node": "^0.3.4", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsx-a11y": "^6.4.1", diff --git a/src/App.tsx b/src/App.tsx index 7c41fcf97..a24921596 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,6 +5,10 @@ import React, { FC } from 'react' import { AppContextProvider } from 'context/App' import Market from 'components/Market' import ErrorBoundary from 'components/error-boundary/ErrorBoundary' +import Big from 'big.js' + +// TODO: discuss about wrapping the library and export it with this change +Big.NE = -30 const App: FC = () => ( diff --git a/src/api/blockscout/index.ts b/src/api/blockscout/index.ts new file mode 100644 index 000000000..cd52a8bca --- /dev/null +++ b/src/api/blockscout/index.ts @@ -0,0 +1,30 @@ +import { ContractABIEvent, ContractABIItem } from 'api/blockscout/interface' +import { UIError } from 'models/UIMessage' + +const BLOCKSCOUT_API_ADDRESS = 'https://blockscout.com/rsk/mainnet/api?module=contract&action=getabi&address=' + +const getABIEvents = async (contract: string): Promise => { + const response = await fetch(`${BLOCKSCOUT_API_ADDRESS}${contract}`) + + if (response.status !== 200) { + throw new UIError({ + error: new Error(await response.json()), + text: 'could not get abi', + id: 'service-fetch', + }) + } + const { message, result } = await response.json() + + if (message !== 'OK') { + throw new UIError({ + error: new Error(message), + text: `Invalid contract address: ${contract}`, + id: 'service-fetch', + }) + } + const abiItems: ContractABIItem[] = JSON.parse(result) + return abiItems.filter((abiItem: ContractABIItem) => abiItem.type === 'event') + .map((item) => item as ContractABIEvent) +} + +export default getABIEvents diff --git a/src/api/blockscout/interface.ts b/src/api/blockscout/interface.ts new file mode 100644 index 000000000..0687569a8 --- /dev/null +++ b/src/api/blockscout/interface.ts @@ -0,0 +1,18 @@ +export type ContractABIEventParam = { + name: string + type: string + indexed?: boolean +} + +export type ContractABIItem = { + name: string + type: string + inputs?: Array + constant?: boolean + outputs?: any + payable?: boolean + stateMutability?: string + anonymous?: boolean +} + +export type ContractABIEvent = Pick diff --git a/src/api/models/apiService.ts b/src/api/models/apiService.ts index ebfc51b3c..06694d112 100644 --- a/src/api/models/apiService.ts +++ b/src/api/models/apiService.ts @@ -3,6 +3,7 @@ import { AuthenticationResult } from '@feathersjs/authentication' import { MarketFilterType } from 'models/Market' import createClient from 'api/client' import { ErrorReporterError } from 'context/App/errorReporter' +import Logger from 'utils/Logger' import { ServiceAddress } from './serviceAddresses' export type APIErrorId = 'service-connection' | 'service-event-attach' | 'service-fetch' | 'service-post' @@ -21,10 +22,9 @@ export type ServiceMetadata = Omit, 'data'> export const isServiceMetadata = ( metadata: ServiceMetadata | unknown, -): metadata is ServiceMetadata => metadata && ( - metadata as ServiceMetadata).total !== undefined +): metadata is ServiceMetadata => Boolean((metadata as ServiceMetadata)?.total) -type ConnectOptions = { +export type ConnectOptions = { client: ReturnType } export interface APIService { @@ -43,8 +43,7 @@ export interface APIService { export const isResultPaginated = ( result: Paginated | [], -): result is Paginated => (result as Paginated) - .data !== undefined +): result is Paginated => Boolean((result as Paginated)?.data) export abstract class AbstractAPIService implements Omit { private _client: Application @@ -55,7 +54,8 @@ export abstract class AbstractAPIService implements Omit { service!: Service - errorReporter!: ErrorReporter + errorReporter: ErrorReporter = ({ error, id }) => Logger.getInstance() + .error('Error reporter not implemented', id, error) _meta?: ServiceMetadata diff --git a/src/api/models/restAPIService.ts b/src/api/models/restAPIService.ts new file mode 100644 index 000000000..9e16721b5 --- /dev/null +++ b/src/api/models/restAPIService.ts @@ -0,0 +1,26 @@ +import { AbstractAPIService } from './apiService' + +export default abstract class AbstractRestAPIService extends AbstractAPIService { + abstract _create: (data: T, params?: S) => Promise + + create = async (data: T, params?: S): Promise => { + if (!this.service) { + this.errorReporter({ + id: 'service-connection', + text: 'Error while creating resource.', + error: new Error(`The ${this.path} service is not connected`), + }) + } + let response = {} + try { + response = await this._create(data, params) + } catch (error) { + this.errorReporter({ + id: 'service-fetch', + text: 'Error while creating resource.', + error, + }) + } + return response as R + } +} diff --git a/src/api/models/serviceAddresses.ts b/src/api/models/serviceAddresses.ts index c9038a3d1..1745deaf9 100644 --- a/src/api/models/serviceAddresses.ts +++ b/src/api/models/serviceAddresses.ts @@ -4,6 +4,7 @@ import { XRServiceAddress } from 'api/rif-marketplace-cache/rates/xr' import { StorageServiceAddress as StorageAddress } from 'api/rif-marketplace-cache/storage/interfaces' import { NotificationsAddress } from 'api/rif-marketplace-cache/notifications/interfaces' import { ServiceAddress as StorageUploadAddress } from 'api/rif-storage-upload-service/upload/interfaces' +import { NotifierServiceAddress } from 'api/rif-marketplace-cache/notifier' export type ServiceAddress = XRServiceAddress | ConfirmationAddress @@ -11,3 +12,4 @@ export type ServiceAddress = XRServiceAddress | StorageAddress | NotificationsAddress | StorageUploadAddress +| NotifierServiceAddress diff --git a/src/api/models/storage/OfferFiltersTransport.ts b/src/api/models/storage/OfferFiltersTransport.ts index c38c73c58..6c650a9a8 100644 --- a/src/api/models/storage/OfferFiltersTransport.ts +++ b/src/api/models/storage/OfferFiltersTransport.ts @@ -9,7 +9,7 @@ import { UNIT_PREFIX_POW2 } from 'utils/utils' export default class OfferFiltersTransport { averagePrice?: MinMaxFilter - totalCapacity?: MinMaxFilter + availableCapacity?: MinMaxFilter periods?: PeriodInSeconds[] @@ -40,11 +40,11 @@ export default class OfferFiltersTransport { : undefined this.averagePrice = price ? { - min: price.min - 1, - max: price.max + 1, + min: Math.floor(price.min), + max: Math.ceil(price.max), } : undefined - this.totalCapacity = sizeGB + this.availableCapacity = sizeGB ? { min: sizeGB.min * UNIT_PREFIX_POW2.KILO, max: sizeGB.max * UNIT_PREFIX_POW2.KILO, diff --git a/src/api/models/storage/__tests__/OfferFiltersTransport.test.ts b/src/api/models/storage/__tests__/OfferFiltersTransport.test.ts index 443946aa5..266da90a2 100644 --- a/src/api/models/storage/__tests__/OfferFiltersTransport.test.ts +++ b/src/api/models/storage/__tests__/OfferFiltersTransport.test.ts @@ -16,12 +16,12 @@ const EXPECTED_OBJECT: OfferFiltersTransport = { periods: Array.from(FAKE_FILTERS.periods as Set) .map((p) => PeriodInSeconds[p]), averagePrice: { - min: (FAKE_FILTERS.price?.min as number) - 1, - max: (FAKE_FILTERS.price?.max as number) + 1, + min: Math.floor(FAKE_FILTERS.price.min), + max: Math.ceil(FAKE_FILTERS.price.max), }, - totalCapacity: { - min: (FAKE_FILTERS.size?.min as number) * UNIT_PREFIX_POW2.KILO, - max: (FAKE_FILTERS.size?.max as number) * UNIT_PREFIX_POW2.KILO, + availableCapacity: { + min: FAKE_FILTERS.size.min * UNIT_PREFIX_POW2.KILO, + max: FAKE_FILTERS.size.max * UNIT_PREFIX_POW2.KILO, }, provider: FAKE_FILTERS.provider ? { $like: FAKE_FILTERS.provider } : undefined, diff --git a/src/api/models/storage/transports.ts b/src/api/models/storage/transports.ts index 714bd8546..19bc98db4 100644 --- a/src/api/models/storage/transports.ts +++ b/src/api/models/storage/transports.ts @@ -40,15 +40,3 @@ export type AgreementTransport = { tokenAddress: string expiresIn: string } - -export type StakeBalanceTransport = { - account: string - symbol: string - token: string - total: string -} - -export interface StakeTransport { - totalStakedFiat: string - stakes: StakeBalanceTransport[] -} diff --git a/src/api/rif-marketplace-cache/common/stakes.ts b/src/api/rif-marketplace-cache/common/stakes.ts new file mode 100644 index 000000000..3b20c2c52 --- /dev/null +++ b/src/api/rif-marketplace-cache/common/stakes.ts @@ -0,0 +1,42 @@ +import { SupportedTokenSymbol } from 'models/Token' +import { parseToBigDecimal } from 'utils/parsers' + +export type StakeBalanceTransport = { + account: string + symbol: string + token: string + total: string +} + +export interface StakeTransport { + totalStakedFiat: string + stakes: StakeBalanceTransport[] +} + +export type StakeFilters = { + account: string +} + +export type StakedBalances = Record + +export type Staked = { + stakedBalances: StakedBalances + totalStakedUSD: string +} + +export const mapStakesListFromTransport = ( + stakes, +): StakedBalances => stakes.reduce((acc, { symbol, total }) => { + acc[symbol] = parseToBigDecimal(total).toString() + return acc +}, {}) + +export const mapFromTransport = (stakeTransport: StakeTransport): Staked => { + const { totalStakedFiat: totalStakedUSD, stakes } = stakeTransport + const stakedBalances = mapStakesListFromTransport(stakes) + + return { + stakedBalances, + totalStakedUSD, + } +} diff --git a/src/api/rif-marketplace-cache/notifier/index.ts b/src/api/rif-marketplace-cache/notifier/index.ts new file mode 100644 index 000000000..2ea58ed76 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/index.ts @@ -0,0 +1,18 @@ +import { Address } from './interfaces' +import OffersService, { notifierOffersAddress } from './offers/index' +import StakesService, { notifierStakesAddress } from './stakes' +import SubscriptionService, { notifierSubscriptionsAddress } from './subscriptions' + +const notifierAddresses = [ + notifierOffersAddress, + notifierSubscriptionsAddress, + notifierStakesAddress, +] + +export type NotifierServiceAddress = Address +export { + OffersService as NotifierOffersService, + SubscriptionService as NotifierSubscriptionsService, + StakesService as NotifierStakesService, + notifierAddresses, +} diff --git a/src/api/rif-marketplace-cache/notifier/interfaces.ts b/src/api/rif-marketplace-cache/notifier/interfaces.ts new file mode 100644 index 000000000..6d3845158 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/interfaces.ts @@ -0,0 +1,24 @@ +import { APIService } from 'api/models/apiService' +import { NotifierFilters } from 'models/marketItems/NotifierFilters' +import { NotifierItem } from 'models/marketItems/NotifierItem' +import { NotifierOffersAddress, NotifierOffersWSChannel } from './offers' +import { NotifierProvidersAddress, NotifierProvidersWSChannel } from './providers' +import { NotifierStakesAddress, NotifierStakesWSChannel } from './stakes' +import { NotifierSubscriptionsAddress, NotifierSubscriptionsWSChannel } from './subscriptions' + +export type Address = + | NotifierOffersAddress + | NotifierSubscriptionsAddress + | NotifierStakesAddress + | NotifierProvidersAddress +export type WSChannel = + | NotifierOffersWSChannel + | NotifierSubscriptionsWSChannel + | NotifierStakesWSChannel + | NotifierProvidersWSChannel + +export interface NotifierCacheAPIService extends APIService { + path: Address + _channel: WSChannel + fetch: (filters?: NotifierFilters) => Promise +} diff --git a/src/api/rif-marketplace-cache/notifier/offers/__tests__/api.test.ts b/src/api/rif-marketplace-cache/notifier/offers/__tests__/api.test.ts new file mode 100644 index 000000000..8cb69ad60 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/offers/__tests__/api.test.ts @@ -0,0 +1,106 @@ +import { AbstractAPIService } from 'api/models/apiService' +import mockFeathersService from 'api/test-utils/feathers' +import { NotifierOfferItem } from 'models/marketItems/NotifierItem' +import { SYSTEM_SUPPORTED_SYMBOL } from 'models/Token' +import { NotifierOffersFilters } from 'models/marketItems/NotifierFilters' +import { SYSTEM_SUPPORTED_FIAT } from 'models/Fiat' +import { SupportedEventChannel } from 'config/notifier' +import OffersService, { notifierOffersAddress, NotifierOffersTransportModel, notifierOffersWSChannel } from '../index' +import { mapFromTransport } from '../api' +import { NotifierOffersService } from '../..' + +const MOCK_ITEM_0: NotifierOffersTransportModel = { + providerId: 'TEST_ID', + url: 'TEST_URL', + planStatus: 'ACTIVE', + channels: [ + { + type: 'MOCK_CHANNEL' as SupportedEventChannel, + origin: 'MOCK_ORIGIN', + }, + ], + daysLeft: 122, + id: 1, + name: 'test_plan_id', + quantity: 200, + prices: [ + { + id: 1, + rateId: SYSTEM_SUPPORTED_SYMBOL.rif, + rate: 3, + price: '0.1', + }, + ], + planId: 1, +} + +const MOCK_RESPONSE: NotifierOffersTransportModel[] = [MOCK_ITEM_0] + +let offersService: NotifierOffersService + +const filters: NotifierOffersFilters = { + price: { + min: 1, + max: 10, + fiatSymbol: SYSTEM_SUPPORTED_FIAT.usd, + }, + size: { min: 1, max: 10 }, +} + +describe('Notifier Offers Service', () => { + beforeEach(() => { + offersService = new OffersService() + }) + + describe('notifierOffersAddress', () => { + const expectedAddress = 'notifier/v0/offers' + test(`should be set to ${expectedAddress}`, () => { + expect(notifierOffersAddress).toBe(expectedAddress) + }) + }) + + describe('notifierOffersWSChannel', () => { + const expectedAddress = 'notifier_offers' + test(`should be set to ${expectedAddress}`, () => { + expect(notifierOffersWSChannel).toBe(expectedAddress) + }) + }) + + test('should be an instance of AbstractAPIService', () => { + expect(offersService).toBeInstanceOf(AbstractAPIService) + }) + + describe('path', () => { + test(`should be set to ${notifierOffersAddress}`, () => { + expect(offersService.path).toBe(notifierOffersAddress) + }) + }) + + describe('_channel', () => { + test(`should be set to ${notifierOffersWSChannel}`, () => { + expect(offersService._channel).toBe(notifierOffersWSChannel) + }) + }) + + describe('_fetch via super.fetch', () => { + beforeEach(() => { + offersService.service = mockFeathersService(MOCK_RESPONSE) + }) + + test('should call service find method', async () => { + const serviceFindSpy = jest.spyOn(offersService.service, 'find') + + await offersService.fetch(filters) + expect(serviceFindSpy).toBeCalled() + }) + + test('should return NotifierOfferItem[] on success', async () => { + const actualOffers: NotifierOfferItem[] = await offersService.fetch(filters) + + const expectedOffers: NotifierOfferItem[] = MOCK_RESPONSE + .map(mapFromTransport) + + expect(actualOffers).toStrictEqual(expectedOffers) + }) + }) +}) diff --git a/src/api/rif-marketplace-cache/notifier/offers/api.ts b/src/api/rif-marketplace-cache/notifier/offers/api.ts new file mode 100644 index 000000000..e5ef35fbd --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/offers/api.ts @@ -0,0 +1,89 @@ +import { Paginated } from '@feathersjs/feathers' +import { AbstractAPIService, isResultPaginated } from 'api/models/apiService' +import client from 'api/rif-marketplace-cache/client' +import { NotifierOfferItem } from 'models/marketItems/NotifierItem' +import { SupportedTokenSymbol } from 'models/Token' +import { getSupportedTokenByName } from 'utils/tokenUtils' +import { MinMaxFilter } from 'models/Filters' +import { SupportedFiatSymbol } from 'models/Fiat' +import { NotifierOffersFilters } from 'models/marketItems/NotifierFilters' +import { parseToBigDecimal } from 'utils/parsers' +import { NotifierCacheAPIService } from '../interfaces' +import NotifierFiltersTransport, { PlanDTO } from './models' + +export const address = 'notifier/v0/offers' as const +export type Address = typeof address + +export const wsChannel = 'notifier_offers' as const +export type WSChannel = typeof wsChannel + +export const mapFromTransport = ({ + providerId: provider, + channels, + daysLeft, + id, + planId, + planStatus, + name, + prices, + quantity, + url, +}: PlanDTO): NotifierOfferItem => ({ + id: String(id), + planId, + planStatus, + name, + provider: provider.toLocaleLowerCase(), + url, + channels: channels.map(({ type: channelType, origin }) => ({ + type: channelType, + origin, + })), + limit: quantity, + priceOptions: prices.map((price) => ({ + token: getSupportedTokenByName( + price.rateId as SupportedTokenSymbol, + ), + value: parseToBigDecimal(price.price), + })), + daysLeft, +}) + +class OffersService extends AbstractAPIService + implements NotifierCacheAPIService { + path = address + + constructor() { + super(client) + } + + _channel = wsChannel + + _fetch = async ( + filters: NotifierOffersFilters, + ): Promise => { + const query = filters && new NotifierFiltersTransport(filters) + const result: Paginated = await this.service.find({ query }) + + const { data, ...metadata } = isResultPaginated(result) + ? result : { data: result } + this.meta = metadata + + return data.map(mapFromTransport) + } + + findLimits({ fiatSymbol }: { + fiatSymbol: SupportedFiatSymbol + }): Promise { + return this.service.find({ + query: { + limits: { + price: { fiatSymbol }, + size: true, + }, + }, + }) + } +} + +export default OffersService diff --git a/src/api/rif-marketplace-cache/notifier/offers/index.ts b/src/api/rif-marketplace-cache/notifier/offers/index.ts new file mode 100644 index 000000000..6e7417536 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/offers/index.ts @@ -0,0 +1,16 @@ +import { PlanDTO } from './models' +import OffersService, { + address, Address, + wsChannel, WSChannel, +} from './api' + +export { + address as notifierOffersAddress, + wsChannel as notifierOffersWSChannel, +} + +export default OffersService + +export type NotifierOffersAddress = Address +export type NotifierOffersWSChannel = WSChannel +export type NotifierOffersTransportModel = PlanDTO diff --git a/src/api/rif-marketplace-cache/notifier/offers/models.ts b/src/api/rif-marketplace-cache/notifier/offers/models.ts new file mode 100644 index 000000000..2d51f3262 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/offers/models.ts @@ -0,0 +1,67 @@ +import { SupportedEventChannel } from 'config/notifier' +import { SupportedFiatSymbol } from 'models/Fiat' +import { MinMaxFilter } from 'models/Filters' +import { NotifierOffersFilters } from 'models/marketItems/NotifierFilters' +import { SupportedTokenSymbol } from 'models/Token' + +type PricesDTO = { + id: number + price: string + rateId: string + rate: number + } + +export type ChannelDTO = { + type: SupportedEventChannel + origin: string + } + +export const PLAN_STATUS = { + ACTIVE: 'ACTIVE', + INACTIVE: 'INACTIVE', +} as const + +export type PlanStatus = keyof typeof PLAN_STATUS + +export type PlanDTO = { + id: number + planId: number + name: string + planStatus: PlanStatus + daysLeft: number + quantity: number + providerId: string + url: string + channels: ChannelDTO[] + prices: PricesDTO[] +} + +export default class NotifierFiltersTransport { + size!: MinMaxFilter + + price!: MinMaxFilter & { + fiatSymbol: SupportedFiatSymbol + } + + currency?: Array + + channels?: Array + + provider?: string + + constructor({ + size, + price, + currency, + provider, + }: NotifierOffersFilters) { + this.size = size + this.provider = provider + this.price = price && { + min: Math.floor(price.min), + max: Math.ceil(price.max), + fiatSymbol: price.fiatSymbol, + } + this.currency = currency && Array.from(currency) + } +} diff --git a/src/api/rif-marketplace-cache/notifier/providers/api.ts b/src/api/rif-marketplace-cache/notifier/providers/api.ts new file mode 100644 index 000000000..e7edd48d7 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/providers/api.ts @@ -0,0 +1,51 @@ +import { AbstractAPIService } from 'api/models/apiService' +import client from 'api/rif-marketplace-cache/client' +import { NotifierProvidersFilters } from 'models/marketItems/NotifierFilters' +import { Provider } from 'models/marketItems/NotifierItem' +import { NotifierCacheAPIService } from '../interfaces' +import { ProviderDTO } from '../subscriptions/models' + +export const address = 'notifier/v0/providers' as const +export type Address = typeof address + +export const wsChannel = 'notifier_providers' as const +export type WSChannel = typeof wsChannel + +export const mapFromTransport = ({ + provider, + url, +}: ProviderDTO): Provider => ({ + provider, + url, +}) + +class ProvidersService extends AbstractAPIService + implements NotifierCacheAPIService { + path = address + + _channel = wsChannel + + constructor() { + super(client) + } + + _fetch = async ( + filters: NotifierProvidersFilters, + ): Promise => { + const data = await this.service.find({ + query: filters && { + ...filters, + }, + }) + + return data.map(mapFromTransport) + } + + isRegisteredURL = async (url: string): Promise => { + const { length: hasResult } = await this.fetch({ url }) + + return hasResult + } +} + +export default ProvidersService diff --git a/src/api/rif-marketplace-cache/notifier/providers/index.ts b/src/api/rif-marketplace-cache/notifier/providers/index.ts new file mode 100644 index 000000000..e68eea863 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/providers/index.ts @@ -0,0 +1,14 @@ +import ProvidersService, { + address, Address, + wsChannel, WSChannel, +} from './api' + +export { + address as notifierProvidersAddress, + wsChannel as notifierProvidersChannel, +} + +export default ProvidersService + +export type NotifierProvidersAddress = Address +export type NotifierProvidersWSChannel = WSChannel diff --git a/src/api/rif-marketplace-cache/notifier/stakes/api.ts b/src/api/rif-marketplace-cache/notifier/stakes/api.ts new file mode 100644 index 000000000..c68b31288 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/stakes/api.ts @@ -0,0 +1,29 @@ +import { AbstractAPIService } from 'api/models/apiService' +import client from 'api/rif-marketplace-cache/client' +import { mapFromTransport, Staked, StakeFilters } from 'api/rif-marketplace-cache/common/stakes' +import { NotifierCacheAPIService } from '../interfaces' + +export const address = 'notifier/v0/stakes' as const +export type Address = typeof address + +export const wsChannel = 'notifier_stakes' as const +export type WSChannel = typeof wsChannel + +class StakesService extends AbstractAPIService + implements NotifierCacheAPIService { + path = address + + constructor() { + super(client) + } + + _channel = wsChannel + + _fetch = async (filters: StakeFilters): Promise => { + const { account } = filters + const result = await this.service.get(account) + return mapFromTransport(result) + } +} + +export default StakesService diff --git a/src/api/rif-marketplace-cache/notifier/stakes/index.ts b/src/api/rif-marketplace-cache/notifier/stakes/index.ts new file mode 100644 index 000000000..59393274c --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/stakes/index.ts @@ -0,0 +1,14 @@ +import StakesService, { + address, Address, + wsChannel, WSChannel, +} from './api' + +export { + address as notifierStakesAddress, + wsChannel as notifierStakesWSChannel, +} + +export default StakesService + +export type NotifierStakesAddress = Address +export type NotifierStakesWSChannel = WSChannel diff --git a/src/api/rif-marketplace-cache/notifier/subscriptions/__tests__/api.test.ts b/src/api/rif-marketplace-cache/notifier/subscriptions/__tests__/api.test.ts new file mode 100644 index 000000000..3f81f738d --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/subscriptions/__tests__/api.test.ts @@ -0,0 +1,120 @@ +import { AbstractAPIService } from 'api/models/apiService' +import mockFeathersService from 'api/test-utils/feathers' +import { NotifierSubscriptionItem } from 'models/marketItems/NotifierItem' +import { NotifierSubscriptionsService } from '../..' +import { mapFromTransport } from '../api' +import SubscriptionsService, { notifierSubscriptionsAddress, NotifierSubscriptionsTransportModel, notifierSubscriptionsWSChannel } from '../index' + +const MOCK_ITEM_0: NotifierSubscriptionsTransportModel = { + providerId: 'TEST_PROVIDER_ADDR', + consumer: 'TEST_CONSUMER_ADDR', + hash: 'TEST_HASH', + expirationDate: new Date(), + previousSubscription: 'IS THIS ADDRESS OR SHOULD IT BE TYPE NUMNER AS IN SUBSCRIPTION_ID?', + status: 'ACTIVE', + subscriptionId: 1, + plan: { + id: 1, + planId: 1, + channels: [{ type: 'API', origin: 'mock.origin' }], + daysLeft: 100, + name: '1k', + planStatus: 'ACTIVE', + prices: [ + { + id: 1, + price: '2', + rateId: 'rif', + rate: 1, + }, + ], + providerId: '0xTEST', + quantity: 10, + url: 'nada', + }, + topics: [ + { + notificationPreferences: [ + { + notificationService: 'API', + destination: 'none', + }, + ], + topicParams: [], + type: 'NEW_BLOCK', + }, + ], + notificationBalance: 2, + paid: false, + price: '2'.padEnd(18, '0'), + rateId: 'rif', + provider: { + provider: 'TEST_PROVIDER_ADDR', + url: 'nada', + }, + withdrawableFunds: '2'.padEnd(18, '0'), + signature: '', +} + +const MOCK_RESPONSE: NotifierSubscriptionsTransportModel[] = [MOCK_ITEM_0] + +let subscriptionsService: NotifierSubscriptionsService + +describe('Notifier Subscriptions Service', () => { + beforeEach(() => { + subscriptionsService = new SubscriptionsService() + }) + + describe('notifierSubscriptionsAddress', () => { + const expectedAddress = 'notifier/v0/subscriptions' + test(`should be set to ${expectedAddress}`, () => { + expect(notifierSubscriptionsAddress).toBe(expectedAddress) + }) + }) + + describe('notifierSubscriptionsWSChannel', () => { + const expectedAddress = 'notifier_subscriptions' + test(`should be set to ${expectedAddress}`, () => { + expect(notifierSubscriptionsWSChannel).toBe(expectedAddress) + }) + }) + + test('should be an instance of AbstractAPIService', () => { + expect(subscriptionsService).toBeInstanceOf(AbstractAPIService) + }) + + describe('path', () => { + test(`should be set to ${notifierSubscriptionsAddress}`, () => { + expect(subscriptionsService.path).toBe(notifierSubscriptionsAddress) + }) + }) + + describe('_channel', () => { + test(`should be set to ${notifierSubscriptionsWSChannel}`, () => { + expect(subscriptionsService._channel).toBe(notifierSubscriptionsWSChannel) + }) + }) + + describe('_fetch via super.fetch', () => { + beforeEach(() => { + subscriptionsService.service = mockFeathersService(MOCK_RESPONSE) + }) + + test('should call service find method', async () => { + const serviceFindSpy = jest.spyOn(subscriptionsService.service, 'find') + + await subscriptionsService.fetch() + expect(serviceFindSpy).toBeCalled() + }) + + test('should return NotifierSubscriptionItem[] on success', async () => { + const actualSubscriptions: NotifierSubscriptionItem[] = await subscriptionsService + .fetch() + + const expectedSubscriptions: NotifierSubscriptionItem[] = MOCK_RESPONSE + .map(mapFromTransport) + + expect(actualSubscriptions).toStrictEqual(expectedSubscriptions) + }) + }) +}) diff --git a/src/api/rif-marketplace-cache/notifier/subscriptions/api.ts b/src/api/rif-marketplace-cache/notifier/subscriptions/api.ts new file mode 100644 index 000000000..4ddb506e5 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/subscriptions/api.ts @@ -0,0 +1,81 @@ +import { Paginated } from '@feathersjs/feathers' +import { AbstractAPIService, isResultPaginated } from 'api/models/apiService' +import client from 'api/rif-marketplace-cache/client' +import { SupportedFiatSymbol } from 'models/Fiat' +import { MinMaxFilter } from 'models/Filters' +import { NotifierSubscriptionsFilters } from 'models/marketItems/NotifierFilters' +import { NotifierSubscriptionItem } from 'models/marketItems/NotifierItem' +import { SupportedTokenSymbol } from 'models/Token' +import { parseToBigDecimal } from 'utils/parsers' +import { getSupportedTokenByName } from 'utils/tokenUtils' +import { NotifierCacheAPIService } from '../interfaces' +import { SubscriptionDTO } from './models' + +export const address = 'notifier/v0/subscriptions' as const +export type Address = typeof address + +export const wsChannel = 'notifier_subscriptions' as const +export type WSChannel = typeof wsChannel + +export const mapFromTransport = ({ + hash, + expirationDate, + price, + rateId, + provider, + providerId, + topics, + withdrawableFunds, + ...subscription +}: SubscriptionDTO): NotifierSubscriptionItem => ({ + id: hash, + expirationDate: new Date(expirationDate), + price: parseToBigDecimal(price), + token: getSupportedTokenByName(rateId as SupportedTokenSymbol), + provider: { url: provider.url, provider: providerId }, + events: topics, + withdrawableFunds: parseToBigDecimal(withdrawableFunds), + ...subscription, +}) + +class SubscriptionsService extends AbstractAPIService + implements NotifierCacheAPIService { + path = address + + constructor() { + super(client) + } + + _channel = wsChannel + + _fetch = async ( + filters: NotifierSubscriptionsFilters, + ): Promise => { + const result: Paginated = await this.service.find({ + query: filters && { + ...filters, + }, + }) + + const { data, ...metadata } = isResultPaginated(result) + ? result : { data: result } + this.meta = metadata + + return data.map(mapFromTransport) + } + + findLimits({ fiatSymbol }: { + fiatSymbol: SupportedFiatSymbol + }): Promise { + return this.service.find({ + query: { + limits: { + price: { fiatSymbol }, + size: true, + }, + }, + }) + } +} + +export default SubscriptionsService diff --git a/src/api/rif-marketplace-cache/notifier/subscriptions/index.ts b/src/api/rif-marketplace-cache/notifier/subscriptions/index.ts new file mode 100644 index 000000000..3edab7cec --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/subscriptions/index.ts @@ -0,0 +1,16 @@ +import { SubscriptionDTO } from './models' +import SubscriptionsService, { + address, Address, + wsChannel, WSChannel, +} from './api' + +export { + address as notifierSubscriptionsAddress, + wsChannel as notifierSubscriptionsWSChannel, +} + +export default SubscriptionsService + +export type NotifierSubscriptionsAddress = Address +export type NotifierSubscriptionsWSChannel = WSChannel +export type NotifierSubscriptionsTransportModel = SubscriptionDTO diff --git a/src/api/rif-marketplace-cache/notifier/subscriptions/models.ts b/src/api/rif-marketplace-cache/notifier/subscriptions/models.ts new file mode 100644 index 000000000..7d3461bf3 --- /dev/null +++ b/src/api/rif-marketplace-cache/notifier/subscriptions/models.ts @@ -0,0 +1,81 @@ +import { PlanDTO } from '../offers/models' + +export const EVENT_TYPES = { + NEW_BLOCK: 'NEW_BLOCK', + NEW_TRANSACTIONS: 'NEW_TRANSACTIONS', + PENDING_TRANSACTIONS: 'PENDING_TRANSACTIONS', + CONTRACT_EVENT: 'CONTRACT_EVENT', +} as const + +export type SubscriptionEventType = keyof typeof EVENT_TYPES + +export const EVENT_PARAM_TYPES = { + EVENT_PARAM: 'EVENT_PARAM', + EVENT_NAME: 'EVENT_NAME', + CONTRACT_ADDRESS: 'CONTRACT_ADDRESS', +} as const + +export type TopicParamType = keyof typeof EVENT_PARAM_TYPES + +export type TopicParams = { + type: TopicParamType + value: string + valueType?: string + indexed?: boolean + order?: number + filter?: string +} + +export const SUBSCRIPTION_STATUS = { + ACTIVE: 'ACTIVE', + PENDING: 'PENDING', + EXPIRED: 'EXPIRED', + COMPLETED: 'COMPLETED', +} as const + +export type SubscriptionStatus = keyof typeof SUBSCRIPTION_STATUS + +export type ProviderDTO = { + url: string + provider: string +} +export const TOPIC_TYPES = { + NEW_BLOCK: 'NEW_BLOCK', + NEW_TRANSACTIONS: 'NEW_TRANSACTIONS', + PENDING_TRANSACTIONS: 'PENDING_TRANSACTIONS', + CONTRACT_EVENT: 'CONTRACT_EVENT', +} as const + +export type TopicType = keyof typeof TOPIC_TYPES + +export const NOTIFICATION_SVC_TYPES = { + API: 'API', + SMS: 'SMS', + EMAIL: 'EMAIL', +} as const +export type NotificationServiceType = keyof typeof NOTIFICATION_SVC_TYPES + +export type TopicDTO = { + notificationPreferences: Array + type: TopicType + topicParams?: Array +} + +export type SubscriptionDTO = { + hash: string + subscriptionId: number + status: SubscriptionStatus + plan: PlanDTO + notificationBalance: number + previousSubscription: string + expirationDate: Date + consumer: string + topics: Array + paid: boolean + price: string + rateId: string + providerId: string + provider: ProviderDTO + signature: string + withdrawableFunds: string +} diff --git a/src/api/rif-marketplace-cache/rns/common.ts b/src/api/rif-marketplace-cache/rns/common.ts index 6ba21058e..fded2230b 100644 --- a/src/api/rif-marketplace-cache/rns/common.ts +++ b/src/api/rif-marketplace-cache/rns/common.ts @@ -36,16 +36,12 @@ export type RnsAPIService = Modify< } > -export const isSupportedRNSToken = ( - token: string, -): boolean => rnsSupportedTokens.some((t: string) => t === token) - // - Supported Token Address-to-token records export const rnsTokenAddrTokenRecord: Record = allTokenAddresses .reduce((acc, addr) => { const symbol = addressTokenRecord[addr] - if (!isSupportedRNSToken(symbol)) return acc + if (!rnsSupportedTokens.includes(symbol)) return acc acc[addr] = getTokenByString(symbol) return acc }, {}) diff --git a/src/api/rif-marketplace-cache/rns/domains.ts b/src/api/rif-marketplace-cache/rns/domains.ts index 782533427..4512973b3 100644 --- a/src/api/rif-marketplace-cache/rns/domains.ts +++ b/src/api/rif-marketplace-cache/rns/domains.ts @@ -20,7 +20,7 @@ const mapFromTransport = (item: DomainTransport): RnsDomain => { } = item const domain: RnsDomain = { id: tokenId, - expirationDate: new Date(expiration.date), + expirationDate: new Date(expiration?.date), ownerAddress: owner.address, name, tokenId, diff --git a/src/api/rif-marketplace-cache/rns/offers.ts b/src/api/rif-marketplace-cache/rns/offers.ts index b78c4e786..64c64f20b 100644 --- a/src/api/rif-marketplace-cache/rns/offers.ts +++ b/src/api/rif-marketplace-cache/rns/offers.ts @@ -20,7 +20,7 @@ const mapFromTransport = ({ priceFiat, priceString, domain: { - expiration: { date }, + expiration, name: domainName, }, offerId, @@ -33,7 +33,7 @@ const mapFromTransport = ({ ownerAddress, domainName, price: parseToBigDecimal(priceString, 18), - expirationDate: new Date(date), + expirationDate: new Date(expiration?.date), paymentToken: getTokenByAddress(paymentToken), tokenId, }) diff --git a/src/api/rif-marketplace-cache/storage/interfaces.ts b/src/api/rif-marketplace-cache/storage/interfaces.ts index 0ce2ccf44..e9816447d 100644 --- a/src/api/rif-marketplace-cache/storage/interfaces.ts +++ b/src/api/rif-marketplace-cache/storage/interfaces.ts @@ -3,22 +3,23 @@ import { APIService } from 'api/models/apiService' import { StorageOffersFilters } from 'models/marketItems/StorageFilters' import { StorageItem } from 'models/marketItems/StorageItem' import { offersAddress, OffersAddress } from './offers' -import { stakesAddress, StakesAddress } from './stakes' +import { storageStakesAddress, StorageStakesAddress } from './stakes' import { avgBillingPlanAddress, AvgBillingPlanAddress } from './avg-billing-plan-price' import { agreementsAddress, AgreementsAddress } from './agreements' import { availableCapacityAddress, AvailableCapacityAddress } from './available-size' +import { StakeFilters } from '../common/stakes' export type StorageServiceAddress = | OffersAddress | AvgBillingPlanAddress - | StakesAddress + | StorageStakesAddress | AgreementsAddress | AvailableCapacityAddress export const storageAddresses = [ offersAddress, avgBillingPlanAddress, - stakesAddress, + storageStakesAddress, agreementsAddress, availableCapacityAddress, ] @@ -34,10 +35,6 @@ export type StorageAPIService = Modify< } > -export type StakeFilters = { - account: string -} - export type StakeAPIService = Modify< APIService, { diff --git a/src/api/rif-marketplace-cache/storage/offers.ts b/src/api/rif-marketplace-cache/storage/offers.ts index 0287187e8..f2aa709d5 100644 --- a/src/api/rif-marketplace-cache/storage/offers.ts +++ b/src/api/rif-marketplace-cache/storage/offers.ts @@ -2,13 +2,11 @@ import { Paginated } from '@feathersjs/feathers' import { AbstractAPIService, isResultPaginated } from 'api/models/apiService' import OfferFiltersTransport from 'api/models/storage/OfferFiltersTransport' import { OfferTransport } from 'api/models/storage/transports' -import { MinMaxFilter } from 'models/Filters' import { StorageOffersFilters } from 'models/marketItems/StorageFilters' import { StorageItem, StorageOffer } from 'models/marketItems/StorageItem' -import { UNIT_PREFIX_POW2 } from 'utils/utils' import client from '../client' import { StorageAPIService, StorageWSChannel } from './interfaces' -import { mapOfferFromTransport, MinMax } from './utils' +import { mapOfferFromTransport } from './utils' export const offersAddress = 'storage/v0/offers' as const export type OffersAddress = typeof offersAddress @@ -41,45 +39,4 @@ export class StorageOffersService extends AbstractAPIService return data.map(this.mapFromTransport) } - - fetchSizeLimits = async (): Promise => { - const minMB = await this.fetchMinMaxLimit( - this.service, - MinMax.min, - 'totalCapacity', - ) - const maxMB = await this.fetchMinMaxLimit( - this.service, - MinMax.max, - 'totalCapacity', - ) - return { - min: minMB / UNIT_PREFIX_POW2.KILO, - max: maxMB / UNIT_PREFIX_POW2.KILO, - } - } - - private fetchMinMaxLimit = async ( - service, - minMax: MinMax, - filedName: string, - options?: { - selectField?: string - }, - ): Promise => { - const select = options?.selectField || filedName - const query = { - $limit: 1, - $sort: { - [filedName]: minMax, - }, - $select: [select], - } - const result = await service.find({ query }) - - return result.reduce((_, item): number => { - const round = minMax === MinMax.min ? Math.floor : Math.ceil - return round(parseFloat(item[select])) - }, 0) - } } diff --git a/src/api/rif-marketplace-cache/storage/stakes.ts b/src/api/rif-marketplace-cache/storage/stakes.ts index 0b09d7043..0e0a6146c 100644 --- a/src/api/rif-marketplace-cache/storage/stakes.ts +++ b/src/api/rif-marketplace-cache/storage/stakes.ts @@ -1,45 +1,18 @@ import { AbstractAPIService } from 'api/models/apiService' -import { StakeTransport } from 'api/models/storage/transports' -import { parseToBigDecimal } from 'utils/parsers' -import { SupportedTokenSymbol } from 'models/Token' import { StakeAPIService, - StakeFilters, StorageWSChannel, } from './interfaces' import client from '../client' +import { mapFromTransport, Staked, StakeFilters } from '../common/stakes' -export const stakesAddress = 'storage/v0/stakes' as const -export type StakesAddress = typeof stakesAddress +export const storageStakesAddress = 'storage/v0/stakes' as const +export type StorageStakesAddress = typeof storageStakesAddress export const stakesWSChannel: StorageWSChannel = 'stakes' -export type StakedBalances = Record - -export type Staked = { - stakedBalances: StakedBalances - totalStakedUSD: string -} - -export const mapStakesListFromTransport = ( - stakes, -): StakedBalances => stakes.reduce((acc, { symbol, total }) => { - acc[symbol] = parseToBigDecimal(total, 18).toString() - return acc -}, {}) - -export const mapFromTransport = (stakeTransport: StakeTransport): Staked => { - const { totalStakedFiat: totalStakedUSD, stakes } = stakeTransport - const stakedBalances = mapStakesListFromTransport(stakes) - - return { - stakedBalances, - totalStakedUSD, - } -} - export class StakesService extends AbstractAPIService implements StakeAPIService { - path = stakesAddress + path = storageStakesAddress constructor() { super(client) } diff --git a/src/api/rif-notifier-service/interfaces.ts b/src/api/rif-notifier-service/interfaces.ts new file mode 100644 index 000000000..b6616f095 --- /dev/null +++ b/src/api/rif-notifier-service/interfaces.ts @@ -0,0 +1,28 @@ +import { createRestClient } from 'api/client' +import AbstractRestAPIService from 'api/models/restAPIService' +import { NOTIFIER_RESPONSE_STATUSES, NotifierResponseStatus } from 'api/rif-notifier-service/models/response' + +export type NotifierResponse = { + content: T + message: string + status: NotifierResponseStatus +} +export type ServiceAddress = string +export abstract class NotifierAPIService extends AbstractRestAPIService { + path: ServiceAddress + + constructor(url: string) { + super(createRestClient(url)) + this.path = url + } + + fetch = (): Promise> => this._fetch() + .catch((error) => { + this.errorReporter({ + error, + text: 'Error fetching data from notifier', + id: 'service-fetch', + }) + return { content: [], message: NOTIFIER_RESPONSE_STATUSES.ERROR } + }) +} diff --git a/src/api/rif-notifier-service/models/response.ts b/src/api/rif-notifier-service/models/response.ts new file mode 100644 index 000000000..acc08163b --- /dev/null +++ b/src/api/rif-notifier-service/models/response.ts @@ -0,0 +1,7 @@ +export const NOTIFIER_RESPONSE_STATUSES = { + OK: 'OK', + ERROR: 'ERROR', + CONFLICT: 'CONFLICT', +} as const + +export type NotifierResponseStatus = keyof typeof NOTIFIER_RESPONSE_STATUSES diff --git a/src/api/rif-notifier-service/models/subscriptionPlan.ts b/src/api/rif-notifier-service/models/subscriptionPlan.ts new file mode 100644 index 000000000..1908c3eec --- /dev/null +++ b/src/api/rif-notifier-service/models/subscriptionPlan.ts @@ -0,0 +1,27 @@ +import { NotifierResponse } from 'api/rif-notifier-service/interfaces' + +export type PlanStatusDTO = + | 'ACTIVE' + +export type PlanPriceDTO = { + price: string + currency: { + name: string + address: { + value: string + typeAsString: string + } + } +} + +export type SubscriptionPlanDTO = { + id: number + name: string + validity: number + planStatus: PlanStatusDTO + notificationPreferences: string[] + notificationQuantity: number + subscriptionPriceList: PlanPriceDTO[] +} + +export type SubscriptionPlanResponse = NotifierResponse> diff --git a/src/api/rif-notifier-service/models/subscriptions.ts b/src/api/rif-notifier-service/models/subscriptions.ts new file mode 100644 index 000000000..a8f6d8c96 --- /dev/null +++ b/src/api/rif-notifier-service/models/subscriptions.ts @@ -0,0 +1,104 @@ +export const TOPIC_TYPES = { + NEW_BLOCK: 'NEW_BLOCK', + NEW_TRANSACTIONS: 'NEW_TRANSACTIONS', + PENDING_TRANSACTIONS: 'PENDING_TRANSACTIONS', + CONTRACT_EVENT: 'CONTRACT_EVENT', +} as const + +export type TopicType = keyof typeof TOPIC_TYPES + +export const TOPIC_PARAM_TYPES = { + EVENT_PARAM: 'EVENT_PARAM', + EVENT_NAME: 'EVENT_NAME', + CONTRACT_ADDRESS: 'CONTRACT_ADDRESS', +} as const +export type TopicParamType = keyof typeof TOPIC_PARAM_TYPES + +export type TopicParams = { + type: TopicParamType + value: string + valueType?: string + indexed?: boolean + order?: number + filter?: string +} + +export const NOTIFICATION_SVC_TYPES = { + API: 'API', + SMS: 'SMS', + EMAIL: 'EMAIL', +} as const +export type NotificationServiceType = keyof typeof NOTIFICATION_SVC_TYPES + +export type DestinationParams = { + username: string + password: string + apiKey: string +} + +export type NotificationPreference = { + notificationService: NotificationServiceType + destination: string + destinationParams?: DestinationParams +} + +export type TopicDTO = { + notificationPreferences: Array + type: TopicType + topicParams?: Array +} + +export const SUBSCRIPTION_STATUSES = { + PENDING: 'PENDING', + ACTIVE: 'ACTIVE', + EXPIRED: 'EXPIRED', + COMPLETED: 'COMPLETED', +} as const + +export type SubscriptionStatus = keyof typeof SUBSCRIPTION_STATUSES + +export type CurrencyDTO = { + name: string + address: string +} + +export type SubscriptionPayment = { + amount: string + subscription: SubscriptionDTO + status: string + currency: CurrencyDTO +} + +export type SubscriptionDTO = { + id: number + hash: string + apiKey: string + activeSince: Date + notificationBalance: number + status: SubscriptionStatus + expirationDate: Date + paid: boolean + subscriptionPayments: Array + subscriptionPlanId: number + price: BigInteger + currency: CurrencyDTO + topics: Array + userAddress: string + providerAddress: string + previousSubscription: SubscriptionDTO + signature: string +} + +export type SubscribeToPlanDTO = { + userAddress: string + price: string + currency: string + subscriptionPlanId: number + topics?: TopicDTO[] +} + +export type SubscribeToPlanResponseDTO = { + hash: string + signature: string + subscription: SubscriptionDTO +} diff --git a/src/api/rif-notifier-service/renewSubscription.ts b/src/api/rif-notifier-service/renewSubscription.ts new file mode 100644 index 000000000..5d6d98b44 --- /dev/null +++ b/src/api/rif-notifier-service/renewSubscription.ts @@ -0,0 +1,43 @@ +import { logNotImplemented } from 'utils/utils' +import { NotifierAPIService, NotifierResponse } from './interfaces' +import { NOTIFIER_RESPONSE_STATUSES } from './models/response' +import { SubscribeToPlanDTO, SubscribeToPlanResponseDTO } from './models/subscriptions' + +type SubscribeToPlanResponse = NotifierResponse + +export const address = 'renewSubscription' as const +export default class RenewSubscriptionService + extends NotifierAPIService { + path = address + + _fetch = (): Promise => Promise.resolve(logNotImplemented('find')()) + + _create = + ( + subscriptionData: SubscribeToPlanDTO, + query, + ): + Promise => this.service.create(subscriptionData, query) + + renewSubscription = async ( + subscriptionData: SubscribeToPlanDTO, + previousSubscriptionHash: string, + ): + Promise => { + const query = { previousSubscriptionHash } + + const response: SubscribeToPlanResponse = await this.create( + subscriptionData, { query }, + ) + const { status, content } = response + + if (status !== NOTIFIER_RESPONSE_STATUSES.OK) { + this.errorReporter({ + error: new Error('Subscription Renew Error'), + text: 'Error renewing subscription', + id: 'service-post', + }) + } + return content + } +} diff --git a/src/api/rif-notifier-service/subscriptionBatch.ts b/src/api/rif-notifier-service/subscriptionBatch.ts new file mode 100644 index 000000000..570d0e7ee --- /dev/null +++ b/src/api/rif-notifier-service/subscriptionBatch.ts @@ -0,0 +1,34 @@ +import { NotifierAPIService, NotifierResponse } from './interfaces' +import { NOTIFIER_RESPONSE_STATUSES } from './models/response' +import { SubscribeToPlanDTO, SubscribeToPlanResponseDTO } from './models/subscriptions' + +type SubscribeToPlanResponse = NotifierResponse + +export const address = 'subscribeToPlan' as const +export default class SubscribeToPlanService + extends NotifierAPIService { + path = address + + _fetch = (): Promise => this.service.find() + + _create = + + (subscriptionData: SubscribeToPlanDTO): + Promise => this.service.create(subscriptionData) + + subscribeToPlan = + async (subscriptionData: SubscribeToPlanDTO): + Promise => { + const response: SubscribeToPlanResponse = await this.create(subscriptionData) + const { status, content } = response + + if (status !== NOTIFIER_RESPONSE_STATUSES.OK) { + this.errorReporter({ + error: new Error('Subscription Creation Error'), + text: 'Error Creating new subscription', + id: 'service-fetch', + }) + } + return content + } +} diff --git a/src/api/rif-notifier-service/subscriptionPlans.ts b/src/api/rif-notifier-service/subscriptionPlans.ts new file mode 100644 index 000000000..f9be256fa --- /dev/null +++ b/src/api/rif-notifier-service/subscriptionPlans.ts @@ -0,0 +1,29 @@ +import { SubscriptionPlanDTO, SubscriptionPlanResponse } from 'api/rif-notifier-service/models/subscriptionPlan' +import { NOTIFIER_RESPONSE_STATUSES } from 'api/rif-notifier-service/models/response' +import { logNotImplemented } from 'utils/utils' +import { NotifierAPIService } from './interfaces' + +export const address = 'getSubscriptionPlans?activePlansOnly=true' as const +export type Address = typeof address + +export default class SubscriptionPlans + extends NotifierAPIService { + path = address + + _fetch = (): Promise => this.service.find() + + getActivePlans = async (): Promise> => { + const { status, content }: SubscriptionPlanResponse = await this.fetch() + + if (status === NOTIFIER_RESPONSE_STATUSES.OK) return content + + this.errorReporter({ + id: 'service-fetch', + text: 'Wrong response from notifier provider', + error: new Error(`Wrong response from notifier provider ${JSON.stringify(content)}`), + }) + return [] + } + + _create = (): Promise => Promise.resolve(logNotImplemented('Subscription Plans')()) +} diff --git a/src/api/rif-notifier-service/subscriptionService.ts b/src/api/rif-notifier-service/subscriptionService.ts new file mode 100644 index 000000000..00b75d28d --- /dev/null +++ b/src/api/rif-notifier-service/subscriptionService.ts @@ -0,0 +1,70 @@ +import { logNotImplemented } from 'utils/utils' +import { NotifierAPIService, NotifierResponse } from './interfaces' +import { NOTIFIER_RESPONSE_STATUSES } from './models/response' +import { SubscriptionDTO } from './models/subscriptions' + +type SubscriptionResponse = NotifierResponse> + +export type SubscriptionSummary = Pick + +export const address = 'getSubscriptions' as const +export default class SubscriptionService + extends NotifierAPIService { + path = address + + _fetch = (filters: any): Promise => this.service.find(filters) + + _create = (): Promise => Promise.resolve(logNotImplemented('Create Subscription')()) + + getUserSubscriptions = + async (user: string): + Promise> => { + const response: SubscriptionResponse = await this._fetch({ headers: { userAddress: user } }) + const { status, content } = response + + if (status !== NOTIFIER_RESPONSE_STATUSES.OK) { + this.errorReporter({ + error: new Error('Subscription fetch Error'), + text: 'Error getting pending subscription', + id: 'service-fetch', + }) + } + return content + } + + getActiveSubscription = + async (user: string): + Promise => { + const userSubscriptions: Array = await this.getUserSubscriptions(user) + return this._getActiveSubscriptionFrom(userSubscriptions) + } + + _getActiveSubscriptionFrom = (userSubscriptions: Array): SubscriptionDTO|undefined => { + const activeSubscriptions: Array = userSubscriptions.filter((subscription) => { + const { status: subscriptionStatus } = subscription + // when there will be notifier support for multiple active subscriptions add planId to condition + return subscriptionStatus === 'ACTIVE' + }) + + if (activeSubscriptions.length) { + return activeSubscriptions[0] + } + return undefined + } + + getPendingSubscription = + async (user: string, planId: number): + Promise => { + const userSubscriptions: Array = await this.getUserSubscriptions(user) + + const pendingSubscriptions: Array = userSubscriptions.filter((subscription) => { + const { subscriptionPlanId, status: subscriptionStatus } = subscription + return subscriptionPlanId === planId && (subscriptionStatus === 'PENDING') + }) + + if (pendingSubscriptions.length) { + return pendingSubscriptions[0] + } + return undefined + } +} diff --git a/src/api/rif-notifier-service/subscriptionUtils.ts b/src/api/rif-notifier-service/subscriptionUtils.ts new file mode 100644 index 000000000..26e6c3e59 --- /dev/null +++ b/src/api/rif-notifier-service/subscriptionUtils.ts @@ -0,0 +1,200 @@ +import { + NotificationPreference, TopicDTO, + TOPIC_TYPES, TopicParams, + TOPIC_PARAM_TYPES, SubscribeToPlanDTO, + NotificationServiceType, SubscribeToPlanResponseDTO, +} from 'api/rif-notifier-service/models/subscriptions' +import SubscribeToPlanService from 'api/rif-notifier-service/subscriptionBatch' +import SubscriptionService, { SubscriptionSummary } from 'api/rif-notifier-service/subscriptionService' +import { SupportedEventType } from 'config/notifier' +import { OrderItem } from 'context/Services/notifier/offers/interfaces' +import { NotifierEventItem } from 'models/marketItems/NotifierEventItem' +import { SelectedEventChannel } from 'models/marketItems/NotifierItem' +import { SupportedTokenSymbol } from 'models/Token' +import { UIError } from 'models/UIMessage' +import { convertToWeiString } from 'utils/parsers' +import RenewSubscriptionService from './renewSubscription' + +const buildBlockEvent = ( + notificationPreferences: Array, +): TopicDTO => ({ + type: TOPIC_TYPES.NEW_BLOCK, + notificationPreferences, + topicParams: [], +}) + +const buildContractEvent = ( + notificationPreferences: Array, + { event: { smartContract, name, params } }: NotifierEventItem, +): TopicDTO => { + const topicParams: Array = [ + { + type: TOPIC_PARAM_TYPES.CONTRACT_ADDRESS, + value: smartContract as string, + }, + { + type: TOPIC_PARAM_TYPES.EVENT_NAME, + value: name as string, + }, + ] + + if (params) { + params.forEach(({ + type: valueType, + name: paramName, + indexed: paramIsIndexed, + }) => { + const topicParam: TopicParams = { + type: TOPIC_PARAM_TYPES.EVENT_PARAM, + value: paramName, + indexed: paramIsIndexed, + valueType: valueType.charAt(0).toUpperCase() + valueType.slice(1), + } + topicParams.push(topicParam) + }) + } + + return { + type: TOPIC_TYPES.CONTRACT_EVENT, + notificationPreferences, + topicParams, + } as TopicDTO +} + +const eventBuilders: Record = { + NEWBLOCK: buildBlockEvent, + SMARTCONTRACT: buildContractEvent, +} + +export const buildTopicsDTOFrom = ( + notifierEventItems: Array, +): Array => { + const topics: Array = [] + notifierEventItems.forEach((notifierEventItem) => { + const { + event: { type: eventType, channels }, + } = notifierEventItem + const notificationPreferences: Array = channels.map( + (channel: SelectedEventChannel) => ({ + notificationService: channel.type as NotificationServiceType, + destination: channel.destination, + destinationParams: { + username: '', + password: '', + apiKey: '', + }, + }), + ) + + topics.push( + eventBuilders[eventType](notificationPreferences, notifierEventItem), + ) + }) + return topics +} + +type SubscriptionOrderItem = Pick & { + symbol: SupportedTokenSymbol +} + +export const buildSubscribeToPlanDTO = ( + item: SubscriptionOrderItem, + account: string, + topics?: Array, +): SubscribeToPlanDTO => { + const { + symbol: currencySymbol, + planId: subscriptionPlanId, + value: price, + } = item + + return { + subscriptionPlanId: Number(subscriptionPlanId), + userAddress: account, + price: convertToWeiString(price), + currency: currencySymbol, + topics, + } +} + +export const searchPendingSubscription = ( + account: string, + item: SubscriptionOrderItem, + reportError: (e: UIError) => void, +): Promise => { + const { url: providerUrl, planId } = item + const subscriptionService = new SubscriptionService(providerUrl) + subscriptionService.connect(reportError) + return subscriptionService.getPendingSubscription(account, planId) +} + +export const createPendingSubscription = ( + item: SubscriptionOrderItem, + notifierEventItems: Array, + account: string, reportError: (e: UIError) => void, +): Promise => { + const { url: providerUrl } = item + const subscribeToPlanDTO = buildSubscribeToPlanDTO( + item, account, buildTopicsDTOFrom(notifierEventItems), + ) + + const subscribeToPlanService = new SubscribeToPlanService(providerUrl) + subscribeToPlanService.connect(reportError) + + return subscribeToPlanService.subscribeToPlan(subscribeToPlanDTO) +} + +export const createRenewalSubscription = ( + subscriptionHash: string, + item: SubscriptionOrderItem, + account: string, reportError: (e: UIError) => void, +): Promise => { + const { url: providerUrl } = item + const subscribeToPlanDTO = buildSubscribeToPlanDTO( + item, account, + ) + const renewSubscriptionService = new RenewSubscriptionService(providerUrl) + renewSubscriptionService.connect(reportError) + return renewSubscriptionService.renewSubscription( + subscribeToPlanDTO, subscriptionHash, + ) +} + +const getOrCreateNewOrRenewalSubscription = async (item: SubscriptionOrderItem, + account: string, reportError: (e: UIError) => void, + eventsAdded: Array, + subscriptionHash?: string): Promise => { + const pendingSubscription = await searchPendingSubscription( + account, item, reportError, + ) + + if (pendingSubscription) { + return pendingSubscription + } + const { + signature, hash, + } = subscriptionHash ? await createRenewalSubscription( + subscriptionHash, item, account, reportError, + ) + : await createPendingSubscription(item, eventsAdded, account, reportError) + return { + signature, hash, status: 'PENDING', + } +} + +export const getOrCreateSubscription = ( + item: SubscriptionOrderItem, + eventsAdded: Array, account: string, + reportError: (e: UIError) => void, +): Promise => getOrCreateNewOrRenewalSubscription( + item, account, reportError, eventsAdded, +) + +export const getOrCreateRenewalSubscription = ( + subscriptionHash: string, + item: SubscriptionOrderItem, + account: string, + reportError: (e: UIError) => void, +): Promise => getOrCreateNewOrRenewalSubscription( + item, account, reportError, [], subscriptionHash, +) diff --git a/src/assets/images/shopping_trolley.svg b/src/assets/images/shopping_trolley.svg new file mode 100644 index 000000000..e78a7fb86 --- /dev/null +++ b/src/assets/images/shopping_trolley.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Routes.tsx b/src/components/Routes.tsx index 003f33bae..a5e4db692 100644 --- a/src/components/Routes.tsx +++ b/src/components/Routes.tsx @@ -10,7 +10,7 @@ import { } from './pages' import RnsRoutes from './pages/rns/RnsRoutes' import StorageRoutes from './pages/storage/StorageRoutes' -import TriggersRoutes from './pages/triggers/TriggersRoutes' +import NotifierRoutes from './pages/notifier/NotifierRoutes' const logger = Logger.getInstance() @@ -34,7 +34,7 @@ const Routes = (): JSX.Element => { - + diff --git a/src/components/atoms/CurrencyToggle.tsx b/src/components/atoms/CurrencyToggle.tsx new file mode 100644 index 000000000..04912d4cc --- /dev/null +++ b/src/components/atoms/CurrencyToggle.tsx @@ -0,0 +1,61 @@ +import React, { FC } from 'react' +import ToggleButtonGroup, { ToggleButtonGroupProps } from '@material-ui/lab/ToggleButtonGroup' +import ToggleButton from '@material-ui/lab/ToggleButton' +import { makeStyles, Typography } from '@material-ui/core' +import { SupportedTokenSymbol } from 'models/Token' +import { SUPPORTED_TOKEN_RECORDS } from 'contracts/interfaces' +import { colors } from '@rsksmart/rif-ui' + +type Props = ToggleButtonGroupProps & { + options: SupportedTokenSymbol[] +} + +const useStyles = makeStyles({ + root: { + border: '1px solid', + borderColor: colors.primary, + }, + selected: { + color: colors.primary, + background: 'red', + }, +}) + +const CurrencyToggle: FC = ({ + options, + value, + ...props +}) => { + const classes = useStyles() + + return ( + + {options.map((symbol) => ( + + + {SUPPORTED_TOKEN_RECORDS[symbol].displayName} + + + ))} + + ) +} + +export default CurrencyToggle diff --git a/src/components/atoms/FeatureNotSupportedButton.tsx b/src/components/atoms/FeatureNotSupportedButton.tsx new file mode 100644 index 000000000..323fa1f40 --- /dev/null +++ b/src/components/atoms/FeatureNotSupportedButton.tsx @@ -0,0 +1,17 @@ +import React, { FC } from 'react' +import { FEATURE_NOT_SUPPORTED } from 'constants/strings' +import Tooltip from '@material-ui/core/Tooltip' +import RoundBtn from './RoundBtn' + +const FeatureNotSupported: FC<{}> = ({ children }) => ( + + + + {children} + + + + +) + +export default FeatureNotSupported diff --git a/src/components/atoms/GridItem.tsx b/src/components/atoms/GridItem.tsx index a4880bf25..d52bda8f2 100644 --- a/src/components/atoms/GridItem.tsx +++ b/src/components/atoms/GridItem.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { GridProps, Grid } from '@material-ui/core' +import Grid, { GridProps } from '@material-ui/core/Grid' export type GridItemProps = Omit diff --git a/src/components/atoms/GridRow.tsx b/src/components/atoms/GridRow.tsx index b517ef4c6..38efbea5c 100644 --- a/src/components/atoms/GridRow.tsx +++ b/src/components/atoms/GridRow.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react' -import { GridProps, Grid } from '@material-ui/core' +import Grid, { GridProps } from '@material-ui/core/Grid' export type GridRowProps = Omit diff --git a/src/components/atoms/Icon.tsx b/src/components/atoms/Icon.tsx index eb955f704..affb5a8fb 100644 --- a/src/components/atoms/Icon.tsx +++ b/src/components/atoms/Icon.tsx @@ -8,7 +8,7 @@ import { makeStyles, Theme } from '@material-ui/core/styles' export const Icons = { DOMAINS: nameServiceImg, STORAGE: storageImg, - TRIGGERS: triggersImg, + NOTIFIER: triggersImg, } export interface IconProps { diff --git a/src/components/atoms/MarketplaceCell.tsx b/src/components/atoms/MarketplaceCell.tsx new file mode 100644 index 000000000..718394c05 --- /dev/null +++ b/src/components/atoms/MarketplaceCell.tsx @@ -0,0 +1,10 @@ +import Typography, { TypographyProps } from '@material-ui/core/Typography/Typography' +import React, { FC } from 'react' + +const MarketplaceCell: FC = ({ children, ...props }) => ( + + {children} + +) + +export default MarketplaceCell diff --git a/src/components/atoms/RemoveButton.tsx b/src/components/atoms/RemoveButton.tsx new file mode 100644 index 000000000..7f0d80c7a --- /dev/null +++ b/src/components/atoms/RemoveButton.tsx @@ -0,0 +1,13 @@ +import React, { FC } from 'react' +import { Typography } from '@material-ui/core' +import { SelectRowButton } from 'components/molecules' +import { SelectRowButtonProps } from 'components/molecules/SelectRowButton' +import { Close } from '@material-ui/icons' + +const RemoveButton: FC = (props) => ( + + + +) + +export default RemoveButton diff --git a/src/components/atoms/RoundBtn.tsx b/src/components/atoms/RoundBtn.tsx index 9e928609c..175f60fd4 100644 --- a/src/components/atoms/RoundBtn.tsx +++ b/src/components/atoms/RoundBtn.tsx @@ -1,18 +1,16 @@ import React, { FC } from 'react' import { ButtonProps, -} from '@material-ui/core' +} from '@material-ui/core/Button' import { Button } from '@rsksmart/rif-ui' -export type RoundBtnProps = Omit - -const RoundBtn: FC = (props) => ( +const RoundBtn: FC = ({ color = 'primary', variant = 'contained', ...otherProps }) => ( + + + )} + control={( + + )} + /> + + Close + + )} + > + + {terms} + + + + ) +} + +export default TermsAndConditions diff --git a/src/components/organisms/filters/notifier/OffersFilters.tsx b/src/components/organisms/filters/notifier/OffersFilters.tsx new file mode 100644 index 000000000..16ca9b335 --- /dev/null +++ b/src/components/organisms/filters/notifier/OffersFilters.tsx @@ -0,0 +1,112 @@ +import { CheckboxProps } from '@material-ui/core' +import { Accordion, FilterCheckboxCard } from '@rsksmart/rif-ui' +import MarketContext from 'context/Market' +import { NotifierOffersContext } from 'context/Services/notifier/offers' +import { SUPPORTED_TOKEN_RECORDS } from 'contracts/interfaces' +import { MinMaxFilter } from 'models/Filters' +import { SupportedTokenSymbol } from 'models/Token' +import React, { FC, useContext } from 'react' +import { Modify } from 'utils/typeUtils' +import RangeFilter from '../RangeFilter' + +const SIZE_STEP = 0.01 + +const NotifierOffersFilters: FC = () => { + const { + state: { + filters: { + size: sizeFilter, + price: priceFilter, + currency: currencies, + }, + limits: { + price: priceLimits, + size: sizeLimits, + }, + }, + dispatch, + } = useContext(NotifierOffersContext) + const { + state: { exchangeRates: { currentFiat: { symbol: fiatSymbol } } }, + } = useContext(MarketContext) + + const onSizeChange = ((size: MinMaxFilter): void => { + dispatch({ + type: 'FILTER', + payload: { size }, + }) + }) + + const onPriceChange = ((price: MinMaxFilter): void => { + dispatch({ + type: 'FILTER', + payload: { + price: { + ...price, + fiatSymbol, + }, + }, + }) + }) + + const onCurrencyChange = ( + symbol: SupportedTokenSymbol, + ) => (_: unknown, checked: boolean): void => { + const currency = new Set(currencies) + + if (checked) currency.add(symbol) + else currency.delete(symbol) + + dispatch({ + type: 'FILTER', + payload: { currency }, + }) + } + + const supportedSymbols = Array.from( + Object.keys(SUPPORTED_TOKEN_RECORDS) as SupportedTokenSymbol[], + ) + const currencyOptions: Modify[] = supportedSymbols.map((symbol) => ({ + labelText: SUPPORTED_TOKEN_RECORDS[symbol].displayName, + id: symbol, + onChange: onCurrencyChange(symbol), + })) + + return ( + <> + + + + + + + ) +} + +export default NotifierOffersFilters diff --git a/src/components/organisms/notifier/NotificationChannel.tsx b/src/components/organisms/notifier/NotificationChannel.tsx new file mode 100644 index 000000000..a6b50603f --- /dev/null +++ b/src/components/organisms/notifier/NotificationChannel.tsx @@ -0,0 +1,32 @@ +import React, { FC } from 'react' +import Grid from '@material-ui/core/Grid' +import Typography from '@material-ui/core/Typography' +import Box from '@material-ui/core/Box' +import { colors, shortenString } from '@rsksmart/rif-ui' +import { SelectedEventChannel } from 'models/marketItems/NotifierItem' +import RemovableRow from 'components/organisms/RemovableRow' + +export interface NotificationChannelProps { + className?: string + onRemoveClick: (e: React.MouseEvent) => void + channel: SelectedEventChannel +} + +const NotificationChannel: FC = ({ + channel, onRemoveClick, +}) => ( + + + + + {channel.type} + + + + + {shortenString(channel.destination, 30, 25)} + + +) + +export default NotificationChannel diff --git a/src/components/organisms/notifier/NotificationChannelCreate.tsx b/src/components/organisms/notifier/NotificationChannelCreate.tsx new file mode 100644 index 000000000..c78b8d0e0 --- /dev/null +++ b/src/components/organisms/notifier/NotificationChannelCreate.tsx @@ -0,0 +1,141 @@ +import React, { FC, useState, useMemo } from 'react' +import { makeStyles, Theme } from '@material-ui/core/styles' +import Grid from '@material-ui/core/Grid' +import { EventChannel, EventChannels, SelectedEventChannel } from 'models/marketItems/NotifierItem' +import { FormControl } from '@material-ui/core' +import Select from '@material-ui/core/Select' +import MenuItem from '@material-ui/core/MenuItem' +import TextField from '@material-ui/core/TextField' +import { SelectRowButton } from 'components/molecules' +import { useForm } from 'react-hook-form' +import Typography from '@material-ui/core/Typography' +import validateURL from 'utils/validationUtils' +import { notifierChannelPlaceHolder } from 'constants/notifier/strings' +import { SUPPORTED_API_CHANNEL_PROTOCOLS } from 'config/notifier' +import { emailRegex } from 'utils/stringUtils' + +interface Props { + channelAdd: (notifierChannel: SelectedEventChannel) => void + availableChannels: EventChannels +} + +const useStyles = makeStyles((theme: Theme) => ({ + formControl: { + margin: theme.spacing(1), + minWidth: 120, + }, + select: { + textAlign: 'center', + height: 40, + }, +})) + +type Inputs = { + destination: string +} + +const NotificationChannelCreate: FC = ({ + availableChannels, channelAdd, +}) => { + const defaultChannel = useMemo(() => { + const [firstChannel] = availableChannels + return firstChannel + }, [availableChannels]) + + const [notifierChannel, setNotifierChannel] = useState({ + ...defaultChannel, + destination: '', + }) + + const handleChannelChange = ({ target: { value } }): void => { + const channel = availableChannels.find( + ({ type }) => type === value, + ) as EventChannel + setNotifierChannel({ + ...notifierChannel, + ...channel, + }) + } + const handleDestinationChange = ( + { target: { value: destination } }, + ): void => { + setNotifierChannel({ + ...notifierChannel, + destination, + }) + } + + const validateDestination = (destination: string): boolean => { + if (notifierChannel.type === 'API') { + return validateURL(destination, SUPPORTED_API_CHANNEL_PROTOCOLS) + } + return emailRegex.test(destination) + } + const classes = useStyles() + const { register, handleSubmit, errors } = useForm() + + return ( + <> + + { + `${notifierChannel.type} origin: ${notifierChannel.origin}` + } + + + + + + + + + + { + errors.destination && ( + + Invalid destination + + ) + } + + + channelAdd(notifierChannel)) + } + size="large" + variant="outlined" + > + Add Channel + + + + + ) +} + +export default NotificationChannelCreate diff --git a/src/components/organisms/notifier/NotificationChannelsList.tsx b/src/components/organisms/notifier/NotificationChannelsList.tsx new file mode 100644 index 000000000..d07b79298 --- /dev/null +++ b/src/components/organisms/notifier/NotificationChannelsList.tsx @@ -0,0 +1,91 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { + Grid, makeStyles, Typography, +} from '@material-ui/core' +import React, { + FC, useState, +} from 'react' +import { createStyles, Theme } from '@material-ui/core/styles' +import { EventChannels, SelectedEventChannel, SelectedEventChannels } from 'models/marketItems/NotifierItem' +import NotificationChannel from 'components/organisms/notifier/NotificationChannel' +import { colors } from '@rsksmart/rif-ui' +import NotificationChannelCreate from 'components/organisms/notifier/NotificationChannelCreate' +import { SUPPORTED_EVENT_CHANNELS } from 'config/notifier' + +const useStyles = makeStyles((theme: Theme) => createStyles({ + + channelsList: { + marginTop: theme.spacing(2), + marginBottom: theme.spacing(4), + marginLeft: theme.spacing(15), + borderTop: `1px solid ${colors.gray3}`, + padding: theme.spacing(3, 0), + }, +})) + +type Props = { + channels: EventChannels + onEventChannelsUpdate: (channels: SelectedEventChannels) => void +} + +const NotificationChannelsList: FC = ({ + channels, onEventChannelsUpdate, +}) => { + const classes = useStyles() + const [ + addedChannels, + setAddedChannels, + ] = useState([]) + + const availableChannels: EventChannels = channels.filter( + ({ type }) => SUPPORTED_EVENT_CHANNELS.includes(type), + ) + + const addChannel = (notifierChannel: SelectedEventChannel): void => { + if (!addedChannels.find(({ type }) => type !== notifierChannel.type)) { + setAddedChannels([...addedChannels, notifierChannel]) + onEventChannelsUpdate([...addedChannels, notifierChannel]) + } + } + + const removeChannel = ({ currentTarget: { id: channelType } }): void => { + const newChannels = addedChannels.filter(({ type }) => type !== channelType) + setAddedChannels(newChannels) + onEventChannelsUpdate(newChannels) + } + + const collection: SelectedEventChannels = addedChannels.map((channel) => ({ + ...channel, + destination: channel.destination, + })) + + return (availableChannels.length ? ( + + + Notification Channels + + + Select the channel that you want to receive your notification through + + + + + { + collection.map((channel) => ( + + )) + } + + + + + ) : + ) +} +export default NotificationChannelsList diff --git a/src/components/organisms/notifier/NotificationEventCreate.tsx b/src/components/organisms/notifier/NotificationEventCreate.tsx new file mode 100644 index 000000000..44b642113 --- /dev/null +++ b/src/components/organisms/notifier/NotificationEventCreate.tsx @@ -0,0 +1,235 @@ +import React, { FC, useState } from 'react' +import { makeStyles, Theme } from '@material-ui/core/styles' +import Grid from '@material-ui/core/Grid' +import Select from '@material-ui/core/Select' +import MenuItem from '@material-ui/core/MenuItem' +import TextField from '@material-ui/core/TextField' +import GridRow from 'components/atoms/GridRow' +import { useForm } from 'react-hook-form' +import GridItem from 'components/atoms/GridItem' +import { notifierEventTypeLabels } from 'constants/notifier/strings' +import { + SUPPORTED_EVENTS, SupportedEventType, SUPPORTED_EVENT_TYPES, +} from 'config/notifier' +import NotificationChannelsList from 'components/organisms/notifier/NotificationChannelsList' +import RoundBtn from 'components/atoms/RoundBtn' +import { + EventChannels, NotifierEvent, NotifierEventParam, SelectedEventChannels, +} from 'models/marketItems/NotifierItem' +import { ContractABIEvent } from 'api/blockscout/interface' +import getABIEvents from 'api/blockscout' +import Typography from '@material-ui/core/Typography' +import Box from '@material-ui/core/Box' +import useErrorReporter from 'hooks/useErrorReporter' + +const useStyles = makeStyles((theme: Theme) => ({ + select: { + textAlign: 'center', + height: 40, + }, + button: { + marginTop: theme.spacing(5), + }, + gridRow: { + marginTop: theme.spacing(5), + }, +})) + +type Inputs = { + contract: string +} + +type Props = { + onAddEvent: (event: NotifierEvent) => void + channels: EventChannels +} + +type EventData = { + contract: string + event: ContractABIEvent + eventType: SupportedEventType + addedChannels: SelectedEventChannels +} + +const NotificationEventCreate: FC = ({ + onAddEvent, channels, +}) => { + const { register, handleSubmit, errors } = useForm() + const [events, setEvents] = useState>([]) + const [eventData, setEventData] = useState>({ + eventType: SUPPORTED_EVENTS.SMARTCONTRACT, + }) + + const classes = useStyles() + const reportError = useErrorReporter() + + const loadContractEvents = (address: string): void => { + getABIEvents(address).then((abiEvents: ContractABIEvent[]) => { + setEvents(abiEvents) + + if (abiEvents.length) { + setEventData({ ...eventData, event: abiEvents[0] }) + } + }).catch((error) => { + reportError({ + error, + id: 'contract-notifier', + text: error.text, + }) + setEvents([]) + }) + } + + const handleEventChange = ({ target: { value } }): void => { + setEventData({ + ...eventData, + event: events.find(({ name }) => name === value) as ContractABIEvent, + }) + } + + const handleEventTypeChange = ({ target: { value } }): void => { + setEventData({ ...eventData, eventType: value }) + } + + const handleContractChange = ({ target: { value } }): void => { + loadContractEvents(value) + setEventData({ ...eventData, contract: value }) + } + + const handleAddChannels = ( + selectedChannels: SelectedEventChannels, + ): void => { + setEventData({ ...eventData, addedChannels: selectedChannels }) + } + + const handleAddEvent = (data: Inputs): void => { + if (eventData.addedChannels?.length + && (eventData.eventType === SUPPORTED_EVENTS.NEWBLOCK + || eventData.event)) { + onAddEvent({ + smartContract: data.contract, + name: eventData.eventType === SUPPORTED_EVENTS.NEWBLOCK ? 'NEWBLOCK' : eventData.event?.name, + channels: eventData.addedChannels, + type: eventData.eventType as SupportedEventType, + params: eventData.event?.inputs as Array, + }) + setEventData({ eventType: SUPPORTED_EVENTS.SMARTCONTRACT }) + } + } + + return ( +
+ + + + + Which event would you like to listen to? + + + Select the event to be listened + + + + + { eventData.eventType === SUPPORTED_EVENTS.SMARTCONTRACT && ( + <> + + + + Smart Contract + + + + + { + errors.contract && ( + + Invalid Contract Address + + ) + } + + + + + + Event + + + + + + + + + + )} + + + + + + + + Submit + + + +
+ + ) +} + +export default NotificationEventCreate diff --git a/src/components/organisms/notifier/NotifierPlanDescription.tsx b/src/components/organisms/notifier/NotifierPlanDescription.tsx new file mode 100644 index 000000000..4fd806621 --- /dev/null +++ b/src/components/organisms/notifier/NotifierPlanDescription.tsx @@ -0,0 +1,83 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { + Grid, Typography, +} from '@material-ui/core' +import DescriptionCard from 'components/molecules/DescriptionCard' +import RifAddress from 'components/molecules/RifAddress' +import React, { + FC, +} from 'react' +import { MarketCryptoRecord } from 'models/Market' +import { OrderItem } from 'context/Services/notifier/offers/interfaces' +import { getFiatPrice } from 'utils/priceUtils' + +type Props = { + item: OrderItem + currentFiat: string + crypto: MarketCryptoRecord +} + +const NotifierPlanDescription: FC = ({ + item: { + token, daysLeft, value, + provider, limit, channels, + }, crypto, + currentFiat: currentFiatName, +}) => { + const rateToken = crypto?.[token.symbol] + const valueInFiat = getFiatPrice(value, rateToken) + + return ( + + + + Provider + + + Notifications + + + Channels + + + Currencies + + + Price + + + Expiration Period + + + + + + {limit} + + + {channels.map(({ type }) => type).join(', ')} + + + {token.displayName} + + + + {valueInFiat} + {' '} + {currentFiatName} + + + + + {daysLeft} + {' '} + day + {daysLeft !== 1 ? 's' : ''} + + + + + ) +} + +export default NotifierPlanDescription diff --git a/src/components/organisms/notifier/NotifierPlansDraw.tsx b/src/components/organisms/notifier/NotifierPlansDraw.tsx new file mode 100644 index 000000000..185c9337a --- /dev/null +++ b/src/components/organisms/notifier/NotifierPlansDraw.tsx @@ -0,0 +1,53 @@ +import { Collapse } from '@material-ui/core' +import Grid from '@material-ui/core/Grid' +import NotifierPlan from 'components/molecules/notifier/NotifierPlan' +import { MarketCryptoRecord } from 'models/Market' +import { NotifierOfferItem, PriceOption } from 'models/marketItems/NotifierItem' +import React, { FC } from 'react' + +type Props = { + plans: NotifierOfferItem[] + isOpen: boolean + onPlanSelected: (plan: NotifierOfferItem, priceOption: PriceOption) => void + currentFiat: string + crypto: MarketCryptoRecord +} + +const NotifierPlansDraw: FC = ({ + plans, isOpen, crypto, currentFiat, + onPlanSelected, +}) => ( + + + {plans.map((plan) => ( + + { + onPlanSelected(plan, priceOption) + }} + {...{ currentFiat, crypto, ...plan }} + /> + + ))} + + +) + +export default NotifierPlansDraw diff --git a/src/components/organisms/notifier/NotifierProviderDescription.tsx b/src/components/organisms/notifier/NotifierProviderDescription.tsx new file mode 100644 index 000000000..d185afbdc --- /dev/null +++ b/src/components/organisms/notifier/NotifierProviderDescription.tsx @@ -0,0 +1,67 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { + Grid, Typography, +} from '@material-ui/core' +import EditOutlinedIcon from '@material-ui/icons/EditOutlined' +import { CopyTextTooltip, shortenString, TooltipIconButton } from '@rsksmart/rif-ui' +import DescriptionCard from 'components/molecules/DescriptionCard' +import RifAddress from 'components/molecules/RifAddress' +import React, { + FC, +} from 'react' +import { removeURLProtocol } from 'utils/stringUtils' + +export type Profile = { address: string, url: string } | undefined +type Props = { + myProfile: Profile + handleEditProfile?: React.MouseEventHandler + account?: string +} + +const NotifierProviderDescription: FC = ({ myProfile, handleEditProfile, account }) => ( + + + + Your profile + + + + + } + iconButtonProps={{ + onClick: handleEditProfile, + style: { + padding: 0, + margin: 0, + }, + }} + tooltipTitle="Edit Profile" + /> + + + + + Provider address + + + + + + End-point URL + + + + {myProfile && shortenString(removeURLProtocol(myProfile.url) || '', 20, 20)} + +)} + /> + + + +) + +export default NotifierProviderDescription diff --git a/src/components/organisms/notifier/Staking.tsx b/src/components/organisms/notifier/Staking.tsx new file mode 100644 index 000000000..9dda52ab6 --- /dev/null +++ b/src/components/organisms/notifier/Staking.tsx @@ -0,0 +1,157 @@ +import React, { FC, useContext, useState } from 'react' +import { SupportedTokenSymbol } from 'models/Token' +import NotifierStakingContract from 'contracts/notifier/Staking' +import { Web3Store } from '@rsksmart/rif-ui' +import Web3 from 'web3' +import RoundBtn from 'components/atoms/RoundBtn' +import ProgressOverlay from 'components/templates/ProgressOverlay' +import useErrorReporter from 'hooks/useErrorReporter' +import Big from 'big.js' +import { ConfirmationsContext } from 'context/Confirmations' +import useConfirmations from 'hooks/useConfirmations' +import { StakingContextProps, withStakingContext } from 'context/Services/staking' +import { Context } from 'context/Services/staking/Context' +import StakingTemplate from '../staking/StakingTemplate' + +type Props = { + isEnabled: boolean +} + +const stakeInProgressMsg = 'Staking your funds' +const stakeCompletedMsg = 'Your funds have been staked!' +const unstakeInProgressMsg = 'Unstaking your funds' +const unstakeCompletedMsg = 'Your funds have been unstaked!' + +const Staking: FC = ({ isEnabled }) => { + const { + state: { + account, + web3, + }, + } = useContext(Web3Store) + const { dispatch: confirmationsDispatch } = useContext(ConfirmationsContext) + + const reportError = useErrorReporter() + + const { + state: { + stakes, + totalStakedUSD, + }, + } = useContext(Context) + + const [txInProgressMessage, setTxInProgressMessage] = useState('') + const [txCompleteMsg, setTxCompleteMsg] = useState('') + const [processingTx, setProcessingTx] = useState(false) + const [txOperationDone, setTxOperationDone] = useState(false) + + const hasPendingConfs = Boolean(useConfirmations( + ['NOTIFIER_STAKE', 'NOTIFIER_UNSTAKE'], + ).length) + + const canWithdraw = async (): Promise => { + // TODO: add specific validation logic + await new Promise((resolve) => setTimeout(resolve, 1000)) + + return true + } + + const handleDeposit = async ( + amount: number, currency: SupportedTokenSymbol, + ): Promise => { + try { + setTxInProgressMessage(stakeInProgressMsg) + setProcessingTx(true) + setTxCompleteMsg(stakeCompletedMsg) + const stakingContract = NotifierStakingContract.getInstance(web3 as Web3) + const receipt = await stakingContract.stake(Big(amount), { + token: currency, + from: account, + }) + + if (receipt) { + setTxOperationDone(true) + confirmationsDispatch({ + type: 'NEW_REQUEST', + payload: { + contractAction: 'NOTIFIER_STAKE', + txHash: receipt.transactionHash, + }, + }) + } + } catch (error) { + const { customMessage } = error + reportError({ + error, + id: 'contract-notifier-staking', + text: customMessage || 'Could not stake funds.', + }) + } finally { + setProcessingTx(false) + } + } + + const handleWithdraw = async ( + amount: number, currency: SupportedTokenSymbol, + ): Promise => { + try { + setTxInProgressMessage(unstakeInProgressMsg) + setProcessingTx(true) + setTxCompleteMsg(unstakeCompletedMsg) + const stakeContract = NotifierStakingContract.getInstance(web3 as Web3) + const receipt = await stakeContract.unstake( + Big(amount), { token: currency, from: account }, + ) + + if (receipt) { + setTxOperationDone(true) + confirmationsDispatch({ + type: 'NEW_REQUEST', + payload: { + contractAction: 'NOTIFIER_UNSTAKE', + txHash: receipt.transactionHash, + }, + }) + } + } catch (error) { + const { customMessage } = error + reportError({ + error, + id: 'contract-notifier-staking', + text: customMessage || 'Could not withdraw your funds.', + }) + } finally { + setProcessingTx(false) + } + } + + return ( + <> + + setTxOperationDone(false)} + > + Close + , + ]} + /> + + ) +} + +export default withStakingContext(Staking, 'notifier/v0/stakes') diff --git a/src/components/organisms/notifier/buy/CheckoutPayment.tsx b/src/components/organisms/notifier/buy/CheckoutPayment.tsx new file mode 100644 index 000000000..feab880f5 --- /dev/null +++ b/src/components/organisms/notifier/buy/CheckoutPayment.tsx @@ -0,0 +1,154 @@ +import RoundBtn from 'components/atoms/RoundBtn' +import React, { + FC, useState, useEffect, useContext, +} from 'react' +import Typography from '@material-ui/core/Typography' +import GridRow from 'components/atoms/GridRow' +import Grid, { GridProps } from '@material-ui/core/Grid' +import { TokenXR } from 'models/Market' +import ExpirationDate from 'components/molecules/ExpirationDate' +import PriceSummary from 'components/molecules/PriceSummary' +import { makeStyles, Theme } from '@material-ui/core/styles' +import Box from '@material-ui/core/Box' +import RoundedCard from 'components/atoms/RoundedCard' +import Big from 'big.js' +import { Web3Store } from '@rsksmart/rif-ui' +import { getBalance } from 'contracts/utils/accountBalance' +import NotEnoughFunds from 'components/atoms/NotEnoughFunds' +import Web3 from 'web3' +import useErrorReporter from 'hooks/useErrorReporter' +import TermsAndConditions from 'components/organisms/TermsAndConditions' +import { TERMS_CONDITIONS_BUY } from 'constants/notifier/strings' + +type Props = { + onBuy: () => void + fiatDisplayName: string + expirationDate: Date + tokenXR: TokenXR + cryptoPrice: Big +} + +const useStyles = makeStyles((theme: Theme) => ({ + priceSummaryCard: { + padding: theme.spacing(1.5, 3), + marginBottom: theme.spacing(1), + }, + expirationDate: { + justifyContent: 'center', + }, +})) + +const CheckoutPayment: FC = ({ + onBuy, fiatDisplayName, expirationDate, tokenXR, cryptoPrice, +}) => { + const classes = useStyles() + const reportError = useErrorReporter() + + const { state: { web3, account } } = useContext(Web3Store) + const [hasEnoughFunds, setHasEnoughFunds] = useState(false) + const [isLoadingBalance, setIsLoadingBalance] = useState(false) + const [termsChecked, setTermsChecked] = useState(false) + + const { + symbol: selectedTokenSymbol, + } = tokenXR + + useEffect(() => { + const calculateBalance = async (): Promise => { + try { + setIsLoadingBalance(true) + const balance = await getBalance( + web3 as Web3, account as string, selectedTokenSymbol, + ) + setHasEnoughFunds(Big(balance).gte(cryptoPrice)) + } catch (error) { + reportError({ + error, + id: 'get-balance', + text: 'Could not read account balance', + }) + } finally { + setIsLoadingBalance(false) + } + } + calculateBalance() + }, [account, web3, selectedTokenSymbol, cryptoPrice, reportError]) + + const handleTermsChange = (): void => setTermsChecked((prev) => !prev) + + const colProps: GridProps = { + container: true, + item: true, + direction: 'column', + md: 6, + sm: 12, + alignItems: 'center', + justify: 'center', + } + const isBuyDisabled = !hasEnoughFunds || isLoadingBalance || !termsChecked + + return ( + <> + + + {`To acquire this notification service you have to select + the currency to get the final price.`} + + + You can add more events to this contract before or after renew. + + + + + + + + + Expiration date + + + + + { + !isLoadingBalance && !hasEnoughFunds && ( + + ) + } + + + + + + Buy + + + + {`Your wallet will open and you will be asked + to confirm the transaction for buying the notification plan.`} + + + + + ) +} + +export default CheckoutPayment diff --git a/src/components/organisms/notifier/buy/CheckoutStepper.tsx b/src/components/organisms/notifier/buy/CheckoutStepper.tsx new file mode 100644 index 000000000..aa63cba28 --- /dev/null +++ b/src/components/organisms/notifier/buy/CheckoutStepper.tsx @@ -0,0 +1,94 @@ +import React, { FC, useContext, useState } from 'react' +import Stepper from '@material-ui/core/Stepper' +import Step from '@material-ui/core/Step' +import StepLabel from '@material-ui/core/StepLabel' +import StepContent from '@material-ui/core/StepContent' +import { Button } from '@rsksmart/rif-ui' +import MarketContext from 'context/Market' +import { OffersOrder } from 'context/Services/notifier/offers/interfaces' +import { NotifierEventItem } from 'models/marketItems/NotifierEventItem' +import CheckoutPayment from './CheckoutPayment' +import EventsRegistrar from './EventsRegistrar' + +type Props = { + order: OffersOrder + onEventItemAdded: (eventitem: NotifierEventItem) => void + onEventItemRemoved: (eventitem: NotifierEventItem) => void + onBuy: () => void + eventsAdded: NotifierEventItem[] +} + +const getExpirationDate = (daysLeft: number): Date => { + const retDate = new Date() + retDate.setDate(retDate.getDate() + daysLeft) + return retDate +} + +const CheckoutStepper: FC = ( + { + onBuy, order, onEventItemAdded, onEventItemRemoved, eventsAdded, + }, +) => { + const [activeStep, setActiveStep] = useState(0) + const { + state: { + exchangeRates: { + crypto: cryptoXRs, + currentFiat: { displayName: fiatDisplayName }, + }, + }, + } = useContext(MarketContext) + + const { + item: { + token: { symbol: tokenSymbol }, + value: tokenValue, + daysLeft, + }, + } = order + + const handleNext = (): void => setActiveStep(1) + const handleBack = (): void => setActiveStep(0) + + const expirationDate = getExpirationDate(daysLeft) + const tokenXR = cryptoXRs[tokenSymbol] + + return ( + + + Notification events + + + + + + Payment + + + + + + + ) +} + +export default CheckoutStepper diff --git a/src/components/organisms/notifier/buy/EventsRegistrar.tsx b/src/components/organisms/notifier/buy/EventsRegistrar.tsx new file mode 100644 index 000000000..4027bd987 --- /dev/null +++ b/src/components/organisms/notifier/buy/EventsRegistrar.tsx @@ -0,0 +1,140 @@ +import React, { FC, useState } from 'react' +import { Button } from '@rsksmart/rif-ui' +import Marketplace from 'components/templates/marketplace/Marketplace' +import TableContainer from '@material-ui/core/TableContainer' +import NotificationEventCreate from 'components/organisms/notifier/NotificationEventCreate' +import Box from '@material-ui/core/Box' +import Grid from '@material-ui/core/Grid' +import Collapse from '@material-ui/core/Collapse' +import Typography from '@material-ui/core/Typography' +import { makeStyles, Theme } from '@material-ui/core/styles' +import Tooltip from '@material-ui/core/Tooltip' +import RemoveButton from 'components/atoms/RemoveButton' +import { NotifierEvent, NotifierEventParam } from 'models/marketItems/NotifierItem' +import { SUPPORTED_EVENTS, SupportedEventType } from 'config/notifier' +import { OffersOrder } from 'context/Services/notifier/offers/interfaces' +import RoundBtn from 'components/atoms/RoundBtn' +import { NotifierEventItem } from 'models/marketItems/NotifierEventItem' + +const notifierEventItemHeaders = { + name: 'Name', + type: 'Type', + channels: 'Channels', + actions: '', +} + +export type EventsRegistrarProps = { + eventsAdded: NotifierEventItem[] + onEventAdded: (item: NotifierEventItem) => void + onEventRemoved: (item: NotifierEventItem) => void + order: OffersOrder + onNext: () => void +} + +const useStyles = makeStyles((theme: Theme) => ({ + eventsSection: { + marginTop: theme.spacing(4), + }, +})) + +const buildEventSignature = (notifierEvent: NotifierEvent): string => { + const params = notifierEvent?.params?.map( + (input: NotifierEventParam) => `${input.name} ${input.type}`) + .join(',') + return `${notifierEvent.name}(${params})` +} + +const isBlockEvent = (eventType: SupportedEventType): boolean => ( + eventType === SUPPORTED_EVENTS.NEWBLOCK +) + +const EventsRegistrar: FC = ( + { + order, onNext, eventsAdded, onEventAdded, onEventRemoved, + }, +) => { + const classes = useStyles() + + const [addEventCollapsed, setAddEventCollapsed] = useState(false) + const { item: { channels } } = order + + const addNotifierEvent = (notifierEvent: NotifierEvent): void => { + if (isBlockEvent(notifierEvent.type) + && eventsAdded.find((addedEvent) => isBlockEvent( + addedEvent.type as SupportedEventType, + ))) { + setAddEventCollapsed(!addEventCollapsed) + return + } + const addedEvent: NotifierEventItem = { + id: notifierEvent.name as string, + type: notifierEvent.type, + signature: isBlockEvent(notifierEvent.type) ? '' + : buildEventSignature(notifierEvent) as string, + channels: notifierEvent.channels.map((channel) => channel.type).join('+'), + event: notifierEvent, + } + onEventAdded(addedEvent) + setAddEventCollapsed(!addEventCollapsed) + } + + const collection = eventsAdded.map((event) => ({ + name: ( + + {event.id} + + ), + type: event.type, + channels: event.channels, + actions: ( + onEventRemoved(event)} + /> + ), + })) + + const generateKey = (): string => `'eve_'${new Date().getTime()}` + const isNextDisabled = !eventsAdded.length + + return ( + <> + + + + + + + +
+
+ + + + + + + Next + + + ) +} + +export default EventsRegistrar diff --git a/src/components/organisms/notifier/details/NotifierDetailsModal.tsx b/src/components/organisms/notifier/details/NotifierDetailsModal.tsx new file mode 100644 index 000000000..de22d40ff --- /dev/null +++ b/src/components/organisms/notifier/details/NotifierDetailsModal.tsx @@ -0,0 +1,159 @@ +import React from 'react' +import Grid from '@material-ui/core/Grid' +import TableContainer from '@material-ui/core/TableContainer' +import Typography from '@material-ui/core/Typography' +import MarketplaceCell from 'components/atoms/MarketplaceCell' +import RifDialog from 'components/organisms/RifDialog' +import Marketplace from 'components/templates/marketplace/Marketplace' +import { Item } from 'models/Market' + +export const baseSubscriptionHeaders = { + id: 'Subscription ID', + amount: 'Notifications', + channels: 'Channels', + price: 'Price', + expDate: 'Expiration Date', +} as const + +const eventsHeaders = { + name: 'Name', + type: 'Type', + contract: 'Contract', + channels: 'Channels', +} + +export type SubscriptionEventsDisplayItem = Item & { + [K in keyof typeof eventsHeaders]: React.ReactElement + } + +type Props = { + headers: H + details: T + events?: Array + onClose: (e: React.MouseEvent) => void + actions: React.ReactNode +} + +const NotifierDetails = ({ + headers, + details, + events = [], + onClose, + actions, +}: Props): React.ReactElement => ( + + + {/* Title */} + + + Notification plan + + + + {/* Description */} + + { + Object.keys(headers).map((detailsHeader) => ( + + + + {String(headers[detailsHeader]).toUpperCase() } + + + + + {details[detailsHeader]} + + + + )) + } + + + {/* Events */} + + + Listened Events + + + + + {Boolean(events.length) && ( + + + + )} + { + !events.length && ( + + There seem to be no events here. + + ) + } + + + {/* Actions */} + + + {actions} + + + + + ) +export default NotifierDetails diff --git a/src/components/organisms/notifier/details/utils.tsx b/src/components/organisms/notifier/details/utils.tsx new file mode 100644 index 000000000..029bd0b4d --- /dev/null +++ b/src/components/organisms/notifier/details/utils.tsx @@ -0,0 +1,73 @@ +import React from 'react' +import { + EVENT_PARAM_TYPES, TopicDTO, TopicParams, TopicParamType, +} from 'api/rif-marketplace-cache/notifier/subscriptions/models' +import MarketplaceCell from 'components/atoms/MarketplaceCell' +import RifAddress from 'components/molecules/RifAddress' +import { EventChannel, EventChannels } from 'models/marketItems/NotifierItem' +import Grid from '@material-ui/core/Grid' +import { SubscriptionEventsDisplayItem } from './NotifierDetailsModal' + +export const getTopicParamValue = ( + topicParams: Array, + paramType: TopicParamType, +): string => topicParams.find( + ({ type }) => type === paramType, +)?.value || '' + +export const eventDisplayItemIterator = ({ + notificationPreferences, topicParams, type: eventType, +}: TopicDTO, channels: EventChannels = []): SubscriptionEventsDisplayItem => { + const nameValue = topicParams && getTopicParamValue( + topicParams, EVENT_PARAM_TYPES.EVENT_NAME, + ) + const name = ( + + {nameValue || eventType} + + ) + const contractAddress = topicParams && getTopicParamValue( + topicParams, EVENT_PARAM_TYPES.CONTRACT_ADDRESS, + ) + const contract = contractAddress ? ( + + ) : N/A + const cleanPrefs = Array.isArray(notificationPreferences) + ? Array.from(new Set(notificationPreferences)) + : [notificationPreferences] + + const channelsCell = channels.length ? ( + + + {cleanPrefs.map((channelType) => { + const channel = channels.find( + ({ type }) => type === channelType, + ) as EventChannel + return ( + + {`${channelType} from ${channel.origin}`} + + ) + })} + + + ) : - + + const type = ( + + {eventType} + + ) + + return ({ + channels: channelsCell, + id: `${name}@${contractAddress}`, + name, + contract, + type, + }) +} diff --git a/src/components/organisms/notifier/myoffers/details.ts b/src/components/organisms/notifier/myoffers/details.ts new file mode 100644 index 000000000..de5299e8f --- /dev/null +++ b/src/components/organisms/notifier/myoffers/details.ts @@ -0,0 +1,10 @@ +import { baseSubscriptionHeaders } from '../details/NotifierDetailsModal' + +export const subscriptionHeaders = { + ...baseSubscriptionHeaders, + customer: 'Customer', +} as const + +export type SubscriptionDetails = { + [K in keyof typeof subscriptionHeaders]: string + } diff --git a/src/components/organisms/notifier/mypurchase/PurchasesTable.tsx b/src/components/organisms/notifier/mypurchase/PurchasesTable.tsx new file mode 100644 index 000000000..9362c08ad --- /dev/null +++ b/src/components/organisms/notifier/mypurchase/PurchasesTable.tsx @@ -0,0 +1,64 @@ +import { + makeStyles, Theme, +} from '@material-ui/core/styles' +import TableContainer from '@material-ui/core/TableContainer' +import Typography from '@material-ui/core/Typography' +import Marketplace from 'components/templates/marketplace/Marketplace' +import { Item } from 'models/Market' +import React, { + FC, +} from 'react' + +const headers = { + subId: 'Subscription ID', + provider: 'Provider', + notifications: 'Notifications', + expirationDate: 'Expiration Date', + price: 'Price', + status: 'Status', + actions: '', +} as const + +export type MySubscriptionHeaders = typeof headers + +export type MySubscription = Item & { + [K in keyof typeof headers]: React.ReactElement +} + +type Props = { + items: Array +} + +const useStyles = makeStyles((theme: Theme) => ({ + noSubscriptions: { + margin: theme.spacing(3), + }, +})) + +const PurchasesTable: FC = ({ items: subscriptions }) => { + const classes = useStyles() + + if (!subscriptions.length) { + return ( + + No purchases yet + + ) + } + + return ( + + + + ) +} + +export default PurchasesTable diff --git a/src/components/organisms/notifier/mypurchase/details.ts b/src/components/organisms/notifier/mypurchase/details.ts new file mode 100644 index 000000000..d5bf160aa --- /dev/null +++ b/src/components/organisms/notifier/mypurchase/details.ts @@ -0,0 +1,10 @@ +import { baseSubscriptionHeaders } from '../details/NotifierDetailsModal' + +export const subscriptionHeaders = { + ...baseSubscriptionHeaders, + provider: 'Provider', +} as const + +export type SubscriptionDetails = { + [K in keyof typeof subscriptionHeaders]: string + } diff --git a/src/components/organisms/notifier/provider/ProviderEdition.tsx b/src/components/organisms/notifier/provider/ProviderEdition.tsx new file mode 100644 index 000000000..8b4f28aa7 --- /dev/null +++ b/src/components/organisms/notifier/provider/ProviderEdition.tsx @@ -0,0 +1,164 @@ +import React, { FC, useContext, useState } from 'react' +import Typography from '@material-ui/core/Typography' +import Box from '@material-ui/core/Box' +import RoundBtn from 'components/atoms/RoundBtn' +import { Grid } from '@material-ui/core' +import { ModalDialogue, Web3Store, WithSpinner } from '@rsksmart/rif-ui' +import NotifierContract from 'contracts/notifier/Notifier' +import Web3 from 'web3' +import { ConfirmationsContext } from 'context/Confirmations' +import { useHistory } from 'react-router-dom' +import ProgressOverlay from 'components/templates/ProgressOverlay' +import ROUTES from 'routes' +import useErrorReporter from 'hooks/useErrorReporter' +import { trailingSlashRegex } from 'utils/stringUtils' +import ProviderRegistrarForm from './ProviderRegistrarForm' + +type Props = { + editMode?: boolean +} + +type LabelTypes = 'BUTTON_LABEL' | 'INPROGRESS_MESSAGE' | 'DONE_MESSAGE' +const editLabels: Record = { + BUTTON_LABEL: 'Edit Offer', + INPROGRESS_MESSAGE: 'Editing your provider info!', + DONE_MESSAGE: 'Your provider info has been updated!', +} + +const createLabels: Record = { + BUTTON_LABEL: 'Register Provider', + INPROGRESS_MESSAGE: 'Registering as a provider!', + DONE_MESSAGE: 'You have been registered as a provider!', +} + +const ProviderEdition: FC = ( + { editMode }, +) => { + const { + state: { + web3, + account, + }, + } = useContext(Web3Store) + const accountStr = account as string // not able to access here w/o acc + const { dispatch: confirmationsDispatch } = useContext(ConfirmationsContext) + const history = useHistory() + const reportError = useErrorReporter() + + const [showConfirmProviderEdit, setShowConfirmProviderEdit] = useState(false) + const [providerUrl, setProviderUrl] = useState('') + const [processingTx, setProcessingTx] = useState(false) + const [txOperationDone, setTxOperationDone] = useState(false) + + const onRegister = async (url: string): Promise => { + try { + setProcessingTx(true) + const notifierContract = NotifierContract.getInstance(web3 as Web3) + const registerableURL: string = url.replace(trailingSlashRegex, '') + const registerReceipt = await notifierContract.registerProvider( + registerableURL, { from: account }, + ) + + if (registerReceipt) { + setTxOperationDone(true) + confirmationsDispatch({ + type: 'NEW_REQUEST', + payload: { + contractAction: 'NOTIFIER_REGISTER_PROVIDER', + txHash: registerReceipt.transactionHash, + }, + }) + } + } catch (error) { + reportError({ + error, + id: 'contract-notifier', + text: 'Could not register as a provider', + }) + } finally { + setProcessingTx(false) + } + } + + const handleRegistration = (url: string): void => { + if (editMode) { + setProviderUrl(url) + setShowConfirmProviderEdit(true) // this opens a dialog that ends up calling onRegister(providerUrl) + } else { + onRegister(url) + } + } + + const labels = editMode ? editLabels : createLabels + const buttonLabel = labels.BUTTON_LABEL + const txDoneMsg = labels.DONE_MESSAGE + const txInProgressTitle = labels.INPROGRESS_MESSAGE + + return ( + <> + { setShowConfirmProviderEdit(false) }} + > + + + + Your existing subscriptions and plans will be affected + + + As a result of this operation, if the new url contains a different set of subscription plans than the current set of plans in marketplace, the current marketplace plans will be set to inactive, and any subscriptions that belong to those plans will be affected. + + + + => onRegister(providerUrl)}> + Confirm + + + + + handleRegistration(endpointUrl)} + buttonLabel={buttonLabel} + /> + history.push(ROUTES.NOTIFIER.MYOFFERS.BASE) + } + > + View my offers + , + history.push(ROUTES.NOTIFIER.BUY.BASE) + } + > + View offers listing + , + ]} + /> + + ) +} + +export default WithSpinner(ProviderEdition) diff --git a/src/components/organisms/notifier/provider/ProviderRegistrarForm.tsx b/src/components/organisms/notifier/provider/ProviderRegistrarForm.tsx new file mode 100644 index 000000000..564762037 --- /dev/null +++ b/src/components/organisms/notifier/provider/ProviderRegistrarForm.tsx @@ -0,0 +1,142 @@ +import TextField from '@material-ui/core/TextField' +import GridRow from 'components/atoms/GridRow' +import TitledRoundedCard from 'components/molecules/TitledRoundedCard' +import React, { FC, useContext } from 'react' +import CenteredContent from 'components/molecules/CenteredContent' +import RoundBtn from 'components/atoms/RoundBtn' +import GridItem from 'components/atoms/GridItem' +import Typography from '@material-ui/core/Typography' +import { useForm } from 'react-hook-form' +import { ipRegex, toChecksum } from 'utils/stringUtils' +import useErrorReporter from 'hooks/useErrorReporter' +import SubscriptionPlans from 'api/rif-notifier-service/subscriptionPlans' +import ProvidersService, { notifierProvidersAddress } from 'api/rif-marketplace-cache/notifier/providers' +import AppContext, { AppContextProps } from 'context/App' +import { + HTTPS_REQUIRED, IP_NOT_ALLOWED, NO_AVAILABLE_SUBSCRIPTION_PLAN, URL_ALREADY_REGISTERED, WRONG_URL, +} from 'constants/notifier/strings' +import { ALLOW_INSECURE_CONNECTIONS, SUPPORTED_PROVIDER_PROTOCOLS } from 'config/notifier' + +type Inputs = { + endpointUrl: string +} + +type ProviderRegistrarFormProps = { + providerAddress: string + isEnabled: boolean + onRegister: (data: Inputs) => void + buttonLabel?: string +} + +const ProviderRegistrarForm: FC = ({ + providerAddress, onRegister, isEnabled, buttonLabel, +}) => { + const { + register, handleSubmit, errors, + } = useForm() + const reportError = useErrorReporter() + const { + state: { + apis: { + [notifierProvidersAddress]: providersApi, + }, + }, + } = useContext(AppContext) + + const validateProviderURL = async (url: string): Promise => { + let providerURL + try { + providerURL = new URL(url) + } catch { + return WRONG_URL + } + const { protocol, hostname } = providerURL + + if (!ALLOW_INSECURE_CONNECTIONS && (ipRegex.test(hostname.replace(/\[/g, '').replace(/\]/g, '')))) { + return IP_NOT_ALLOWED + } + + if (!ALLOW_INSECURE_CONNECTIONS && !SUPPORTED_PROVIDER_PROTOCOLS.includes(protocol)) { + return HTTPS_REQUIRED + } + + providersApi.connect(reportError) + const providerService: ProvidersService = providersApi as ProvidersService + const urlIsRegistered: boolean = await providerService.isRegisteredURL(providerURL.hostname) + + const notifierService: SubscriptionPlans = new SubscriptionPlans(url) + notifierService.connect(reportError) + const hasActivePlans = Boolean((await notifierService.getActivePlans()).length) + const urlMessage = !urlIsRegistered ? '' : URL_ALREADY_REGISTERED + const planMessage = hasActivePlans ? '' : NO_AVAILABLE_SUBSCRIPTION_PLAN + + return (!urlIsRegistered && hasActivePlans) || urlMessage || planMessage + } + + return ( + + + +
+ + + + + + + { + errors.endpointUrl && ( + + {errors.endpointUrl.message || 'Endpoint url is required'} + + ) + } + + + + + {buttonLabel ?? 'Register Provider'} + + + {`Your wallet will open and you will be asked to confirm + the transaction for listing your service.`} + + + + +
+
+
+
+ ) +} + +export default ProviderRegistrarForm diff --git a/src/components/organisms/plans/PlanView.tsx b/src/components/organisms/plans/PlanView.tsx new file mode 100644 index 000000000..15df6a12a --- /dev/null +++ b/src/components/organisms/plans/PlanView.tsx @@ -0,0 +1,97 @@ +import React, { useState } from 'react' +import { makeStyles, TableContainer, Typography } from '@material-ui/core' +import Accordion, { AccordionProps } from '@material-ui/core/Accordion' +import { colors } from '@rsksmart/rif-ui' +import ActiveContracts from 'components/molecules/plans/ActiveContracts' +import PlanViewSummary, { PlanViewSummaryProps } from 'components/molecules/plans/PlanViewSummary' +import Marketplace, { TableHeaders } from 'components/templates/marketplace/Marketplace' + +const usePlanStyles = makeStyles({ + root: { + width: '100%', + border: `1px solid ${colors.gray3}`, + borderRadius: 15, + boxShadow: 'none', + '&:before': { + display: 'none', + }, + '&:last-child': { + borderRadius: 15, + }, + '&:first-child': { + borderRadius: 15, + }, + }, +}) + +type Props = Omit & { + summary: Omit + editButton: React.ReactElement + cancelButton: React.ReactElement + isTableLoading: boolean + headers: H + activeContracts: Array<{ id: string } & { + [K in keyof H]: React.ReactElement + }> +} + +const PlanView = ({ + summary: { name, ...summaryProps }, + editButton, + cancelButton, + isTableLoading, + headers, + activeContracts, + ...accordionProps +}: Props): JSX.Element => { + const [isExpanded, setIsExpanded] = useState(false) + const hasActiveContracts = Boolean(activeContracts.length) + + return ( + { setIsExpanded(!isExpanded) }} + {...accordionProps} + > + + + { + !hasActiveContracts + && ( + + No active contracts yet + + ) + } + { + hasActiveContracts + && ( + + + + ) + } + + + ) +} + +export default PlanView diff --git a/src/components/organisms/storage/staking/DepositModal.tsx b/src/components/organisms/staking/DepositModal.tsx similarity index 95% rename from src/components/organisms/storage/staking/DepositModal.tsx rename to src/components/organisms/staking/DepositModal.tsx index 38fdd43a5..41997ed2e 100644 --- a/src/components/organisms/storage/staking/DepositModal.tsx +++ b/src/components/organisms/staking/DepositModal.tsx @@ -3,7 +3,6 @@ import Divider from '@material-ui/core/Divider' import { createStyles, makeStyles, Theme } from '@material-ui/core/styles' import Typography from '@material-ui/core/Typography' import { Button, ModalDialogue, Web3Store } from '@rsksmart/rif-ui' -import { StakedBalances as StakedBalancesProp } from 'api/rif-marketplace-cache/storage/stakes' import AmountWithCurrencySelect from 'components/molecules/AmountWithCurrencySelect' import CenteredContent from 'components/molecules/CenteredContent' import React, { @@ -12,8 +11,13 @@ import React, { import Big from 'big.js' import { getBalance } from 'contracts/utils/accountBalance' import { convertToWeiString } from 'utils/parsers' -import { SupportedTokenSymbol, SYSTEM_SUPPORTED_SYMBOL, SYSTEM_TOKENS } from 'models/Token' +import { + SupportedTokenSymbol, SYSTEM_SUPPORTED_SYMBOL, SYSTEM_TOKENS, +} from 'models/Token' import NotEnoughFunds from 'components/atoms/NotEnoughFunds' +import { + StakedBalances as StakedBalancesProp, +} from 'api/rif-marketplace-cache/common/stakes' import StakedBalances from './StakedBalances' export interface DepositModalProps { diff --git a/src/components/organisms/storage/staking/StakedBalances.tsx b/src/components/organisms/staking/StakedBalances.tsx similarity index 95% rename from src/components/organisms/storage/staking/StakedBalances.tsx rename to src/components/organisms/staking/StakedBalances.tsx index 013ce4032..42d0d895f 100644 --- a/src/components/organisms/storage/staking/StakedBalances.tsx +++ b/src/components/organisms/staking/StakedBalances.tsx @@ -1,4 +1,4 @@ -import { StakedBalances as StakedBalancesProp } from 'api/rif-marketplace-cache/storage/stakes' +import { StakedBalances as StakedBalancesProp } from 'api/rif-marketplace-cache/common/stakes' import LabelWithValue from 'components/atoms/LabelWithValue' import React, { FC } from 'react' import { getTokenByString } from 'utils/tokenUtils' diff --git a/src/components/organisms/storage/staking/StakingCard.tsx b/src/components/organisms/staking/StakingCard.tsx similarity index 97% rename from src/components/organisms/storage/staking/StakingCard.tsx rename to src/components/organisms/staking/StakingCard.tsx index cf7932b01..de2f7a2ab 100644 --- a/src/components/organisms/storage/staking/StakingCard.tsx +++ b/src/components/organisms/staking/StakingCard.tsx @@ -2,7 +2,7 @@ import { Box, Grid, Typography } from '@material-ui/core' import { makeStyles, createStyles } from '@material-ui/core/styles' import { Button } from '@rsksmart/rif-ui' import GridItem from 'components/atoms/GridItem' -import StakingBalance from 'components/molecules/storage/StakingBalance' +import StakingBalance from 'components/molecules/staking/StakingBalance' import React, { FC } from 'react' export type StakingCardProps = { diff --git a/src/components/organisms/staking/StakingTemplate.tsx b/src/components/organisms/staking/StakingTemplate.tsx new file mode 100644 index 000000000..4eb3b917c --- /dev/null +++ b/src/components/organisms/staking/StakingTemplate.tsx @@ -0,0 +1,153 @@ +import Box from '@material-ui/core/Box' +import Grow from '@material-ui/core/Grow' +import Typography from '@material-ui/core/Typography' +import { makeStyles, Theme } from '@material-ui/core/styles' +import { colors } from '@rsksmart/rif-ui' +import StakingFab from 'components/molecules/staking/StakingFab' +import React, { FC, useState } from 'react' +import { StakedBalances } from 'api/rif-marketplace-cache/common/stakes' +import { SupportedTokenSymbol } from 'models/Token' +import DepositModal from './DepositModal' +import WithdrawModal from './WithdrawModal' +import StakingCard from './StakingCard' + +export type StakingTemplateProps = { + checkCanWithdraw: () => Promise + isEnabled: boolean + isProcessing: boolean + stakedBalances: StakedBalances + totalStakedUSD: string + onDeposit: (amount: number, currency: SupportedTokenSymbol) => Promise + onWithdraw: (amount: number, currency: SupportedTokenSymbol) => Promise + cantWithdrawMessage?: string + bringToFront?: boolean +} + +const stakingIconSize = 10 + +const useStyles = makeStyles((theme: Theme) => ({ + wrapper: { + position: 'relative', + }, + root: { + display: 'flex', + justifyContent: 'flex-end', + [theme.breakpoints.up('md')]: { + width: '60%', + }, + [theme.breakpoints.down('md')]: { + width: '100%', + }, + right: 0, + position: 'absolute', + }, + bringToFront: { + zIndex: 99, + }, + cardWrapper: { + maxWidth: '600px', + width: '100%', + }, + infoContainer: { + border: `${colors.primary} 1px solid`, + alignItems: 'center', + borderRadius: '50px 0px 0px 50px', + paddingRight: theme.spacing(stakingIconSize / 2), + backgroundColor: colors.white, + whiteSpace: 'nowrap', + height: theme.spacing(stakingIconSize), + }, + stakingIcon: { + height: theme.spacing(stakingIconSize), + minWidth: theme.spacing(stakingIconSize), + marginLeft: -theme.spacing(stakingIconSize / 2), + }, + fabTitle: { + position: 'absolute', + top: '-25px', + right: '15px', + }, +})) + +const StakingTemplate: FC = (props) => { + const { + checkCanWithdraw, + isEnabled, + isProcessing, + stakedBalances, + totalStakedUSD, + onDeposit, + onWithdraw, + cantWithdrawMessage = 'You cannot withdraw your funds.', + bringToFront, + } = props + const classes = useStyles() + + const [isExpanded, setIsExpanded] = useState(false) + const [depositOpened, setDepositOpened] = useState(false) + const [withdrawOpened, setWithdrawOpened] = useState(false) + + const handleWithdraw = async ( + amount: number, currency: SupportedTokenSymbol, + ): Promise => { + await onWithdraw(amount, currency) + setWithdrawOpened(false) + } + + const handleDeposit = async ( + amount: number, currency: SupportedTokenSymbol, + ): Promise => { + await onDeposit(amount, currency) + setDepositOpened(false) + } + + return ( +
+
+ + + Staking + + + +
+ setDepositOpened(true)} + onWithdrawClicked={(): void => setWithdrawOpened(true)} + totalStakedUSD={totalStakedUSD || '0.00'} + isAwaitingConfirmations={isProcessing} + /> +
+
+ setIsExpanded((exp) => !exp)} + /> +
+ setDepositOpened(false)} + /> + setWithdrawOpened(false)} + open={withdrawOpened} + onWithdraw={handleWithdraw} + totalStakedUSD={totalStakedUSD} + stakes={stakedBalances} + cantWithdrawMessage={cantWithdrawMessage} + /> +
+ ) +} + +export default StakingTemplate diff --git a/src/components/organisms/storage/staking/WithdrawModal.tsx b/src/components/organisms/staking/WithdrawModal.tsx similarity index 82% rename from src/components/organisms/storage/staking/WithdrawModal.tsx rename to src/components/organisms/staking/WithdrawModal.tsx index ab53976a9..753e6d10d 100644 --- a/src/components/organisms/storage/staking/WithdrawModal.tsx +++ b/src/components/organisms/staking/WithdrawModal.tsx @@ -4,7 +4,9 @@ import { import Box from '@material-ui/core/Box' import Typography from '@material-ui/core/Typography' import { Button, ModalDialogue } from '@rsksmart/rif-ui' -import { StakedBalances as StakedBalancesProp } from 'api/rif-marketplace-cache/storage/stakes' +import { + StakedBalances as StakedBalancesProp, +} from 'api/rif-marketplace-cache/common/stakes' import AmountWithCurrencySelect from 'components/molecules/AmountWithCurrencySelect' import CenteredContent from 'components/molecules/CenteredContent' import { SupportedTokenSymbol, SYSTEM_SUPPORTED_SYMBOL } from 'models/Token' @@ -15,9 +17,10 @@ export interface WithdrawModalProps { open: boolean onClose: () => void onWithdraw: (amount: number, currency: SupportedTokenSymbol) => void - canWithdraw: boolean totalStakedUSD: string stakes: StakedBalancesProp + checkCanWithdraw: () => Promise + cantWithdrawMessage: string } const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -27,16 +30,30 @@ const useStyles = makeStyles((theme: Theme) => createStyles({ })) const WithdrawModal: FC = ({ - open, onClose, onWithdraw, canWithdraw, totalStakedUSD, stakes, + open, onClose, onWithdraw, + totalStakedUSD, stakes, + checkCanWithdraw, + cantWithdrawMessage = 'You cannot withdraw your funds.', }) => { const classes = useStyles() const currencyOptions: SupportedTokenSymbol[] = [SYSTEM_SUPPORTED_SYMBOL.rbtc, SYSTEM_SUPPORTED_SYMBOL.rif] const [selectedCurrency, setSelectedCurrency] = useState(SYSTEM_SUPPORTED_SYMBOL.rbtc) const [amountToWithdraw, setAmountToWithdraw] = useState(undefined) + const [withdrawEnabled, setWithdrawEnabled] = useState(true) + const [isCheckingWithdraw, setIsCheckingWithdraw] = useState(false) useEffect(() => { + const handleModalOpened = async (): Promise => { + setIsCheckingWithdraw(true) + setWithdrawEnabled(await checkCanWithdraw()) + setIsCheckingWithdraw(false) + } + + if (open) { + handleModalOpened() + } setAmountToWithdraw(undefined) - }, [open]) + }, [open, checkCanWithdraw]) const handleCurrencyChange = ({ target: { value }, @@ -54,7 +71,7 @@ const WithdrawModal: FC = ({ onWithdraw(Number(amountToWithdraw), selectedCurrency) } - const disableWithdrawAction = !canWithdraw + const disableWithdrawAction = isCheckingWithdraw || !withdrawEnabled || !amountToWithdraw || amountToWithdraw <= 0 || amountToWithdraw > Number(stakes[selectedCurrency]) @@ -124,13 +141,12 @@ const WithdrawModal: FC = ({ diff --git a/src/components/organisms/storage/buy/StoragePurchaseCard.tsx b/src/components/organisms/storage/buy/StoragePurchaseCard.tsx index 964e60c2d..e1777e0b6 100644 --- a/src/components/organisms/storage/buy/StoragePurchaseCard.tsx +++ b/src/components/organisms/storage/buy/StoragePurchaseCard.tsx @@ -7,20 +7,21 @@ import { Web3Store } from '@rsksmart/rif-ui' import GridColumn from 'components/atoms/GridColumn' import Login from 'components/atoms/Login' import RifCard from 'components/organisms/RifCard' -import RoundBtn, { RoundBtnProps } from 'components/atoms/RoundBtn' +import { ButtonProps } from '@material-ui/core/Button' +import RoundBtn from 'components/atoms/RoundBtn' type Details = { - 'CONTENT SIZE': string - 'CURRENCY TO PAY': JSX.Element - 'SUBSCRIPTION PERIOD': JSX.Element - 'PERIODS TO PREPAY': JSX.Element - 'TOTAL PRICE': JSX.Element | null - 'RENEWAL DATE': string - } + 'CONTENT SIZE': string + 'CURRENCY TO PAY': JSX.Element + 'SUBSCRIPTION PERIOD': JSX.Element + 'PERIODS TO PREPAY': JSX.Element + 'TOTAL PRICE': JSX.Element | null + 'RENEWAL DATE': string +} type Props = { details: Details - submitProps: RoundBtnProps + submitProps: ButtonProps title: string } diff --git a/src/components/organisms/storage/sell/BillingPlan.tsx b/src/components/organisms/storage/sell/BillingPlan.tsx index 7d3cbe9c0..7e65ca945 100644 --- a/src/components/organisms/storage/sell/BillingPlan.tsx +++ b/src/components/organisms/storage/sell/BillingPlan.tsx @@ -7,7 +7,7 @@ import ClearIcon from '@material-ui/icons/Clear' import EditIcon from '@material-ui/icons/Edit' import { colors, TooltipIconButton } from '@rsksmart/rif-ui' import { StorageBillingPlan } from 'context/Market/storage/interfaces' -import { priceDisplay } from 'utils/utils' +import { getFiatPrice } from 'utils/priceUtils' import ItemWUnit from 'components/atoms/ItemWUnit' import { MarketCryptoRecord } from 'models/Market' @@ -40,10 +40,9 @@ const BillingPlan: FC = ({ const classes = useStyles() const { period, price, currency } = billingPlan - const { rate } = cryptoXRs[currency.symbol] - const fiatPrice = (price.mul(rate)) + const rateToken = cryptoXRs[currency.symbol] - const fiatPriceDisplay = priceDisplay(fiatPrice, 2) + const fiatPriceDisplay = getFiatPrice(price, rateToken) return ( diff --git a/src/components/organisms/storage/sell/BillingPlansList.tsx b/src/components/organisms/storage/sell/BillingPlansList.tsx index 732c6f082..c031dfbdc 100644 --- a/src/components/organisms/storage/sell/BillingPlansList.tsx +++ b/src/components/organisms/storage/sell/BillingPlansList.tsx @@ -1,12 +1,18 @@ -import React, { FC, useContext } from 'react' import Grid from '@material-ui/core/Grid' +import { makeStyles, Theme } from '@material-ui/core/styles' import Typography from '@material-ui/core/Typography' -import { StorageBillingPlan } from 'context/Market/storage/interfaces' +import { colors, fonts, Web3Store } from '@rsksmart/rif-ui' import BillingPlanWithEdit from 'components/organisms/storage/sell/BillingPlanWithEdit' import MarketContext from 'context/Market' -import { Theme, makeStyles } from '@material-ui/core/styles' -import { colors, fonts } from '@rsksmart/rif-ui' +import { StorageBillingPlan } from 'context/Market/storage/interfaces' +import { storageSupportedTokens } from 'contracts/config' +import { SUPPORTED_TOKEN_RECORDS } from 'contracts/interfaces' +import { StorageContract } from 'contracts/storage' +import { MarketCryptoRecord } from 'models/Market' import { BillingPlan, PeriodInSeconds } from 'models/marketItems/StorageItem' +import { SupportedTokenSymbol } from 'models/Token' +import React, { FC, useContext } from 'react' +import Web3 from 'web3' import EditableBillingPlan from './EditableBillingPlan' const useStyles = makeStyles((theme: Theme) => ({ @@ -40,6 +46,10 @@ const BillingPlansList: FC = ( }, ) => { const classes = useStyles() + const { + state: { account, web3 }, + } = useContext(Web3Store) + const storageContract = StorageContract.getInstance(web3 as Web3) const { state: { @@ -50,6 +60,19 @@ const BillingPlansList: FC = ( }, } = useContext(MarketContext) + const availableXRTokens: MarketCryptoRecord = Object.keys(cryptoXRs) + .reduce((acc, symbol) => { + if (storageSupportedTokens.includes(symbol as SupportedTokenSymbol) + && storageContract.isWhitelistedToken( + SUPPORTED_TOKEN_RECORDS[symbol], + { from: account }, + )) { + acc[symbol] = cryptoXRs[symbol] + } + + return acc + }, {} as MarketCryptoRecord) + return ( <> @@ -86,7 +109,7 @@ const BillingPlansList: FC = ( (billingPlan: StorageBillingPlan) => ( onItemRemoved(billingPlan)} diff --git a/src/components/organisms/storage/sell/OfferCreation.tsx b/src/components/organisms/storage/sell/OfferCreation.tsx index 0fc43da0b..665af86f6 100644 --- a/src/components/organisms/storage/sell/OfferCreation.tsx +++ b/src/components/organisms/storage/sell/OfferCreation.tsx @@ -11,13 +11,12 @@ import { UIError } from 'models/UIMessage' import Login from 'components/atoms/Login' import { useHistory } from 'react-router-dom' import ROUTES from 'routes' -import Big from 'big.js' import AppContext, { errorReporterFactory } from 'context/App' import EditOfferStepper from 'components/organisms/storage/sell/EditOfferStepper' import RoundedCard from 'components/atoms/RoundedCard' import { transformOfferDataForContract } from 'contracts/storage/utils' import { StorageGlobalContext, StorageGlobalContextProps } from 'context/Services/storage' -import NoWhitelistedProvider from 'components/molecules/storage/NoWhitelistedProvider' +import NoWhitelistedProvider from 'components/molecules/NoWhitelistedProvider' import { StorageOffersService } from 'api/rif-marketplace-cache/storage/offers' import { StorageOffer } from 'models/marketItems/StorageItem' import { OfferEditContextProps } from 'context/Market/storage' @@ -27,9 +26,6 @@ import { NewRequestPayload } from 'context/Confirmations/interfaces' import ProgressOverlay from 'components/templates/ProgressOverlay' import RoundBtn from 'components/atoms/RoundBtn' -// TODO: discuss about wrapping the library and export it with this change -Big.NE = -30 - const logger = Logger.getInstance() const useStyles = makeStyles((theme: Theme) => ({ @@ -181,7 +177,7 @@ const OfferCreation: FC = () => { { Boolean(account) && isWhitelistedProvider === false // we don't want to show the message on undefined - && + && } diff --git a/src/components/organisms/storage/staking/Staking.tsx b/src/components/organisms/storage/staking/Staking.tsx index 62502cbba..522aa207b 100644 --- a/src/components/organisms/storage/staking/Staking.tsx +++ b/src/components/organisms/storage/staking/Staking.tsx @@ -1,11 +1,7 @@ import React, { FC, useCallback, useContext, useState, } from 'react' -import { createStyles, makeStyles, Theme } from '@material-ui/core/styles' -import { - Box, Grow, Typography, -} from '@material-ui/core' -import { colors, Web3Store } from '@rsksmart/rif-ui' +import { Web3Store } from '@rsksmart/rif-ui' import AppContext, { AppContextProps, errorReporterFactory, } from 'context/App' @@ -15,67 +11,23 @@ import Web3 from 'web3' import { StakingContract, StorageContract } from 'contracts/storage' import { Props as StakingContextProps, -} from 'context/Services/storage/staking/interfaces' -import StakingFab from 'components/molecules/storage/StakingFab' -import withStakingContext, { Context } - from 'context/Services/storage/staking/Context' +} from 'context/Services/staking/interfaces' import RoundBtn from 'components/atoms/RoundBtn' import ProgressOverlay from 'components/templates/ProgressOverlay' import { SupportedTokenSymbol } from 'models/Token' import { StorageGlobalContext, StorageGlobalContextProps } from 'context/Services/storage' import useConfirmations from 'hooks/useConfirmations' import { ConfirmationsContext, ConfirmationsContextProps } from 'context/Confirmations' -import DepositModal from './DepositModal' -import WithdrawModal from './WithdrawModal' -import StakingCard from './StakingCard' +import StakingTemplate from 'components/organisms/staking/StakingTemplate' +import { Context } from 'context/Services/staking/Context' +import { withStakingContext } from 'context/Services/staking' const logger = Logger.getInstance() -const stakingIconSize = 10 - -const useStyles = makeStyles((theme: Theme) => createStyles({ - wrapper: { - position: 'relative', - }, - root: { - display: 'flex', - justifyContent: 'flex-end', - width: '100%', - right: 0, - position: 'absolute', - zIndex: 99, - }, - cardWrapper: { - maxWidth: '550px', - width: '100%', - }, - infoContainer: { - border: `${colors.primary} 1px solid`, - alignItems: 'center', - borderRadius: '50px 0px 0px 50px', - paddingRight: theme.spacing(stakingIconSize / 2), - backgroundColor: colors.white, - whiteSpace: 'nowrap', - height: theme.spacing(stakingIconSize), - }, - stakingIcon: { - height: theme.spacing(stakingIconSize), - minWidth: theme.spacing(stakingIconSize), - marginLeft: -theme.spacing(stakingIconSize / 2), - }, - fabTitle: { - position: 'absolute', - top: '-25px', - right: '15px', - }, -})) - const stakeInProgressMsg = 'Staking your funds' const unstakeInProgressMsg = 'Unstaking your funds' const Staking: FC = () => { - const classes = useStyles() - const { state: { account, @@ -104,19 +56,15 @@ const Staking: FC = () => { } = useContext(StorageGlobalContext) const isAwaitingConfirmations = Boolean( - useConfirmations(['STAKING_STAKE', 'STAKING_UNSTAKE']).length, + useConfirmations(['STORAGE_STAKE', 'STORAGE_UNSTAKE']).length, ) - const [isExpanded, setIsExpanded] = useState(false) - const [canWithdraw, setCanWithdraw] = useState(false) - const [depositOpened, setDepositOpened] = useState(false) - const [withdrawOpened, setWithdrawOpened] = useState(false) const [txInProgressMessage, setTxInProgressMessage] = useState('') const [txCompleteMsg, setTxCompleteMsg] = useState('') const [processingTx, setProcessingTx] = useState(false) const [txOperationDone, setTxOperationDone] = useState(false) - const isEnabled = account && isWhitelistedProvider + const isEnabled = Boolean(account && isWhitelistedProvider) const handleTxCompletedClose = (): void => { setProcessingTx(false) @@ -130,7 +78,6 @@ const Staking: FC = () => { setTxInProgressMessage(stakeInProgressMsg) setProcessingTx(true) setTxCompleteMsg('Your funds have been staked!') - setDepositOpened(false) const stakeContract = StakingContract.getInstance(web3 as Web3) const receipt = await stakeContract.stake( @@ -149,7 +96,7 @@ const Staking: FC = () => { confirmationsDispatch({ type: 'NEW_REQUEST', payload: { - contractAction: 'STAKING_STAKE', + contractAction: 'STORAGE_STAKE', txHash: receipt.transactionHash, }, }) @@ -174,7 +121,6 @@ const Staking: FC = () => { setTxInProgressMessage(unstakeInProgressMsg) setProcessingTx(true) setTxCompleteMsg('Your funds have been unstaked!') - setWithdrawOpened(false) const stakeContract = StakingContract.getInstance(web3 as Web3) const receipt = await stakeContract.unstake( amount, { token: currency, from: account }, @@ -185,7 +131,7 @@ const Staking: FC = () => { confirmationsDispatch({ type: 'NEW_REQUEST', payload: { - contractAction: 'STAKING_UNSTAKE', + contractAction: 'STORAGE_UNSTAKE', txHash: receipt.transactionHash, }, }) @@ -202,61 +148,30 @@ const Staking: FC = () => { } } - const handleOpenWithdraw = async (): Promise => { - if (!web3 || !account) return + const canWithdraw = async (): Promise => { + if (!web3 || !account) return false const storageContract = StorageContract.getInstance(web3 as Web3) const hasUtilizedCapacity = await storageContract.hasUtilizedCapacity( account as string, { from: account }, ) - setCanWithdraw(Boolean(!hasUtilizedCapacity)) - setWithdrawOpened(true) + return !hasUtilizedCapacity } - const handleExpandClick = (): void => setIsExpanded((exp) => !exp) - return ( -
-
- - - Staking - - - -
- setDepositOpened(true)} - onWithdrawClicked={handleOpenWithdraw} - totalStakedUSD={totalStakedUSD || '0.00'} - isAwaitingConfirmations={isAwaitingConfirmations} - /> -
-
- -
- + setDepositOpened(false)} - /> - setWithdrawOpened(false)} - open={withdrawOpened} onWithdraw={handleWithdraw} - totalStakedUSD={totalStakedUSD} - stakes={stakes} + cantWithdrawMessage={ + `You cannot withdraw funds because all your contracts are running. + Please wait until your contract finish` + } + bringToFront /> { ]} /> -
+ ) } -export default withStakingContext(Staking) +export default withStakingContext(Staking, 'storage/v0/stakes') diff --git a/src/components/organisms/tracking/PrivacySettingsModal.tsx b/src/components/organisms/tracking/PrivacySettingsModal.tsx index 045c2f204..3e2535d57 100644 --- a/src/components/organisms/tracking/PrivacySettingsModal.tsx +++ b/src/components/organisms/tracking/PrivacySettingsModal.tsx @@ -10,12 +10,11 @@ import useTracking from 'hooks/useTracking' import Logger from 'utils/Logger' import { TRACKING_DATA_DOMAIN } from 'config' import makeStyles from '@material-ui/core/styles/makeStyles' -import { Theme } from '@material-ui/core/styles/createMuiTheme' import Portal from '@material-ui/core/Portal/Portal' import Box from '@material-ui/core/Box/Box' import Typography from '@material-ui/core/Typography/Typography' import Link from '@material-ui/core/Link/Link' -import createStyles from '@material-ui/core/styles/createStyles' +import { Theme, createStyles } from '@material-ui/core/styles' const useStyles = makeStyles((theme: Theme) => createStyles({ root: { diff --git a/src/components/organisms/transactions/TransactionItem.tsx b/src/components/organisms/transactions/TransactionItem.tsx index 5dcb1d452..2fdbd1258 100644 --- a/src/components/organisms/transactions/TransactionItem.tsx +++ b/src/components/organisms/transactions/TransactionItem.tsx @@ -84,7 +84,7 @@ const TransactionItem: FC = ({ - + {renderProgress()} diff --git a/src/components/organisms/transactions/TransactionsList.tsx b/src/components/organisms/transactions/TransactionsList.tsx index 39f0533c3..e7b5bc1ca 100644 --- a/src/components/organisms/transactions/TransactionsList.tsx +++ b/src/components/organisms/transactions/TransactionsList.tsx @@ -1,3 +1,4 @@ +import Container from '@material-ui/core/Container' import Divider from '@material-ui/core/Divider' import List from '@material-ui/core/List' import ListItem from '@material-ui/core/ListItem' @@ -16,17 +17,16 @@ const TransactionsList: FC = ({ confirmations }) => { { Object.keys(confirmations).map((txHash, i) => ( - <> + {Boolean(i) && } - + )) } diff --git a/src/components/pages/UncaughtError.tsx b/src/components/pages/UncaughtError.tsx index f829a5f17..5a2ef3201 100644 --- a/src/components/pages/UncaughtError.tsx +++ b/src/components/pages/UncaughtError.tsx @@ -3,22 +3,39 @@ import React, { FC } from 'react' import lostAstronaut from 'assets/images/lostAstronaut.png' import GridRow from 'components/atoms/GridRow' import RoundBtn from 'components/atoms/RoundBtn' +import { makeStyles, Theme } from '@material-ui/core/styles' -const UncaughtError: FC = () => ( - - - { - window.location.href = window.location.origin - }} - > - Go to Home Page - - lost astronaut - - -) +const useStyles = makeStyles((theme: Theme) => ({ + img: { + width: '100%', + maxWidth: theme.spacing(150), + }, +})) + +const UncaughtError: FC = () => { + const classes = useStyles() + return ( + + + { + window.location.href = window.location.origin + }} + > + Go to Home Page + + + + lost astronaut + + + ) +} export default UncaughtError diff --git a/src/components/pages/triggers/TriggersLandingPage.tsx b/src/components/pages/notifier/NotifierLandingPage.tsx similarity index 94% rename from src/components/pages/triggers/TriggersLandingPage.tsx rename to src/components/pages/notifier/NotifierLandingPage.tsx index 1e8e5dc54..a7eb4a28d 100644 --- a/src/components/pages/triggers/TriggersLandingPage.tsx +++ b/src/components/pages/notifier/NotifierLandingPage.tsx @@ -3,8 +3,8 @@ import Icon, { Icons } from 'components/atoms/Icon' import SideImageTemplate from 'components/templates/SideImageTemplate' import React, { FC } from 'react' -const TriggersLandingPage: FC = () => { - const icon = +const NotifierLandingPage: FC = () => { + const icon = const sideText = ( <> @@ -64,4 +64,4 @@ const TriggersLandingPage: FC = () => { ) } -export default TriggersLandingPage +export default NotifierLandingPage diff --git a/src/components/pages/notifier/NotifierRoutes.tsx b/src/components/pages/notifier/NotifierRoutes.tsx new file mode 100644 index 000000000..e89f13784 --- /dev/null +++ b/src/components/pages/notifier/NotifierRoutes.tsx @@ -0,0 +1,130 @@ +import React, { FC, useEffect } from 'react' +import { + Redirect, Route, Switch, useHistory, useLocation, +} from 'react-router-dom' +import networkConfig from 'config' +import ROUTES from 'routes' +import Logger from 'utils/Logger' +import TabsTemplate from 'components/templates/TabsTemplate' +import { getTabValueFromLocation } from 'utils/utils' +import { NotifierOffersContextProvider } from 'context/Services/notifier/offers' +import NotifierLandingPage from './NotifierLandingPage' +import { NotFound } from '..' +import NotifierOfferCheckoutPage from './buy/NotifierOfferCheckoutPage' +import NotifierOffersPage from './buy/NotifierOffersPage' +import NotifierMyOffersPage from './myoffers/NotifierMyOffersPage' +import NotifierMyPurchasePage from './mypurchase/NotifierMyPurchasePage' +import { buildTabs } from '../routerUtils' +import NotifierEditOfferPage from './myoffers/NotifierEditOfferPage' +import NotifierSellPage from './sell/NotifierSellPage' + +const logger = Logger.getInstance() + +const TABS = buildTabs([ + { label: 'Buy', value: ROUTES.NOTIFIER.BUY.BASE }, + { label: 'Sell', value: ROUTES.NOTIFIER.SELL.BASE }, + { label: 'My offers', value: ROUTES.NOTIFIER.MYOFFERS.BASE }, + { label: 'My purchases', value: ROUTES.NOTIFIER.MYPURCHASES.BASE }, +]) + +const DeadEndRoute = // TODO: Move to utils and abstract in uses across the app +const NotifierRoutes: FC = () => { + const { pathname } = useLocation() + const { services } = networkConfig + const notifierEnabled = services && services.notifier + const history = useHistory() + + useEffect(() => { + // TODO: wrap this code block to be excecuted only on debugging + const unlisten = history.listen((location, action) => { + logger.debug('NotifierRoutes -> location', location) + logger.debug('NotifierRoutes -> action', action) + }) + return (): void => { + unlisten() + } + }, [history]) + + if (notifierEnabled) { + return ( + + + + + + {/* Buy */} + + + + + + {DeadEndRoute} + + + + {/* MyOffers */} + + + + + {DeadEndRoute} + + + {/* Sell */} + + {/* My purchases */} + + {DeadEndRoute} + + + + ) + } + + return ( + + + + + ) +} + +export default NotifierRoutes diff --git a/src/components/pages/notifier/buy/NotifierOfferCheckoutPage.tsx b/src/components/pages/notifier/buy/NotifierOfferCheckoutPage.tsx new file mode 100644 index 000000000..9e7666cd9 --- /dev/null +++ b/src/components/pages/notifier/buy/NotifierOfferCheckoutPage.tsx @@ -0,0 +1,185 @@ +import React, { + FC, useContext, useState, +} from 'react' +import Grid from '@material-ui/core/Grid' +import Typography from '@material-ui/core/Typography' +import { + NotifierOffersContextProps as ContextProps, + NotifierOffersContext, +} from 'context/Services/notifier/offers' +import CenteredPageTemplate from 'components/templates/CenteredPageTemplate' +import NotifierPlanDescription from 'components/organisms/notifier/NotifierPlanDescription' +import MarketContext, { MarketContextProps } from 'context/Market' +import CheckoutStepper from 'components/organisms/notifier/buy/CheckoutStepper' +import { NotifierEventItem } from 'models/marketItems/NotifierEventItem' +import NotifierContract from 'contracts/notifier/Notifier' +import Web3 from 'web3' +import { Web3Store } from '@rsksmart/rif-ui' +import useErrorReporter from 'hooks/useErrorReporter' +import ProgressOverlay from 'components/templates/ProgressOverlay' +import RoundBtn from 'components/atoms/RoundBtn' +import ROUTES from 'routes' +import { useHistory } from 'react-router-dom' +import { ConfirmationsContext } from 'context/Confirmations' +import { convertToWeiString } from 'utils/parsers' +import WithLoginCard from 'components/hoc/WithLoginCard' +import { getOrCreateSubscription } from 'api/rif-notifier-service/subscriptionUtils' + +const NotifierOfferCheckoutPage: FC = () => { + const { + state: { account, web3 }, + } = useContext(Web3Store) + const { + state: { + exchangeRates: { + currentFiat: { + displayName: currentFiat, + }, + crypto, + }, + }, + } = useContext(MarketContext) + const { dispatch: confirmationsDispatch } = useContext(ConfirmationsContext) + + const { + state: { + order, + }, + } = useContext(NotifierOffersContext) + const reportError = useErrorReporter() + const history = useHistory() + + const [isProcessingTx, setIsProcessingTx] = useState(false) + const [txOperationDone, setTxOperationDone] = useState(false) + const [eventsAdded, setEventsAdded] = useState([]) + + if (!order?.item) { + history.push(ROUTES.NOTIFIER.BUY.BASE) + return null + } + + const handleEventRemoved = ( + { id: notifierEventId }: NotifierEventItem, + ): void => { + const filteredEvents = eventsAdded.filter( + ({ id }) => id !== notifierEventId, + ) + setEventsAdded(filteredEvents) + } + + const handleEventItemAdded = ( + eventItem: NotifierEventItem, + ): void => { + setEventsAdded([...eventsAdded, eventItem]) + } + + const handleOnBuy = async (): Promise => { + if (!account) return // wrapped with withLoginCard + try { + setIsProcessingTx(true) + + const { item } = order + const { + provider: providerAddress, + value: amount, + token, + planId, + url, + } = item + + const { symbol, tokenAddress } = token + + const { + hash: subscriptionHash, signature, + } = await getOrCreateSubscription({ + planId, symbol, url, value: amount, + }, eventsAdded, account, reportError) + + if (!subscriptionHash) return + + const purchaseReceipt = await NotifierContract.getInstance(web3 as Web3) + .createSubscription( + { + subscriptionHash, + providerAddress, + signature, + amount, + tokenAddress, + }, + { + from: account, + value: convertToWeiString(amount), + }, + ) + + if (purchaseReceipt) { + setTxOperationDone(true) + confirmationsDispatch({ + type: 'NEW_REQUEST', + payload: { + contractAction: 'NOTIFIER_CREATE_SUBSCRIPTION', + txHash: purchaseReceipt.transactionHash, + }, + }) + } + } catch (error) { + const { customMessage } = error + reportError({ + error, + id: 'contract-notifier', + text: customMessage || 'Could not complete the order', + }) + } finally { + setIsProcessingTx(false) + } + } + + return ( + + + + Notification plan selected + + + + + history.push(ROUTES.NOTIFIER.MYPURCHASES.BASE) + } + > + View my purchases + , + history.push(ROUTES.NOTIFIER.BUY.BASE) + } + > + View offers listing + , + ]} + + /> + + ) +} + +export default WithLoginCard({ + WrappedComponent: NotifierOfferCheckoutPage, + title: 'Please, connect your wallet.', + contentText: 'Connect your wallet in order to proceed to the checkout.', +}) diff --git a/src/components/pages/notifier/buy/NotifierOffersPage.tsx b/src/components/pages/notifier/buy/NotifierOffersPage.tsx new file mode 100644 index 000000000..b1971a30b --- /dev/null +++ b/src/components/pages/notifier/buy/NotifierOffersPage.tsx @@ -0,0 +1,218 @@ +import Tooltip from '@material-ui/core/Tooltip' +import Typography from '@material-ui/core/Typography' +import { Web3Store } from '@rsksmart/rif-ui' +import SubscriptionPlans from 'api/rif-notifier-service/subscriptionPlans' +import ItemWUnit from 'components/atoms/ItemWUnit' +import { AddressItem, SelectRowButton } from 'components/molecules' +import NotifierOffersFilters from 'components/organisms/filters/notifier/OffersFilters' +import NotifierPlansDraw from 'components/organisms/notifier/NotifierPlansDraw' +import MarketPageTemplate from 'components/templates/MarketPageTemplate' +import { MarketplaceItem, TableHeaders } from 'components/templates/marketplace/Marketplace' +import MarketContext, { MarketContextProps } from 'context/Market' +import { NotifierOffersContext, NotifierOffersContextProps } from 'context/Services/notifier/offers' +import { MarketCryptoRecord } from 'models/Market' +import { NotifierOfferItem, NotifierPlan, PriceOption } from 'models/marketItems/NotifierItem' +import React, { + FC, useContext, useEffect, useMemo, useState, +} from 'react' +import { useHistory } from 'react-router-dom' +import ROUTES from 'routes' +import Logger from 'utils/Logger' +import { mapPlansToOffers } from './utils' + +const headers: TableHeaders = { + provider: 'Provider', + notifLimitRange: 'Notifications', + channels: 'Channels', + currencies: 'Currencies', + priceFiatRange: 'Price', + action1: '', +} + +type ProviderItem = { + id: string + plans: Array +} + +const showPlans = ( + { id: selectedItemId, plans }: Partial, + currentFiat: string, + crypto: MarketCryptoRecord, + onPlanSelected: (plan: NotifierOfferItem, priceOption: PriceOption) => void, +): FC => (id): JSX.Element => { + const isSelected = selectedItemId && plans?.length + + return ( + <> + {isSelected && ( + } + isOpen={selectedItemId === id} + {...{ onPlanSelected, currentFiat, crypto }} + /> + )} + + ) +} + +const NotifierOffersPage: FC = () => { + const history = useHistory() + const { + state: { + contextID, + listing: { items }, + }, + dispatch, + } = useContext(NotifierOffersContext) + const { + state: { + exchangeRates: { + currentFiat: { + displayName: currentFiat, + }, + crypto, + }, + }, + } = useContext(MarketContext) + const { + state: { + account, + }, + } = useContext(Web3Store) + + useEffect(() => { + dispatch({ + type: 'FILTER', + payload: { provider: undefined }, + }) + }, [dispatch]) + + const onPlanSelected = ( + plan: NotifierOfferItem, + priceOption: PriceOption, + ): void => { + dispatch({ + type: 'SET_ORDER', + payload: { plan, priceOption }, + }) + history.push(ROUTES.NOTIFIER.BUY.CHECKOUT) + } + + const providers = useMemo(() => Array.from(new Set(items + .map(({ provider }) => provider))), [items]) + const [selectedProvider, setSelectedProvider] = useState() + const [ + selectedProviderPlans, + setSelectedProviderPlans, + ] = useState([]) + const [collection, setCollection] = useState([]) + + useEffect(() => { + setSelectedProviderPlans(items + .filter(({ provider }) => provider === selectedProvider)) + }, [items, selectedProvider]) + + useEffect(() => { + if (items?.length) { + Promise.all(providers + .map>(async (provider) => { + const providerPlans = items + .filter((item) => item.provider === provider) + const { url } = providerPlans[0] + + const notifierService = new SubscriptionPlans(url) + notifierService.connect((er) => { + Logger.getInstance() + .debug(JSON.stringify(er, null, 2)) + }) + const notifierActivePlans = await notifierService.getActivePlans() + + // filter out inactive plans + const activePlans = providerPlans.filter( + ({ planId }) => notifierActivePlans.some( + ({ id: notifierPlanId }) => notifierPlanId === planId, + ), + ) + const hasActivePlans = activePlans.length + + const isSelected = selectedProvider === provider + + const selectButton = ( + { + setSelectedProvider(isSelected + ? undefined + : provider) + }} + /> + ) + const action1 = hasActivePlans + ? selectButton + : ( + + + {selectButton} + + + ) + + const commonResult = { + id: provider, + provider: , + action1: account === provider ? 'Your offer' : (action1), + } + + if (!hasActivePlans) { + return { + ...commonResult, + channels: 'N/A', + currencies: 'N/A', + notifLimitRange: 'N/A', + priceFiatRange: N/A, + } + } + + const { + priceFiatRange, + ...offerDetails + } = mapPlansToOffers( + activePlans, crypto, + ) + + return { + ...commonResult, + ...offerDetails, + priceFiatRange: ( + + ), + } + })).then((marketplaceItems) => { + setCollection(marketplaceItems) + }) + } + }, [items, crypto, currentFiat, account, selectedProvider, providers]) + + return ( + } + items={collection} + headers={headers} + dispatch={dispatch} + outdatedCt={0} + itemDetail={showPlans( + { id: selectedProvider, plans: selectedProviderPlans }, + currentFiat, crypto, onPlanSelected, + )} + /> + ) +} + +export default NotifierOffersPage diff --git a/src/components/pages/notifier/buy/utils.ts b/src/components/pages/notifier/buy/utils.ts new file mode 100644 index 000000000..f5cc45366 --- /dev/null +++ b/src/components/pages/notifier/buy/utils.ts @@ -0,0 +1,47 @@ +import { MarketCryptoRecord } from 'models/Market' +import { NotifierPlan } from 'models/marketItems/NotifierItem' +import { toFiatPrecision } from 'utils/priceUtils' + +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +export function mapPlansToOffers( + plans: NotifierPlan[], crypto: MarketCryptoRecord, +) { + const channelsSet = new Set() + const currencyOptions = new Set() + const notificationLimits: number[] = [] + const planPrices: number[] = [] + + for (const plan of plans) { + plan.channels.forEach(({ type }) => channelsSet.add(type)) + plan.priceOptions.forEach(({ token, value }) => { + currencyOptions.add(token.displayName) + + const xrRate = crypto[token.symbol]?.rate || 0 + planPrices.push(value.mul(xrRate).toNumber()) + }) + notificationLimits.push(plan.limit) + } + + const minPrice = toFiatPrecision(Math.min(...planPrices)) + const maxPrice = toFiatPrecision(Math.max(...planPrices)) + + const priceFiatRange = minPrice === maxPrice + ? `${minPrice}` + : `${minPrice} - ${maxPrice}` + + const minNotif = Math.min(...notificationLimits) + const maxNotif = Math.max(...notificationLimits) + + const notifLimitRange = minNotif === maxNotif + ? `${minNotif}` + : `${minNotif} - ${maxNotif}` + + return { + channels: Array.from(channelsSet).join(', '), + currencies: Array.from(currencyOptions).join(', '), + notifLimitRange, + priceFiatRange, + } +} + +export default {} diff --git a/src/components/pages/notifier/myoffers/NotifierEditOfferPage.tsx b/src/components/pages/notifier/myoffers/NotifierEditOfferPage.tsx new file mode 100644 index 000000000..d3d51d0c9 --- /dev/null +++ b/src/components/pages/notifier/myoffers/NotifierEditOfferPage.tsx @@ -0,0 +1,46 @@ +import Typography from '@material-ui/core/Typography' +import { Web3Store } from '@rsksmart/rif-ui' +import InfoBar from 'components/molecules/InfoBar' +import ProviderEdition from 'components/organisms/notifier/provider/ProviderEdition' +import CenteredPageTemplate from 'components/templates/CenteredPageTemplate' +import useConfirmations from 'hooks/useConfirmations' +import React, { FC, useContext } from 'react' +import { useHistory } from 'react-router-dom' +import ROUTES from 'routes' + +const NotifierEditOfferPage: FC = () => { + const { + state: { + account, + }, + } = useContext(Web3Store) + const history = useHistory() + const hasPendingConfs = Boolean(useConfirmations( + ['NOTIFIER_REGISTER_PROVIDER'], + ).length) + + if (!account) { + history.push(ROUTES.NOTIFIER.BASE) + return null + } + + return ( + + + + Edit your information as provider + + + {`Fill out the fields below to edit your trigger offer. + All the information provided is meant to be true and correct.`} + + + + ) +} + +export default NotifierEditOfferPage diff --git a/src/components/pages/notifier/myoffers/NotifierMyOffersPage.tsx b/src/components/pages/notifier/myoffers/NotifierMyOffersPage.tsx new file mode 100644 index 000000000..9042284e1 --- /dev/null +++ b/src/components/pages/notifier/myoffers/NotifierMyOffersPage.tsx @@ -0,0 +1,370 @@ +import Grid from '@material-ui/core/Grid' +import { + shortenString, Spinner, Web3Store, +} from '@rsksmart/rif-ui' +import { notifierSubscriptionsAddress } from 'api/rif-marketplace-cache/notifier/subscriptions' +import LabelWithValue from 'components/atoms/LabelWithValue' +import FeatureNotSupportedButton from 'components/atoms/FeatureNotSupportedButton' +import RoundBtn from 'components/atoms/RoundBtn' +import WithLoginCard from 'components/hoc/WithLoginCard' +import InfoBar from 'components/molecules/InfoBar' +import MyOffersHeader from 'components/molecules/MyOffersHeader' +import { PlanViewSummaryProps } from 'components/molecules/plans/PlanViewSummary' +import NotifierDetails, { SubscriptionEventsDisplayItem } from 'components/organisms/notifier/details/NotifierDetailsModal' +import { eventDisplayItemIterator } from 'components/organisms/notifier/details/utils' +import { SubscriptionDetails, subscriptionHeaders } from 'components/organisms/notifier/myoffers/details' +import NotifierProviderDescription, { Profile } from 'components/organisms/notifier/NotifierProviderDescription' +import Staking from 'components/organisms/notifier/Staking' +import PlanView from 'components/organisms/plans/PlanView' +import CenteredPageTemplate from 'components/templates/CenteredPageTemplate' +import ProgressOverlay, { ProgressOverlayProps } from 'components/templates/ProgressOverlay' +import AppContext, { AppContextProps } from 'context/App' +import { ConfirmationsContext } from 'context/Confirmations' +import MarketContext from 'context/Market' +import NotifierContract from 'contracts/notifier/Notifier' +import useErrorReporter from 'hooks/useErrorReporter' +import { NotifierOfferItem, NotifierSubscriptionItem } from 'models/marketItems/NotifierItem' +import React, { + FC, useContext, useEffect, useState, useCallback, +} from 'react' +import { useHistory } from 'react-router-dom' +import ROUTES from 'routes' +import { getShortDateString } from 'utils/dateUtils' +import { shortChecksumAddress } from 'utils/stringUtils' +import { getFiatPrice } from 'utils/priceUtils' +import Web3 from 'web3' +import useConfirmations from 'hooks/useConfirmations' +import { SubscriptionWithdrawData } from 'context/Confirmations/interfaces' +import { SUBSCRIPTION_STATUSES } from 'api/rif-notifier-service/models/subscriptions' +import Refresh from 'components/molecules/Refresh' +import { notifierOffersAddress } from 'api/rif-marketplace-cache/notifier/offers' +import mapActiveContracts, { activeContractHeaders, ActiveContractItem } from './mapActiveContracts' + +const NotifierMyOffersPage: FC = () => { + const { + state: { account, web3 }, + } = useContext(Web3Store) + const { + state: { + apis: { + [notifierSubscriptionsAddress]: subscriptionsApi, + [notifierOffersAddress]: offersApi, + }, + }, + } = useContext(AppContext) + const { dispatch: confirmationsDispatch } = useContext(ConfirmationsContext) + const { + state: { + exchangeRates, + }, + } = useContext(MarketContext) + const withdrawConfs = useConfirmations(['NOTIFIER_WITHDRAW_FUNDS']) + + const history = useHistory() + + const [myProfile, setMyProfile] = useState() + const [ + myCustomers, + setMyCustomers, + ] = useState>([]) + const [isWhitelistedProvider, setIsWhitelistedProvider] = useState(false) + const [progress, setProgress] = useState>() + const [txDone, setTxDone] = useState(false) + const [txInProgress, setTxInProgress] = useState(false) + const [ + subscriptionDetails, + setSubscriptionDetails, + ] = useState() + const [ + subscriptionEvents, + setSubscriptionEvents, + ] = useState>() + const [isLoadingSubscriptions, setIsLoadingSubscriptions] = useState(false) + const [myOffers, setMyOffers] = useState([]) + const [isLoadingOffers, setIsLoadingOffers] = useState(true) + const reportError = useErrorReporter() + + // Set provider upon wallet connection + useEffect(() => { + const fetchOffers = async (): Promise => { + if (!offersApi.service) offersApi.connect(reportError) + + setIsLoadingOffers(true) + const offers = await offersApi.fetch( + { provider: account }, + ) as NotifierOfferItem[] + setIsLoadingOffers(false) + setMyOffers(offers) + + if (offers.length) { + const [offer] = offers + setMyProfile({ + address: offer.provider, + url: offer.url, + }) + } + } + + fetchOffers() + }, [offersApi, account, reportError]) + + const fetchSubscriptions = useCallback(() => { + if (myProfile && subscriptionsApi) { + setIsLoadingSubscriptions(true) + subscriptionsApi.connect(reportError) + subscriptionsApi.fetch({ + providerId: myProfile.address, + status: { + $ne: SUBSCRIPTION_STATUSES.PENDING, + }, + }) + .then(setMyCustomers) + .catch((error) => reportError({ + id: 'service-fetch', + text: 'Error while fetching subscriptions.', + error, + })) + .finally(() => { setIsLoadingSubscriptions(false) }) + } + }, [subscriptionsApi, myProfile, reportError]) + + // re-fetches subscriptions on withdraw confirmations changes + useEffect(() => { + fetchSubscriptions() + }, [withdrawConfs.length, fetchSubscriptions]) + + useEffect(() => { + if (account) { + NotifierContract.getInstance(web3 as Web3) + .isWhitelistedProvider(account) + .then((isWhitelisted) => setIsWhitelistedProvider( + Boolean(isWhitelisted), + )) + .catch((error) => reportError({ + error, + id: 'contract-notifier', + text: 'Could not determine if the account is whitelisted.', + })) + } + }, [account, web3, reportError]) + + const onModalClose = (): void => { + setSubscriptionDetails(undefined) + setSubscriptionEvents([]) + } + + const handleEditProfile = (): void => { + history.push(ROUTES.NOTIFIER.MYOFFERS.EDIT) + } + + const onWithdraw = ({ + token, withdrawableFunds, id, + }: Pick): void => { + if (account) { + setProgress({ + title: 'Withdrawing your funds from the contract', + doneMsg: 'Funds withdrawn', + }) + setTxInProgress(true) + + NotifierContract.getInstance(web3 as Web3) + .withdrawFunds(id, token, withdrawableFunds, account) + .then((receipt) => { + if (receipt) { + confirmationsDispatch({ + type: 'NEW_REQUEST', + payload: { + contractAction: 'NOTIFIER_WITHDRAW_FUNDS', + txHash: receipt.transactionHash, + contractActionData: { + subscriptionHash: id, + } as SubscriptionWithdrawData, + }, + }) + + setTxDone(true) + } + }) + .catch((error) => { + reportError({ + error, + id: 'contract-notifier', + text: 'Could not withdraw funds from the contract.', + }) + setTxDone(false) + }) + .finally(() => { + setTxInProgress(false) + }) + } + } + + const { + crypto, + currentFiat: { + displayName: fiatDisplayName, + }, + } = exchangeRates + + const onView = (subscriptionId: string): void => { + const subscription: NotifierSubscriptionItem = myCustomers + ?.find(({ id }) => id === subscriptionId) as NotifierSubscriptionItem + + if (!subscription) return + + const { + id, + consumer, + notificationBalance, + plan: { channels }, + expirationDate, + price, + token: { symbol: tokenSymbol }, + events, + } = subscription + + const viewItem: typeof subscriptionDetails = { + id: shortenString(id), + customer: shortChecksumAddress(consumer), + amount: String(notificationBalance), + channels: channels?.map(({ type }) => type).join(',') || '', + expDate: getShortDateString(expirationDate), + price: `${getFiatPrice(price, crypto[tokenSymbol])} ${fiatDisplayName}`, + } + + setSubscriptionDetails(viewItem) + setSubscriptionEvents(events.map((event) => eventDisplayItemIterator(event, channels))) + } + + return ( + + + + + + + {/* Profile description */} + + + {/* Header */} + + Add Notification Plan + + + + + + {/* Plans */} + + { + isLoadingOffers + ? + : myOffers.map(({ + id, + name: offerName, + limit, + channels: offerChannels, + priceOptions: offerPriceOptions, + }) => { + const activeContracts: ActiveContractItem[] = mapActiveContracts( + myCustomers, + { id, limit }, + exchangeRates, + { onWithdraw, onView }, + withdrawConfs, + ) + + const planSummary: Partial = { + name: offerName, + info: [ + , + type).join(', ')} + />, + option.token.displayName) + .join(', ')} + />, + ], + } + + return ( + + + Edit Plan + ), + cancelButton: ( + + Cancel Plan + ), + isTableLoading: isLoadingSubscriptions, + headers: activeContractHeaders, + activeContracts, + }} + /> + + ) + }) + } + + + + {subscriptionDetails + && ( + + Cancel plan + + )} + /> + )} + {/* Progress Overlay */} + {progress && ( + { setProgress(undefined) }} + > + Close + , + ]} + /> + )} + + ) +} + +export default WithLoginCard({ + WrappedComponent: NotifierMyOffersPage, + title: 'Connect your wallet to see your offers', + contentText: 'Connect your wallet to get detailed information about your offers', +}) diff --git a/src/components/pages/notifier/myoffers/mapActiveContracts.tsx b/src/components/pages/notifier/myoffers/mapActiveContracts.tsx new file mode 100644 index 000000000..22e7aeaca --- /dev/null +++ b/src/components/pages/notifier/myoffers/mapActiveContracts.tsx @@ -0,0 +1,128 @@ +import React from 'react' +import Grid from '@material-ui/core/Grid' +import Typography from '@material-ui/core/Typography' +import Tooltip from '@material-ui/core/Tooltip' +import MarketplaceAddressCell from 'components/molecules/MarketplaceAddressCell' +import NotificationsBalance from 'components/molecules/notifier/NotificationsBalance' +import { Item, MarketCryptoRecord } from 'models/Market' +import { NotifierOfferItem, NotifierSubscriptionItem } from 'models/marketItems/NotifierItem' +import { getShortDateString } from 'utils/dateUtils' +import { BaseFiat } from 'models/Fiat' +import { getFiatPrice } from 'utils/priceUtils' +import RoundBtn from 'components/atoms/RoundBtn' +import { ConfirmationData, SubscriptionWithdrawData } from 'context/Confirmations/interfaces' +import { Spinner } from '@rsksmart/rif-ui' + +export const activeContractHeaders = { + customer: 'Customer', + notifBalance: 'Notifications', + expDate: 'Expiration date', + price: 'Price', + actions: '', +} +export type ActiveContractItem = Item & { + [K in keyof typeof activeContractHeaders]: React.ReactElement +} + +const mapActiveContracts = ( + myCustomers: NotifierSubscriptionItem[] = [], + { id: offerId, limit }: Pick, + { currentFiat: { displayName }, crypto }: { + currentFiat: BaseFiat + crypto: MarketCryptoRecord + }, + { onWithdraw, onView }: { + onWithdraw: T + onView: U + }, + withdrawConfs: ConfirmationData[], +): Array => myCustomers + .filter(({ plan: { id } }) => String(id) === offerId) + .map(({ + id, + consumer, + expirationDate, + notificationBalance, + price, + token, + withdrawableFunds, + }) => { + const canWithdraw = withdrawableFunds.gt(0) + const withdrawButton = ( + onWithdraw({ id, token, withdrawableFunds })} + disabled={!canWithdraw} + > + Withdraw + + ) + const withdrawAction = canWithdraw + ? withdrawButton + : ( + + + {withdrawButton} + + + ) + + const isProcessingConfs = withdrawConfs.some( + ({ contractActionData }) => ( + (contractActionData as SubscriptionWithdrawData).subscriptionHash === id + ), + ) + + return ( + { + id, + customer: , + expDate: ( + + {getShortDateString(expirationDate)} + + ), + notifBalance: , + price: ( + + + + {getFiatPrice(price, crypto[token.symbol])} + + + + + {displayName} + + + + ), + actions: ( + + { + isProcessingConfs + ? + : ( + <> + + {withdrawAction} + + + onView(id)}>View + + + ) + } + + ), + }) + }) + +export default mapActiveContracts diff --git a/src/components/pages/notifier/mypurchase/NotifierMyPurchasePage.tsx b/src/components/pages/notifier/mypurchase/NotifierMyPurchasePage.tsx new file mode 100644 index 000000000..2f35ea2c3 --- /dev/null +++ b/src/components/pages/notifier/mypurchase/NotifierMyPurchasePage.tsx @@ -0,0 +1,335 @@ +import { makeStyles, Theme } from '@material-ui/core/styles' +import Typography from '@material-ui/core/Typography' +import { + shortenString, Web3Store, Spinner, +} from '@rsksmart/rif-ui' +import { notifierSubscriptionsAddress } from 'api/rif-marketplace-cache/notifier/subscriptions' +import GridRow from 'components/atoms/GridRow' +import RoundedCard from 'components/atoms/RoundedCard' +import WithLoginCard from 'components/hoc/WithLoginCard' +import InfoBar from 'components/molecules/InfoBar' +import MyPurchasesHeader from 'components/molecules/MyPurchasesHeader' +import PurchasesTable, { MySubscription } from 'components/organisms/notifier/mypurchase/PurchasesTable' +import CenteredPageTemplate from 'components/templates/CenteredPageTemplate' +import AppContext, { AppContextProps } from 'context/App' +import MarketContext from 'context/Market' +import useConfirmations from 'hooks/useConfirmations' +import useErrorReporter from 'hooks/useErrorReporter' +import { NotifierSubscriptionItem } from 'models/marketItems/NotifierItem' +import { UIError } from 'models/UIMessage' +import React, { + FC, useContext, useEffect, useState, + useCallback, +} from 'react' +import { getShortDateString } from 'utils/dateUtils' +import { shortChecksumAddress } from 'utils/stringUtils' +import { getFiatPrice } from 'utils/priceUtils' +import { SubscriptionDetails, subscriptionHeaders } from 'components/organisms/notifier/mypurchase/details' +import NotifierDetails, { SubscriptionEventsDisplayItem } from 'components/organisms/notifier/details/NotifierDetailsModal' +import RoundBtn from 'components/atoms/RoundBtn' +import { eventDisplayItemIterator } from 'components/organisms/notifier/details/utils' +import { SUBSCRIPTION_STATUSES } from 'api/rif-notifier-service/models/subscriptions' +import ProgressOverlay from 'components/templates/ProgressOverlay' +import ROUTES from 'routes' +import NotifierContract from 'contracts/notifier/Notifier' +import Web3 from 'web3' +import { convertToWeiString } from 'utils/parsers' +import { useHistory } from 'react-router-dom' +import { ConfirmationsContext } from 'context/Confirmations' +import { getOrCreateRenewalSubscription } from 'api/rif-notifier-service/subscriptionUtils' +import GridItem from 'components/atoms/GridItem' +import FeatureNotSupportedButton from 'components/atoms/FeatureNotSupportedButton' +import Refresh from 'components/molecules/Refresh' +import mapMyPurchases from './mapMyPurchases' +import { setBrowserSessionCannotRenew } from './utils' + +const useStyles = makeStyles((theme: Theme) => ({ + titleContainer: { + padding: theme.spacing(2, 2, 0, 2), + }, + refreshContainer: { + display: 'flex', + justifyContent: 'flex-end', + alignItems: 'center', + }, +})) + +const NotifierMyPurchasePage: FC = () => { + const classes = useStyles() + + const { + state: { account, web3 }, + } = useContext(Web3Store) + const { + state: { + apis: { + [notifierSubscriptionsAddress]: subscriptionsApi, + }, + }, + } = useContext(AppContext) + const { + state: { + exchangeRates, + }, + } = useContext(MarketContext) + const { dispatch: confirmationsDispatch } = useContext(ConfirmationsContext) + + const history = useHistory() + const reportError = useErrorReporter() + + const [ + subscriptions, + setSubscriptions, + ] = useState>() + const [ + subscriptionDetails, + setSubscriptionDetails, + ] = useState() + const [ + subscriptionEvents, + setSubscriptionEvents, + ] = useState>() + + const [isProcessingTx, setIsProcessingTx] = useState(false) + const [txOperationDone, setTxOperationDone] = useState(false) + const [isLoadingData, setIsLoadingData] = useState(true) + + const numberOfConfs = useConfirmations( + ['NOTIFIER_CREATE_SUBSCRIPTION'], + ).length + const isAwaitingConfs = Boolean(numberOfConfs) + + const fetchSubscriptions = useCallback(() => { + if (account && subscriptionsApi) { + setIsLoadingData(true) + subscriptionsApi.connect(reportError) + subscriptionsApi.fetch({ + consumer: account, + status: { + $ne: SUBSCRIPTION_STATUSES.PENDING, + }, + }) + .then((incomingSubscriptions: Array) => { + const prevSubsMap = incomingSubscriptions.reduce((acc, + sub) => ({ ...acc, [sub.previousSubscription]: sub }), + {}) + + const filtered = incomingSubscriptions.filter( + ({ id }) => !prevSubsMap[id], + ) + + setSubscriptions(Object.values(filtered)) + }) + .catch((error) => reportError(new UIError({ + id: 'service-fetch', + text: 'Error while fetching subscriptions.', + error, + }))) + .finally(() => { + setIsLoadingData(false) + }) + } + }, [subscriptionsApi, account, reportError]) + + useEffect(() => { + fetchSubscriptions() + }, [fetchSubscriptions]) + + const { + crypto, + currentFiat: { + displayName: fiatDisplayName, + }, + } = exchangeRates + + const onView = (subscriptionId: string): void => { + const subscription: NotifierSubscriptionItem = subscriptions + ?.find(({ id }) => id === subscriptionId) as NotifierSubscriptionItem + + if (!subscription) return + + const { + id, + notificationBalance, + plan: { channels }, + expirationDate, + price, + token: { symbol: tokenSymbol }, + events, + provider, + } = subscription + const { provider: providerAddress } = provider + + const viewItem: typeof subscriptionDetails = { + id: shortenString(id), + provider: shortChecksumAddress(providerAddress), + amount: String(notificationBalance), + channels: channels?.map(({ type }) => type).join(',') || '', + expDate: getShortDateString(expirationDate), + price: `${getFiatPrice(price, crypto[tokenSymbol])} ${fiatDisplayName}`, + } + + setSubscriptionDetails(viewItem) + setSubscriptionEvents(events.map( + (event) => eventDisplayItemIterator(event, channels), + )) + } + + const onRenew = async (subscriptionId: string): Promise => { + const subscription: NotifierSubscriptionItem = subscriptions + ?.find(({ id }) => id === subscriptionId) as NotifierSubscriptionItem + + if (!subscription || !account) return + + try { + setIsProcessingTx(true) + const { + id: subscriptionHash, + plan: { planId }, + price, + token: { symbol: tokenSymbol, tokenAddress }, + provider: { provider: providerAddress, url: providerUrl }, + } = subscription + + const response = await getOrCreateRenewalSubscription( + subscriptionHash, { + value: price, symbol: tokenSymbol, planId, url: providerUrl, + }, account, reportError, + ) + + const { hash: renewalHash, signature } = response + + const purchaseReceipt = await NotifierContract.getInstance(web3 as Web3) + .createSubscription( + { + subscriptionHash: renewalHash, + providerAddress, + signature, + amount: price, + tokenAddress, + }, + { + from: account, + value: convertToWeiString(price), + }, + ) + + if (purchaseReceipt) { + setTxOperationDone(true) + setBrowserSessionCannotRenew(subscriptionHash) + confirmationsDispatch({ + type: 'NEW_REQUEST', + payload: { + contractAction: 'NOTIFIER_CREATE_SUBSCRIPTION', + txHash: purchaseReceipt.transactionHash, + }, + }) + } + } catch (error) { + const { customMessage } = error + reportError({ + error, + id: 'contract-notifier', + text: customMessage || 'Could not complete the order', + }) + } finally { + setIsProcessingTx(false) + } + } + + const items = subscriptions?.map(mapMyPurchases( + exchangeRates, { onView, onRenew }, + )) || [] as Array + + const onModalClose = (): void => { + setSubscriptionDetails(undefined) + setSubscriptionEvents([]) + } + + return ( + + + <> + + + + + + Active plans + + + + + + + + { + isLoadingData + ? + : + } + + + {subscriptionDetails + && ( + + Cancel Plan + + )} + /> + )} + + setTxOperationDone(false) + } + > + View my purchases + , + history.push(ROUTES.NOTIFIER.BUY.BASE) + } + > + View offers listing + , + ]} + /> + + ) +} + +export default WithLoginCard({ + WrappedComponent: NotifierMyPurchasePage, + title: 'Connect your wallet to see your purchases', + contentText: 'Connect your wallet to get detailed information about your purchases', +}) diff --git a/src/components/pages/notifier/mypurchase/mapMyPurchases.tsx b/src/components/pages/notifier/mypurchase/mapMyPurchases.tsx new file mode 100644 index 000000000..b27b09e62 --- /dev/null +++ b/src/components/pages/notifier/mypurchase/mapMyPurchases.tsx @@ -0,0 +1,122 @@ +import React from 'react' +import { CombinedPriceCell } from 'components/molecules' +import NotificationsBalance from 'components/molecules/notifier/NotificationsBalance' +import { MySubscription } from 'components/organisms/notifier/mypurchase/PurchasesTable' +import { NotifierSubscriptionItem } from 'models/marketItems/NotifierItem' +import { ExchangeRate } from 'context/Market/interfaces' +import MarketplaceAddressCell from 'components/molecules/MarketplaceAddressCell' +import ExpirationDate, { SubscriptionExpirationType } from 'components/molecules/ExpirationDate' +import { SUBSCRIPTION_STATUSES } from 'api/rif-notifier-service/models/subscriptions' +import { SUBSCRIPTION_STATUS } from 'api/rif-marketplace-cache/notifier/subscriptions/models' +import Grid from '@material-ui/core/Grid' +import Typography from '@material-ui/core/Typography' +import Tooltip from '@material-ui/core/Tooltip' +import RoundBtn from 'components/atoms/RoundBtn' +import { PlanDTO, PLAN_STATUS } from 'api/rif-marketplace-cache/notifier/offers/models' +import { getBrowserSessionCanRenew } from './utils' + +const EXPIRATION_WARNING_TRIGGER = 5 +const CANT_RENEW_MESSAGE = 'Subscriptions renewal is available only for completed or expired purchases' + +const getExpirationType = ( + { status, expirationDate }: Pick, plan: PlanDTO, +): SubscriptionExpirationType => { + if (plan.planStatus === PLAN_STATUS.INACTIVE) return 'disabled' + const daysLeft = Math.ceil(Math.abs(new Date().getTime() - expirationDate?.getTime()) / (60 * 60 * 24 * 1000)) + + if (status !== SUBSCRIPTION_STATUS.ACTIVE || daysLeft <= 0) return 'blocked' + + if (daysLeft <= EXPIRATION_WARNING_TRIGGER) return 'warning' + + return 'normal' +} + +const RENEWABLE_STATUS = [String(SUBSCRIPTION_STATUSES.COMPLETED), String(SUBSCRIPTION_STATUSES.EXPIRED)] + +const mapMyPurchases = ( + { currentFiat, crypto }: ExchangeRate, + { onView, onRenew }: { + onView: V + onRenew: R + }, +) => ({ + id, + token, + plan, + notificationBalance, + expirationDate, + price, + provider, + status, + }: NotifierSubscriptionItem): + MySubscription => { + const { rate, displayName } = crypto?.[token.symbol] + || { rate: 0, displayName: '' } + + const expType = getExpirationType({ status, expirationDate }, plan) + const { provider: providerAddress } = provider + const canRenew = RENEWABLE_STATUS.includes(String(status)) && getBrowserSessionCanRenew(id) + + const renewButton = ( + onRenew(id)} + disabled={!canRenew} + > + Renew + + ) + + const renewAction = canRenew + ? renewButton + : ( + + + {renewButton} + + + ) + + return { + id, + subId: , + provider: , + notifications: ( + + ), + expirationDate: ( + + ), + price: , + status: {status}, + actions: ( + + + {renewAction} + + + onView(id)}>View + + + ), + } + } + +export default mapMyPurchases diff --git a/src/components/pages/notifier/mypurchase/utils.ts b/src/components/pages/notifier/mypurchase/utils.ts new file mode 100644 index 000000000..83238c29e --- /dev/null +++ b/src/components/pages/notifier/mypurchase/utils.ts @@ -0,0 +1,7 @@ +export const setBrowserSessionCannotRenew = ( + hash: string, +): void => sessionStorage.setItem(hash, String(true)) + +export const getBrowserSessionCanRenew = ( + hash: string, +): boolean => !sessionStorage.getItem(hash) diff --git a/src/components/pages/notifier/sell/NotifierSellPage.tsx b/src/components/pages/notifier/sell/NotifierSellPage.tsx new file mode 100644 index 000000000..26a2d3ff8 --- /dev/null +++ b/src/components/pages/notifier/sell/NotifierSellPage.tsx @@ -0,0 +1,116 @@ +import Typography from '@material-ui/core/Typography' +import { Web3Store } from '@rsksmart/rif-ui' +import InfoBar from 'components/molecules/InfoBar' +import NoWhitelistedProvider from 'components/molecules/NoWhitelistedProvider' +import ProviderEdition from 'components/organisms/notifier/provider/ProviderEdition' +import Staking from 'components/organisms/notifier/Staking' +import CenteredPageTemplate from 'components/templates/CenteredPageTemplate' +import NotifierContract from 'contracts/notifier/Notifier' +import useConfirmations from 'hooks/useConfirmations' +import useErrorReporter from 'hooks/useErrorReporter' +import React, { + FC, useContext, useEffect, useState, +} from 'react' +import Web3 from 'web3' +import AppContext from 'context/App' +import WithLoginCard from 'components/hoc/WithLoginCard' +import NoMultipleOffersCard from 'components/organisms/NoMultipleOffersCard' +import { NotifierCacheAPIService } from 'api/rif-marketplace-cache/notifier/interfaces' +import { NotifierOffersFilters } from 'models/marketItems/NotifierFilters' + +const NotifierSellPage: FC = () => { + const { + state: { + web3, + account, + }, + } = useContext(Web3Store) + const { state: { apis } } = useContext(AppContext) + const hasPendingConfs = Boolean(useConfirmations( + ['NOTIFIER_REGISTER_PROVIDER'], + ).length) + const reportError = useErrorReporter() + + const [isCheckingWhitelist, setIsCheckingWhitelist] = useState(true) + const [isWhitelistedProvider, setIsWhitelistedProvider] = useState(false) + const accountStr = account as string // wrapped with login card + const [isLoadingOffer, setIsLoadingOffer] = useState(false) + const [hasOffer, setHasOffer] = useState(false) + + useEffect(() => { + const getOwnOffers = async (): Promise => { + setIsLoadingOffer(true) + + const offersService = apis['notifier/v0/offers'] as NotifierCacheAPIService + offersService.connect(reportError) + + const currentOwnOffers = await offersService.fetch({ + provider: account, + } as NotifierOffersFilters) + setHasOffer(Boolean(currentOwnOffers?.length)) + setIsLoadingOffer(false) + } + + getOwnOffers() + }, [apis, account, reportError]) + + useEffect(() => { + const checkWhitelisted = async (): Promise => { + try { + setIsCheckingWhitelist(true) + const notifierContract = NotifierContract.getInstance(web3 as Web3) + const isWhitelisted = Boolean(await notifierContract + .isWhitelistedProvider(accountStr)) + + setIsWhitelistedProvider(isWhitelisted) + } catch (error) { + reportError({ + error, + id: 'contract-notifier', + text: 'Could not determine if the account is whitelisted.', + }) + } finally { + setIsCheckingWhitelist(false) + } + } + + checkWhitelisted() + }, [accountStr, web3, reportError]) + + if (hasOffer) { + return ( + + + + ) + } + + return ( + + + { + !isCheckingWhitelist + && !isWhitelistedProvider + && + } + + + Register as notifications provider + + + Fill out the fields below to list your notification service. All the information provided is meant to be true and correct. + + + + ) +} + +export default WithLoginCard({ + WrappedComponent: NotifierSellPage, + title: 'Connect your wallet to register as a provider', + contentText: 'Please, connect your wallet in order to register as a provider.', +}) diff --git a/src/components/pages/rns/RnsRoutes.tsx b/src/components/pages/rns/RnsRoutes.tsx index 98524a68a..03712dccc 100644 --- a/src/components/pages/rns/RnsRoutes.tsx +++ b/src/components/pages/rns/RnsRoutes.tsx @@ -1,16 +1,12 @@ -import { - StyledNavTabProps, - /* eslint-disable-next-line import/no-unresolved */ -} from '@rsksmart/rif-ui/dist/components/atoms/StyledNavTab' -import React, { FC, useEffect } from 'react' -import { - Redirect, Route, Switch, useLocation, useHistory, -} from 'react-router-dom' import TabsTemplate from 'components/templates/TabsTemplate' import networkConfig from 'config' import { RnsDomainsContextProvider } from 'context/Services/rns/DomainsContext' import { RnsOffersContextProvider } from 'context/Services/rns/OffersContext' import { RnsSoldContextProvider } from 'context/Services/rns/SoldContext' +import React, { FC, useEffect } from 'react' +import { + Redirect, Route, Switch, useHistory, useLocation, +} from 'react-router-dom' import ROUTES from 'routes' import Logger from 'utils/Logger' import { getTabValueFromLocation } from 'utils/utils' @@ -18,22 +14,21 @@ import { DomainOffersCheckoutPage, DomainOffersPage, DomainsCheckoutPage, NotFound, SellDomainsListPage, } from '..' -import RnsLandingPage from './RnsLandingPage' +import { buildTabs } from '../routerUtils' import CancelDomainCheckoutPage from './cancel/CancelDomainCheckoutPage' +import RnsLandingPage from './RnsLandingPage' const logger = Logger.getInstance() -const TABS: StyledNavTabProps[] = [ +const TABS = buildTabs([ { label: 'Buy', - to: ROUTES.RNS.BUY.BASE, value: ROUTES.RNS.BUY.BASE, }, { label: 'Sell', - to: ROUTES.RNS.SELL.BASE, value: ROUTES.RNS.SELL.BASE, }, -] +]) const RnsRoutes: FC = () => { const { pathname } = useLocation() diff --git a/src/components/pages/rns/sell/DomainCheckoutPage.tsx b/src/components/pages/rns/sell/DomainCheckoutPage.tsx index 7ea9283d3..516c14fd4 100644 --- a/src/components/pages/rns/sell/DomainCheckoutPage.tsx +++ b/src/components/pages/rns/sell/DomainCheckoutPage.tsx @@ -27,7 +27,8 @@ import AppContext, { import { ConfirmationsContext } from 'context/Confirmations' import MarketContext from 'context/Market' import RnsDomainsContext from 'context/Services/rns/DomainsContext' -import { marketPlaceAddress } from 'contracts/config' +import { marketPlaceAddress, rnsSupportedTokens } from 'contracts/config' +import { SUPPORTED_TOKEN_RECORDS } from 'contracts/interfaces' import { Marketplace as MarketplaceContract, Rns as RNSContract, @@ -119,6 +120,9 @@ const DomainsCheckoutPage: FC = () => { web3, }, } = useContext(Web3Store) + const marketplaceContract = React.useMemo(() => MarketplaceContract + .getInstance(web3 as Web3), [web3]) + const { dispatch: appDispatch } = useContext(AppContext) const reportError = useCallback( (e: UIError) => errorReporterFactory(appDispatch)(e), [appDispatch], @@ -142,9 +146,12 @@ const DomainsCheckoutPage: FC = () => { } const currencySymbols = Object.keys(crypto) - const currencyOptions = currencySymbols.map( - (symbol) => crypto[symbol].displayName, - ) + const currencyOptions = currencySymbols.filter((symbol) => rnsSupportedTokens + .includes(symbol as SupportedTokenSymbol) + && marketplaceContract.isWhitelistedToken( + SUPPORTED_TOKEN_RECORDS[symbol], + { from: account }, + )).map((symbol) => crypto[symbol].displayName) const { item: { diff --git a/src/components/pages/routerUtils.ts b/src/components/pages/routerUtils.ts new file mode 100644 index 000000000..8117d6557 --- /dev/null +++ b/src/components/pages/routerUtils.ts @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-unresolved +import { StyledNavTabProps } from '@rsksmart/rif-ui/dist/components/atoms/StyledNavTab' + +export const buildTabs = (tabs: { + label: string + value: string +}[]): StyledNavTabProps[] => tabs.map(({ label, value }) => ({ + label, + value, + to: value, +})) + +export default {} diff --git a/src/components/pages/storage/StorageRoutes.tsx b/src/components/pages/storage/StorageRoutes.tsx index 9a34ddbfc..e8e36bf6f 100644 --- a/src/components/pages/storage/StorageRoutes.tsx +++ b/src/components/pages/storage/StorageRoutes.tsx @@ -1,51 +1,45 @@ /* eslint-disable import/no-unresolved */ -import { - StyledNavTabProps, -} from '@rsksmart/rif-ui/dist/components/atoms/StyledNavTab' -import React, { FC, useEffect } from 'react' -import { - Redirect, Route, Switch, useHistory, useLocation, -} from 'react-router-dom' import TabsTemplate from 'components/templates/TabsTemplate' import networkConfig from 'config' import { OfferEditContextProvider } from 'context/Market/storage' +import StorageContextProvider from 'context/Services/storage' +import { AgreementsContextProvider } from 'context/Services/storage/agreements' import { StorageOffersContextProvider } from 'context/Services/storage/offers' +import React, { FC, useEffect } from 'react' +import { + Redirect, Route, Switch, useHistory, useLocation, +} from 'react-router-dom' import ROUTES from 'routes' import Logger from 'utils/Logger' import { getTabValueFromLocation } from 'utils/utils' -import { AgreementsContextProvider } from 'context/Services/storage/agreements' -import StorageContextProvider from 'context/Services/storage' import { - StorageOffersPage, StorageMyOffersPage, StorageLandingPage, StorageSellPage, + StorageLandingPage, StorageMyOffersPage, StorageOffersPage, StorageSellPage, } from '.' import { NotFound } from '..' +import { buildTabs } from '../routerUtils' import StorageOffersCheckoutPage from './buy/StorageOffersCheckoutPage' import StorageEditOfferPage from './myoffers/StorageEditOfferPage' import MyStoragePurchases from './myPurchases/Page' import RenewAgreement from './myPurchases/RenewAgreement' -const TABS: StyledNavTabProps[] = [ +const TABS = buildTabs([ { label: 'Buy', - to: ROUTES.STORAGE.BUY.BASE, value: ROUTES.STORAGE.BUY.BASE, }, { label: 'Sell', - to: ROUTES.STORAGE.SELL.BASE, value: ROUTES.STORAGE.SELL.BASE, }, { label: 'My offers', - to: ROUTES.STORAGE.MYOFFERS.BASE, value: ROUTES.STORAGE.MYOFFERS.BASE, }, { label: 'My purchases', - to: ROUTES.STORAGE.MYPURCHASES.BASE, value: ROUTES.STORAGE.MYPURCHASES.BASE, }, -] +]) const logger = Logger.getInstance() diff --git a/src/components/pages/storage/sell/PageWrapper.tsx b/src/components/pages/storage/sell/PageWrapper.tsx index 0e7cc7393..ca64fca04 100644 --- a/src/components/pages/storage/sell/PageWrapper.tsx +++ b/src/components/pages/storage/sell/PageWrapper.tsx @@ -10,7 +10,7 @@ import CenteredPageTemplate from 'components/templates/CenteredPageTemplate' import Staking from 'components/organisms/storage/staking/Staking' import InfoBar from 'components/molecules/InfoBar' import useConfirmations from 'hooks/useConfirmations' -import NoMultipleOffersCard from 'components/organisms/storage/sell/NoMultipleOffersCard' +import NoMultipleOffersCard from 'components/organisms/NoMultipleOffersCard' import OfferCreation from 'components/organisms/storage/sell/OfferCreation' const PageWrapper: FC = () => { @@ -52,7 +52,7 @@ const PageWrapper: FC = () => { if (ownOffer) { return ( - + ) } diff --git a/src/components/pages/triggers/TriggersRoutes.tsx b/src/components/pages/triggers/TriggersRoutes.tsx deleted file mode 100644 index bd53d76d2..000000000 --- a/src/components/pages/triggers/TriggersRoutes.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { FC, useEffect } from 'react' -import { - Redirect, Route, Switch, useHistory, -} from 'react-router-dom' - -import networkConfig from 'config' -import ROUTES from 'routes' -import Logger from 'utils/Logger' -import { NotFound } from '..' -import TriggersLandingPage from './TriggersLandingPage' - -const logger = Logger.getInstance() - -const TriggersRoutes: FC = () => { - const { services } = networkConfig - const triggersEnabled = services && services.triggers - const history = useHistory() - - useEffect(() => { - // TODO: wrap this code block to be excecuted only on debugging - const unlisten = history.listen((location, action) => { - logger.debug('TriggersRoutes -> location', location) - logger.debug('TriggersRoutes -> action', action) - }) - return (): void => { - unlisten() - } - }, [history]) - - if (triggersEnabled) { - return ( - - - - - - ) - } - - return ( - - - - - ) -} - -export default TriggersRoutes diff --git a/src/components/templates/ProgressOverlay.tsx b/src/components/templates/ProgressOverlay.tsx index 48476f493..02cf16cfa 100644 --- a/src/components/templates/ProgressOverlay.tsx +++ b/src/components/templates/ProgressOverlay.tsx @@ -45,7 +45,7 @@ const ProgressOverlay: FC = ({ { buttons.map((btn) => ( {btn} @@ -62,3 +62,4 @@ const ProgressOverlay: FC = ({ } export default ProgressOverlay +export type ProgressOverlayProps = Props diff --git a/src/components/templates/marketplace/Marketplace.tsx b/src/components/templates/marketplace/Marketplace.tsx index c42d9e3a2..b3b36f4a1 100644 --- a/src/components/templates/marketplace/Marketplace.tsx +++ b/src/components/templates/marketplace/Marketplace.tsx @@ -1,13 +1,12 @@ -import React, { FC } from 'react' -import { makeStyles, Theme } from '@material-ui/core/styles' import { - Table, TableHead, TableRow, TableCell, TableBody, Typography, + Table, TableBody, TableCell, TableHead, TableRow as MUITableRow, Typography, } from '@material-ui/core' - +import { makeStyles, Theme } from '@material-ui/core/styles' import { colors, fonts, WithSpinner, } from '@rsksmart/rif-ui' +import React, { FC } from 'react' export type MarketplaceItem = { id: string, [key: string]: any } @@ -19,6 +18,7 @@ export interface MarketplaceProps { items: MarketplaceItem[] headers: TableHeaders Heading?: React.ElementType + itemDetail?: FC } const useStyles = makeStyles((theme: Theme) => ({ @@ -38,9 +38,23 @@ const useStyles = makeStyles((theme: Theme) => ({ }, tc: { border: 0, + color: colors.gray4, + fontSize: fonts.size.small, '&:last-child': { textAlignLast: 'center', }, + '&:first-child': { + color: colors.gray5, + fontSize: fonts.size.normal, + }, + }, + detail: { + border: 0, + '&:last-child': { + textAlignLast: 'left', + }, + paddingBottom: 0, + paddingTop: 0, }, th: { color: colors.gray6, @@ -51,7 +65,7 @@ const useStyles = makeStyles((theme: Theme) => ({ textAlignLast: 'center', }, }, - 'tc-domain': { + 'tc-domain': { // FIXME: remove non-generic specific styling align: 'left', color: colors.primary, }, @@ -62,6 +76,7 @@ const Marketplace: FC = ({ items, headers, Heading, + itemDetail = (): null => null, }) => { const classes = useStyles() return ( @@ -70,28 +85,43 @@ const Marketplace: FC = ({
- + { Object.keys(headers).map((itemName: string) => ( {headers[itemName]} )) } - + - { - items.map((item, index) => ( - - { - Object.keys(headers).map((itemName: string) => ( - - {item[itemName]} - - )) - } - - )) - } + { items.map((item, index) => { + const rowClassName = index % 2 ? classes.coloredRow : '' + const rowKey = item.id + + return ( + + + {Object.keys(headers).map((itemName: string) => { + const cell = item[itemName] + + return ( + + {typeof cell === 'string' ? {cell} : cell} + + ) + })} + + + + {itemDetail(rowKey)} + + + + ) + })}
diff --git a/src/config/notifier/index.ts b/src/config/notifier/index.ts new file mode 100644 index 000000000..1458b71b6 --- /dev/null +++ b/src/config/notifier/index.ts @@ -0,0 +1,19 @@ +export type SupportedEventChannel = | 'API' | 'EMAIL' + +export const SUPPORTED_EVENTS = { + SMARTCONTRACT: 'SMARTCONTRACT', + NEWBLOCK: 'NEWBLOCK', +} as const + +export type SupportedEventType = keyof typeof SUPPORTED_EVENTS + +export const SUPPORTED_EVENT_TYPES: Array = Object.keys(SUPPORTED_EVENTS) as Array + +export const SUPPORTED_EVENT_CHANNELS: Array = ['API', 'EMAIL'] +export const SUPPORTED_API_CHANNEL_PROTOCOLS = ['http:', 'https:'] + +export const SUPPORTED_PROVIDER_PROTOCOLS = ['https:'] + +export const ALLOW_INSECURE_CONNECTIONS = Boolean(Number( + process.env.REACT_APP_ALLOW_INSECURE_CONNECTIONS, +)) || false diff --git a/src/constants/notifier/strings.ts b/src/constants/notifier/strings.ts new file mode 100644 index 000000000..dec695869 --- /dev/null +++ b/src/constants/notifier/strings.ts @@ -0,0 +1,24 @@ +import { SupportedEventType, SupportedEventChannel } from 'config/notifier' + +export const notifierChannelPlaceHolder: Record = { + API: 'Enter api destination', + EMAIL: 'Enter email destination', +} + +export const notifierEventTypeLabels: Record = { + SMARTCONTRACT: 'Smart Contract', + NEWBLOCK: 'New Block', +} + +export const NO_AVAILABLE_SUBSCRIPTION_PLAN = 'At least one active subscription plan must be available for registration.' + +export const URL_ALREADY_REGISTERED = 'The domain is already registered.' + +export const HTTPS_REQUIRED = 'The url must use https protocol.' + +export const WRONG_URL = 'Wrong url.' + +export const IP_NOT_ALLOWED = 'IP addresses are not allowed.' +export const TERMS_CONDITIONS_BUY = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ut laoreet nisl, nec tempor dui. Proin purus eros, posuere pellentesque eros sodales, luctus cursus mauris. Sed elementum ultricies ligula, nec rutrum arcu porttitor eu. Maecenas malesuada porta arcu, ut ornare augue elementum eget. Vivamus eleifend elit nec cursus consectetur. Sed tincidunt malesuada diam nec pharetra. Praesent condimentum, diam interdum convallis accumsan, lacus erat consectetur ligula, a gravida erat leo ut risus. Vestibulum dapibus ipsum hendrerit semper ultrices. Donec id lacus eros. Aliquam varius hendrerit dui, vel congue eros commodo non. Etiam pretium, urna eu ornare consequat, nibh risus commodo nisl, ac vulputate libero dui pulvinar leo. Sed non ipsum varius, molestie libero eu, euismod felis. Etiam efficitur augue ut ligula dapibus sodales. Duis blandit consequat nisi pharetra interdum. Donec eget pretium elit.' + +export default {} diff --git a/src/constants/strings.ts b/src/constants/strings.ts index 0cd1efa57..14c473e58 100644 --- a/src/constants/strings.ts +++ b/src/constants/strings.ts @@ -10,4 +10,11 @@ and still undergoing final testing before the official release. and any purchasing of storage space should be done at the user’s own risk.` +export const API_RESPONSE_MESSAGES = { + OK: 'OK', + ERROR: 'error', +} + +export const FEATURE_NOT_SUPPORTED = 'This feature is not supported yet' + export default {} diff --git a/src/context/App/Context.tsx b/src/context/App/Context.tsx index a06c46d66..b7e6e2b36 100644 --- a/src/context/App/Context.tsx +++ b/src/context/App/Context.tsx @@ -1,5 +1,6 @@ import { ConfirmationsService } from 'api/rif-marketplace-cache/blockchain/confirmations' import { NotificationsService } from 'api/rif-marketplace-cache/notifications' +import { NotifierOffersService, NotifierStakesService, NotifierSubscriptionsService } from 'api/rif-marketplace-cache/notifier' import { XRService } from 'api/rif-marketplace-cache/rates/xr' import { DomainsService } from 'api/rif-marketplace-cache/rns/domains' import { OffersService } from 'api/rif-marketplace-cache/rns/offers' @@ -14,6 +15,10 @@ import createReducer from 'context/storeUtils/reducer' import React, { createContext, FC, useReducer, } from 'react' +import { notifierOffersAddress } from 'api/rif-marketplace-cache/notifier/offers' +import { notifierSubscriptionsAddress } from 'api/rif-marketplace-cache/notifier/subscriptions' +import { notifierStakesAddress } from 'api/rif-marketplace-cache/notifier/stakes' +import ProvidersService, { notifierProvidersAddress } from 'api/rif-marketplace-cache/notifier/providers' import { appActions } from '.' import { contextID, Props, State } from './interfaces' @@ -32,6 +37,10 @@ export const initialState: State = { 'storage/v0/stakes': new StakesService(), 'storage/v0/availableCapacity': new AvailableCapacityService(), upload: new UploadService(), + [notifierOffersAddress]: new NotifierOffersService(), + [notifierSubscriptionsAddress]: new NotifierSubscriptionsService(), + [notifierProvidersAddress]: new ProvidersService(), + [notifierStakesAddress]: new NotifierStakesService(), }, messages: {}, loaders: { diff --git a/src/context/App/__tests__/AppContext.test.tsx b/src/context/App/__tests__/AppContext.test.tsx index 72d41c124..ecd4c41d3 100644 --- a/src/context/App/__tests__/AppContext.test.tsx +++ b/src/context/App/__tests__/AppContext.test.tsx @@ -2,6 +2,7 @@ import { render } from '@testing-library/react' import { ServiceAddress } from 'api/models/serviceAddresses' import { confirmationAddress } from 'api/rif-marketplace-cache/blockchain/confirmations' import { serviceAddress as notificationsAddress } from 'api/rif-marketplace-cache/notifications' +import { notifierAddresses } from 'api/rif-marketplace-cache/notifier' import { xrServiceAddress } from 'api/rif-marketplace-cache/rates/xr' import { rnsAddresses } from 'api/rif-marketplace-cache/rns/common' import { storageAddresses } from 'api/rif-marketplace-cache/storage/interfaces' @@ -47,6 +48,7 @@ describe('AppContext', () => { ...rnsAddresses, ...storageAddresses, uploadServiceAddr, + ...notifierAddresses, ].forEach(testServiceExistence) }) test('should contain messages: {}', () => { diff --git a/src/context/Confirmations/interfaces.ts b/src/context/Confirmations/interfaces.ts index 2652b4bed..cc26cef4e 100644 --- a/src/context/Confirmations/interfaces.ts +++ b/src/context/Confirmations/interfaces.ts @@ -11,7 +11,7 @@ type AgreementContractAction = | 'AGREEMENT_RENEW' type OfferContractAction = 'NEW_OFFER' | 'EDIT_OFFER' | 'CANCEL_OFFER' -type StorageStakingContractAction = 'STAKING_STAKE' | 'STAKING_UNSTAKE' +type StorageStakingContractAction = 'STORAGE_STAKE' | 'STORAGE_UNSTAKE' type StorageContractAction = AgreementContractAction | OfferContractAction @@ -23,10 +23,15 @@ type RnsContractAction = | CancelDomainAction | PlaceDomainAction +type NotifierContractAction = 'NOTIFIER_REGISTER_PROVIDER' | 'NOTIFIER_WITHDRAW_FUNDS' | 'NOTIFIER_CREATE_SUBSCRIPTION' +type NotifierStakingContractAction = 'NOTIFIER_STAKE' | 'NOTIFIER_UNSTAKE' + export type ContractAction = | StorageContractAction | StorageStakingContractAction | RnsContractAction + | NotifierContractAction + | NotifierStakingContractAction export type AgreementUpdateData = { // used for withdraw, payout and renew agreementId: string @@ -39,9 +44,16 @@ export type RnsContractData = { tokenId: string } +export type SubscriptionWithdrawData = { + subscriptionHash: string +} + +export type NotifierContractData = | SubscriptionWithdrawData + export type ContractActionData = | AgreementContractData | RnsContractData + | NotifierContractData export type TxHash = string diff --git a/src/context/Market/interfaces.ts b/src/context/Market/interfaces.ts index eec7a9bc8..1a906024a 100644 --- a/src/context/Market/interfaces.ts +++ b/src/context/Market/interfaces.ts @@ -6,11 +6,12 @@ export type MarketErrorId = 'market-init' // STATE export type ContextName = 'market' -export type State = ContextState & { - exchangeRates: { +export type ExchangeRate = { currentFiat: BaseFiat crypto: MarketCryptoRecord - } +} +export type State = ContextState & { + exchangeRates: ExchangeRate } // ACTIONS diff --git a/src/context/Services/notifier/index.ts b/src/context/Services/notifier/index.ts new file mode 100644 index 000000000..778bfe577 --- /dev/null +++ b/src/context/Services/notifier/index.ts @@ -0,0 +1,3 @@ +import { OffersContextName } from './offers' + +export type NotifierContextNames = | OffersContextName diff --git a/src/context/Services/notifier/offers/Context.tsx b/src/context/Services/notifier/offers/Context.tsx new file mode 100644 index 000000000..205f782a8 --- /dev/null +++ b/src/context/Services/notifier/offers/Context.tsx @@ -0,0 +1,207 @@ +import { NotifierOffersService } from 'api/rif-marketplace-cache/notifier' +import { notifierOffersAddress } from 'api/rif-marketplace-cache/notifier/offers' +import AppContext, { AppContextProps } from 'context/App' +import MarketContext, { MarketContextProps } from 'context/Market' +import createReducer from 'context/storeUtils/reducer' +import useErrorReporter from 'hooks/useErrorReporter' +import { SUPPORTED_FIAT } from 'models/Fiat' +import { UIError } from 'models/UIMessage' +import React, { + createContext, FC, useContext, useEffect, useReducer, useState, +} from 'react' +import actions from './actions' +import { Props, State } from './interfaces' + +export const contextName = 'notifier_offers' as const + +export const initialState: State = { + contextID: contextName, + listing: { + items: [], + }, + filters: { + size: { + min: 0, + max: 0, + }, + price: { + min: 0, + max: 0, + fiatSymbol: SUPPORTED_FIAT.usd.symbol, + }, + currency: new Set(), + }, + limits: { + size: { + min: 0, + max: 0, + }, + price: { + min: 0, + max: 0, + fiatSymbol: SUPPORTED_FIAT.usd.symbol, + }, + }, +} + +export const Context = createContext({ + state: initialState, + dispatch: () => undefined, +}) + +export const Provider: FC = ({ children }) => { + const [isInitialised, setIsInitialised] = useState(false) + const [isLimitsSet, setIsLimitsSet] = useState(false) + + const [state, dispatch] = useReducer( + createReducer(initialState, actions), + initialState, + ) + + const { + state: appState, + dispatch: appDispatch, + }: AppContextProps = useContext(AppContext) + + const { + state: { + exchangeRates: { + currentFiat: { + symbol: fiatSymbol, + }, + }, + }, + }: MarketContextProps = useContext(MarketContext) + + const api: NotifierOffersService = appState.apis[ + notifierOffersAddress] as NotifierOffersService + + const reportError = useErrorReporter() + + // Initialise + if (!api.service) { + api.connect(reportError) + } + + useEffect(() => { + if (api?.service && !isInitialised) { + try { + setIsInitialised(true) + } catch (e) { + setIsInitialised(false) + } + } + }, [api, isInitialised]) + + // (re)fetch limits upon refresh if initialised + useEffect(() => { + if (isInitialised && !isLimitsSet) { + appDispatch({ + type: 'SET_IS_LOADING', + payload: { + isLoading: true, + id: 'filters', + }, + }) + try { + Promise.all([ + api.findLimits({ fiatSymbol }) + .then((limits) => { + dispatch({ + type: 'UPDATE_LIMITS', + payload: limits, + }) + dispatch({ + type: 'FILTER', + payload: limits, + }) + }) + .catch((error) => { + throw new UIError({ + error, + id: 'service-fetch', + text: 'Error while fetching filters. ', + }) + }), + ]).then(() => { + setIsLimitsSet(true) + }) + } catch (error) { + reportError(new UIError({ + error, + id: 'service-fetch', + text: 'Error while fetching filters.', + })) + } finally { + appDispatch({ + type: 'SET_IS_LOADING', + payload: { + isLoading: false, + id: 'filters', + }, + }) + } + } + }, [ + api, + fiatSymbol, + isInitialised, + reportError, + isLimitsSet, + appDispatch, + ]) + + // // Pre-fetch limits + // useEffect(() => { + // if (needsRefresh) { + // setIsLimitsSet(false) + // } + // }, [needsRefresh]) + + const { filters } = state + + // Fetch data + useEffect(() => { + if (isInitialised) { + appDispatch({ + type: 'SET_IS_LOADING', + payload: { + isLoading: true, + id: 'data', + }, + }) + api.fetch(filters) + .then((items) => { + dispatch({ + type: 'SET_LISTING', + payload: { items }, + }) + }) + .catch((error) => { + reportError(new UIError({ + error, + id: 'service-fetch', + text: 'Notifier API Error while fetching data.', + })) + }) + .finally(() => { + appDispatch({ + type: 'SET_IS_LOADING', + payload: { + isLoading: false, + id: 'data', + }, + }) + }) + } + }, [ + appDispatch, + filters, + isInitialised, + api, + reportError, + ]) + + const value = { state, dispatch } + return {children} +} diff --git a/src/context/Services/notifier/offers/__tests__/Context.test.tsx b/src/context/Services/notifier/offers/__tests__/Context.test.tsx new file mode 100644 index 000000000..5f6a58ae8 --- /dev/null +++ b/src/context/Services/notifier/offers/__tests__/Context.test.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { render } from '@testing-library/react' +import { useProviderTest } from '__tests__/testUtils' +import { NotifierOffersContextProvider, NotifierOffersContext } from '..' +import { OffersListing } from '../interfaces' + +const ProviderTest = useProviderTest( + NotifierOffersContextProvider, NotifierOffersContext, +) + +describe('Notifier Offers Context', () => { + describe('Provider', () => { + describe('initial state', () => { + test('should contain contextID: "notifier_offers"', () => { + render( { + expect(contextID).toEqual('notifier_offers') + }} + />) + }) + test('should contain correct listing property', () => { + const expectedListing: OffersListing = { items: [] } + render( { + expect(listing).toEqual(expectedListing) + }} + />) + }) + test('should not contain order property', () => { + render( { + expect(order).toBeUndefined() + }} + />) + }) + }) + }) +}) diff --git a/src/context/Services/notifier/offers/__tests__/actions.test.tsx b/src/context/Services/notifier/offers/__tests__/actions.test.tsx new file mode 100644 index 000000000..ebd9c3b0d --- /dev/null +++ b/src/context/Services/notifier/offers/__tests__/actions.test.tsx @@ -0,0 +1,83 @@ +import Big from 'big.js' +import { SUPPORTED_TOKEN_RECORDS } from 'contracts/interfaces' +import { SUPPORTED_FIAT } from 'models/Fiat' +import { NotifierOfferItem } from 'models/marketItems/NotifierItem' +import { notifierOffersActions, notifierOffersInitialState, NotifierOffersState } from '..' +import { ListingPayload, OffersListing } from '../interfaces' + +const testDefaults = { + initialState: notifierOffersInitialState, +} + +const MOCK_OFFER: NotifierOfferItem = { + provider: 'MOCK_PROVIDER_ID', + name: 'MOCK_PLAN_NAME', + id: 'MOCK_PLAN_ID', + channels: ['sms'], + daysLeft: 2, + limit: 200, + priceOptions: [ + { + token: SUPPORTED_TOKEN_RECORDS.rbtc, + value: Big(1), + }, + ], +} + +const MOCK_STATE: NotifierOffersState = { + contextID: testDefaults.initialState.contextID, + listing: { + items: [MOCK_OFFER], + }, + order: { + isProcessing: true, + item: MOCK_OFFER, + }, + filters: { + size: { + min: 0, + max: 0, + }, + price: { + min: 0, + max: 0, + fiatSymbol: SUPPORTED_FIAT.usd.symbol, + }, + currency: new Set(), + }, + limits: { + size: { + min: 0, + max: 0, + }, + price: { + min: 0, + max: 0, + fiatSymbol: SUPPORTED_FIAT.usd.symbol, + }, + }, +} + +describe('Notifier Offers Context actions', () => { + const { + SET_LISTING, + } = notifierOffersActions + + beforeEach(() => { + testDefaults.initialState = notifierOffersInitialState + }) + + describe('SET_LISTING', () => { + test('should return state with correct listing property', () => { + const expectedListing: OffersListing = MOCK_STATE.listing + const payload: ListingPayload = expectedListing + const { + listing, + }: Partial = SET_LISTING( + testDefaults.initialState, payload, + ) + + expect(listing).toEqual(expectedListing) + }) + }) +}) diff --git a/src/context/Services/notifier/offers/actions.ts b/src/context/Services/notifier/offers/actions.ts new file mode 100644 index 000000000..4d50ef861 --- /dev/null +++ b/src/context/Services/notifier/offers/actions.ts @@ -0,0 +1,36 @@ +import { Actions } from './interfaces' + +const actions: Actions = { + SET_LISTING: (state, { items }) => ({ + ...state, + listing: { + items: items ?? [], + }, + }), + FILTER: (state, payload) => ({ + ...state, + filters: { + ...state.filters, + ...payload, + }, + }), + UPDATE_LIMITS: (state, payload) => ({ + ...state, + limits: { + ...state.limits, + ...payload, + }, + }), + SET_ORDER: (state, { plan, priceOption }) => ({ + ...state, + order: { + item: { + ...plan, + ...priceOption, + }, + isProcessing: false, + }, + }), +} + +export default actions diff --git a/src/context/Services/notifier/offers/index.ts b/src/context/Services/notifier/offers/index.ts new file mode 100644 index 000000000..87208f5ee --- /dev/null +++ b/src/context/Services/notifier/offers/index.ts @@ -0,0 +1,26 @@ +import { + Props, + Actions, + State, + ContextName, + Action, +} from './interfaces' +import { + Context, + Provider, + initialState, +} from './Context' +import actions from './actions' + +export { + Context as NotifierOffersContext, + Provider as NotifierOffersContextProvider, + initialState as notifierOffersInitialState, + actions as notifierOffersActions, +} + +export type NotifierOffersContextProps = Props +export type NotifierOffersState = State +export type NotifierOffersContextActions = Actions +export type NotifierOffersContextAction = Action +export type OffersContextName = ContextName diff --git a/src/context/Services/notifier/offers/interfaces.ts b/src/context/Services/notifier/offers/interfaces.ts new file mode 100644 index 000000000..2982d62e8 --- /dev/null +++ b/src/context/Services/notifier/offers/interfaces.ts @@ -0,0 +1,73 @@ +import { ServiceOrder, ServiceState } from 'context/Services/interfaces' +import { NotifierOffersFilters } from 'models/marketItems/NotifierFilters' +import { NotifierOfferItem, PriceOption } from 'models/marketItems/NotifierItem' +import { Dispatch } from 'react' +import { Modify } from 'utils/typeUtils' +import { contextName } from './Context' + +// STATE +export type ContextName = typeof contextName + +export type OffersListing = { + items: NotifierOfferItem[] +} + +export type OrderItem = Omit & PriceOption +export type OffersOrder = Omit, 'isOutdated'> + +export type ContextLimits = Pick + +export type State = Modify, { + listing: OffersListing + order?: OffersOrder + filters: NotifierOffersFilters + limits: ContextLimits +}> + +// PAYLOAD +export type ListingPayload = Pick + +export type LimitsPayload = Pick + +export type FilterPayload = Partial + +export type OrderPayload = { + plan: NotifierOfferItem + priceOption: PriceOption +} + +export interface RefreshPayload { + refresh: boolean +} + +// ACTIONS +export type Action = + | { + type: 'SET_LISTING' + payload: ListingPayload + } + | { + type: 'FILTER' + payload: FilterPayload + } + | { + type: 'UPDATE_LIMITS' + payload: LimitsPayload + } + | { + type: 'SET_ORDER' + payload: OrderPayload + } + +export type Actions = { + SET_LISTING: (state: State, payload: ListingPayload) => State + FILTER: (state: State, payload: FilterPayload) => State + UPDATE_LIMITS: (state: State, payload: LimitsPayload) => State + SET_ORDER: (state: State, payload: OrderPayload) => State +} + +// PROPS +export type Props = { + state: State + dispatch: Dispatch +} diff --git a/src/context/Services/storage/staking/Context.tsx b/src/context/Services/staking/Context.tsx similarity index 77% rename from src/context/Services/storage/staking/Context.tsx rename to src/context/Services/staking/Context.tsx index 0f7435cbc..696a3ae3c 100644 --- a/src/context/Services/storage/staking/Context.tsx +++ b/src/context/Services/staking/Context.tsx @@ -1,7 +1,8 @@ import { Web3Store } from '@rsksmart/rif-ui' import { - StakesService, -} from 'api/rif-marketplace-cache/storage/stakes' + onStakeUpdated, setStakeNeedsRefresh, +} from 'context/Services/staking/utils' +import actions from 'context/Services/staking/actions' import AppContext, { AppContextProps, errorReporterFactory, @@ -19,10 +20,14 @@ import React, { } from 'react' import { Props, State, +} from 'context/Services/staking/interfaces' +import { + NotifierStakesAddress, +} from 'api/rif-marketplace-cache/notifier/stakes' +import { StorageStakesAddress } from 'api/rif-marketplace-cache/storage/stakes' +import { contextName, } from './interfaces' -import actions from './actions' -import { onStakeUpdated, setStakeNeedsRefresh } from './utils' export const initialState: State = { contextID: contextName, @@ -39,7 +44,13 @@ export const Context = createContext({ dispatch: () => undefined, }) -export const ContextProvider: FC = ({ children }) => { +type StakesAddress = NotifierStakesAddress | StorageStakesAddress + +export type ContextProviderProps = { + apiAddress: StakesAddress +} + +export const ContextProvider: FC = ({ apiAddress, children }) => { const { state: { apis }, dispatch: appDispatch, @@ -57,8 +68,13 @@ export const ContextProvider: FC = ({ children }) => { ) const { needsRefresh } = state - const api = apis?.['storage/v0/stakes'] as StakesService - api.connect(errorReporterFactory(appDispatch)) + const api = apis[ + apiAddress + ] + + if (api && !api.service) { + api.connect(errorReporterFactory(appDispatch)) + } const [isInitialised, setIsInitialised] = useState(false) @@ -127,14 +143,15 @@ export const ContextProvider: FC = ({ children }) => { ) } -function withStakingContext( +export default ContextProvider + +export function withContext( Component: React.ComponentType, + stakesAddress: StakesAddress, ): React.ComponentType { return (props: T): React.ReactElement => ( - + ) } - -export default withStakingContext diff --git a/src/context/Services/storage/staking/__tests__/Context.test.tsx b/src/context/Services/staking/__tests__/Context.test.tsx similarity index 79% rename from src/context/Services/storage/staking/__tests__/Context.test.tsx rename to src/context/Services/staking/__tests__/Context.test.tsx index 20b71f027..ace51dfab 100644 --- a/src/context/Services/storage/staking/__tests__/Context.test.tsx +++ b/src/context/Services/staking/__tests__/Context.test.tsx @@ -1,18 +1,18 @@ import React from 'react' import { render } from '@testing-library/react' import { useProviderTest } from '__tests__/testUtils' -import { StorageStakingProvider, StorageStakingContext } from '..' +import { StakingContextProvider, StakingContext } from '..' const ProviderTest = useProviderTest( - StorageStakingProvider, StorageStakingContext, + StakingContextProvider, StakingContext, ) -describe('Storage Staking Context', () => { +describe('Staking Context', () => { describe('Provider', () => { describe('initial state', () => { - test('should contain contextID: "storage_staking"', () => { + test('should contain contextID: "staking"', () => { render( { - expect(contextID).toEqual('storage_staking') + expect(contextID).toEqual('staking') }} />) }) diff --git a/src/context/Services/storage/staking/__tests__/actions.test.tsx b/src/context/Services/staking/__tests__/actions.test.tsx similarity index 88% rename from src/context/Services/storage/staking/__tests__/actions.test.tsx rename to src/context/Services/staking/__tests__/actions.test.tsx index 4f0ebeea8..0ac70012b 100644 --- a/src/context/Services/storage/staking/__tests__/actions.test.tsx +++ b/src/context/Services/staking/__tests__/actions.test.tsx @@ -1,7 +1,7 @@ -import { StakedBalances } from 'api/rif-marketplace-cache/storage/stakes' -import actions from '../actions' +import { StakedBalances } from 'api/rif-marketplace-cache/common/stakes' +import actions from 'context/Services/staking/actions' +import { State } from 'context/Services/staking/interfaces' import { initialState } from '../Context' -import { State } from '../interfaces' const FAKE_STAKED_BALANCES: StakedBalances = { rbtc: '100000000000000000', diff --git a/src/context/Services/storage/staking/actions.ts b/src/context/Services/staking/actions.ts similarity index 74% rename from src/context/Services/storage/staking/actions.ts rename to src/context/Services/staking/actions.ts index e512da6a3..1fb83ceb9 100644 --- a/src/context/Services/storage/staking/actions.ts +++ b/src/context/Services/staking/actions.ts @@ -1,8 +1,5 @@ -import { StakedBalances } from 'api/rif-marketplace-cache/storage/stakes' -import { - Actions, - State, -} from './interfaces' +import { StakedBalances } from 'api/rif-marketplace-cache/common/stakes' +import { Actions, State } from './interfaces' const actions: Actions = { SET_NEEDS_REFRESH: (state: State, { needsRefresh }): State => ({ diff --git a/src/context/Services/staking/index.ts b/src/context/Services/staking/index.ts new file mode 100644 index 000000000..e288e565e --- /dev/null +++ b/src/context/Services/staking/index.ts @@ -0,0 +1,21 @@ +import { + Props, State, Action, ContextName, +} from './interfaces' +import { + Context as StakingContext, + ContextProvider as StakingContextProvider, + initialState as StakingInitialState, + withContext as withStakingContext, +} from './Context' + +export { + StakingContext, + StakingContextProvider, + StakingInitialState, + withStakingContext, +} + +export type StakingContextName = ContextName +export type StakingContextProps = Props +export type StakingAction = Action +export type StakingContextState = State diff --git a/src/context/Services/storage/staking/interfaces.ts b/src/context/Services/staking/interfaces.ts similarity index 68% rename from src/context/Services/storage/staking/interfaces.ts rename to src/context/Services/staking/interfaces.ts index fffc82bd2..fe11697bd 100644 --- a/src/context/Services/storage/staking/interfaces.ts +++ b/src/context/Services/staking/interfaces.ts @@ -1,4 +1,4 @@ -import { StakedBalances } from 'api/rif-marketplace-cache/storage/stakes' +import { StakedBalances } from 'api/rif-marketplace-cache/common/stakes' import { Dispatch } from 'react' import { SupportedTokenSymbol } from 'models/Token' import { ContextState } from 'context/storeUtils/interfaces' @@ -7,8 +7,9 @@ export type AmountToken = { amount: string token: SupportedTokenSymbol } + // STATE -export const contextName = 'storage_staking' as const +export const contextName = 'staking' as const export type ContextName = typeof contextName export type State = ContextState & { @@ -20,17 +21,17 @@ export type State = ContextState & { // ACTIONS export type Action = | { - type: 'SET_NEEDS_REFRESH' - payload: { needsRefresh: boolean } - } + type: 'SET_NEEDS_REFRESH' + payload: { needsRefresh: boolean } + } | { - type: 'SET_TOTAL_STAKED_USD' - payload: { totalStakedUSD: string } - } + type: 'SET_TOTAL_STAKED_USD' + payload: { totalStakedUSD: string } + } | { - type: 'SET_STAKES' - payload: StakedBalances - } + type: 'SET_STAKES' + payload: StakedBalances + } export type Actions = { SET_NEEDS_REFRESH: (state: State, { needsRefresh: boolean }) => State diff --git a/src/context/Services/storage/staking/utils.ts b/src/context/Services/staking/utils.ts similarity index 82% rename from src/context/Services/storage/staking/utils.ts rename to src/context/Services/staking/utils.ts index dca69106a..cd5d23825 100644 --- a/src/context/Services/storage/staking/utils.ts +++ b/src/context/Services/staking/utils.ts @@ -1,5 +1,6 @@ -import { StakeTransport } from 'api/models/storage/transports' -import { mapFromTransport } from 'api/rif-marketplace-cache/storage/stakes' +import { + mapFromTransport, StakeTransport, +} from 'api/rif-marketplace-cache/common/stakes' import { Dispatch } from 'react' import { Action } from './interfaces' diff --git a/src/context/Services/storage/interfaces.ts b/src/context/Services/storage/interfaces.ts index 2eee9f24c..727fdb2a4 100644 --- a/src/context/Services/storage/interfaces.ts +++ b/src/context/Services/storage/interfaces.ts @@ -6,11 +6,9 @@ import { ServiceOrder, ServiceState } from '../interfaces' import { StorageOffersContextName } from './offers' import { AgreementContextName } from './agreements' import { ContextName as StorageGlobalContextName } from './Context' -import { StorageStakingContextName } from './staking' export type StorageContextNames = | StorageOffersContextName - | StorageStakingContextName | AgreementContextName | StorageGlobalContextName diff --git a/src/context/Services/storage/staking/index.ts b/src/context/Services/storage/staking/index.ts deleted file mode 100644 index 2b0e9ca03..000000000 --- a/src/context/Services/storage/staking/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import withStakingContext, { - ContextProvider as StorageStakingProvider, - Context as StorageStakingContext, - initialState, -} from './Context' -import { - Props, - Action, - State, - ContextName, -} from './interfaces' -import actions from './actions' - -export { - StorageStakingContext, - StorageStakingProvider, - initialState as storageStakingInitialState, - actions as storageStakingActions, -} - -export type StorageStakingContextProps = Props -export type StorageStakingAction = Action -export type StorageStakingContextState = State -export type StorageStakingContextName = ContextName - -export default withStakingContext diff --git a/src/context/storeUtils/interfaces.ts b/src/context/storeUtils/interfaces.ts index e1cf9d5b3..dd6717f43 100644 --- a/src/context/storeUtils/interfaces.ts +++ b/src/context/storeUtils/interfaces.ts @@ -7,6 +7,8 @@ import { StorageUploadContextName } from 'context/Services/storage/upload' import { ContextName as ConfirmationsContextName } from 'context/Confirmations/Context' import { StorageContextNames } from 'context/Services/storage/interfaces' import { Dispatch } from 'react' +import { NotifierContextNames } from 'context/Services/notifier' +import { StakingContextName } from 'context/Services/staking' export type AvailableContexts = | RnsContextNames @@ -17,6 +19,8 @@ export type AvailableContexts = | NotificationsContextName | StorageUploadContextName | ConfirmationsContextName + | NotifierContextNames + | StakingContextName export interface ContextState { contextID: AvailableContexts diff --git a/src/contracts/config.ts b/src/contracts/config.ts index 5d26ea8a1..d2b69edd2 100644 --- a/src/contracts/config.ts +++ b/src/contracts/config.ts @@ -13,16 +13,21 @@ const { rnsDotRskOwner, storageManager, storageStaking, + notifierManager, + notifierStaking, ...tokenAddresses } = contractAddresses const marketPlaceAddress = marketplace.toLowerCase() const rnsAddress = rnsDotRskOwner.toLowerCase() const storageAddress = storageManager.toLowerCase() -const stakingAddress = storageStaking.toLowerCase() +const storageStakingAddress = storageStaking.toLowerCase() +const notifierAddress = notifierManager.toLowerCase() +const notifierStakingAddress = notifierStaking.toLowerCase() const rnsSupportedTokens: SupportedTokenSymbol[] = services.rns?.tokens || [] const storageSupportedTokens: SupportedTokenSymbol[] = services.storage?.tokens || [] +const notifierSupportedTokens: SupportedTokenSymbol[] = services.notifier?.tokens || [] const svcNames = Object.keys(services) const allAllowedPaymentTokens: string[] = Array.from( @@ -33,10 +38,10 @@ const allTokenAddresses: string[] = Object.keys(tokenAddresses) .filter((scName) => allAllowedPaymentTokens.includes(scName)) .map((scName) => tokenAddresses[scName].toLowerCase()) -const addressTokenRecord: Record = allAllowedPaymentTokens +const addressTokenRecord: Record = allAllowedPaymentTokens .reduce((acc, symbol) => { const tokenAddress = tokenAddresses[symbol].toLowerCase() - acc[tokenAddress] = symbol + acc[tokenAddress] = symbol as SupportedTokenSymbol return acc }, {}) @@ -46,11 +51,14 @@ export { marketPlaceAddress, rnsAddress, storageAddress, - stakingAddress, + storageStakingAddress, allAllowedPaymentTokens, allTokenAddresses, addressTokenRecord, rnsSupportedTokens, storageSupportedTokens, rifTokenAddress, + notifierAddress, + notifierSupportedTokens, + notifierStakingAddress, } diff --git a/src/contracts/interfaces.ts b/src/contracts/interfaces.ts index 22569ceca..f6219aa34 100644 --- a/src/contracts/interfaces.ts +++ b/src/contracts/interfaces.ts @@ -4,6 +4,7 @@ import Web3 from 'web3' import { SupportedTokenSymbol, SYSTEM_SUPPORTED_SYMBOL, SYSTEM_TOKENS, BaseToken, TokenRecord, } from 'models/Token' +import Big from 'big.js' import { RifERC20Contract } from './tokens/rif' import { MarketplaceContractErrorId } from './rns/Marketplace' import { RnsContractErrorId } from './rns/Rns' @@ -11,6 +12,8 @@ import { StorageStakingContractErrorId } from './storage/Staking' import { StorageContractErrorId } from './storage/Storage' import type { RifERC677ContractErrorId, RifERC20ContractErrorId } from './tokens/rif' import { PaymentWrapper } from './wrappers/payment-wrapper' +import { NotifierContractErrorId } from './notifier/Notifier' +import { NotifierStakingContractErrorId } from './notifier/Staking' export interface TransactionOptions { from?: string @@ -19,13 +22,14 @@ export interface TransactionOptions { value?: string | number } -export interface ERC20Contract extends PaymentWrapper{ - approve ( - address: string, amount: string | number, options: TransactionOptions +export interface ERC20Contract extends PaymentWrapper { + approve( + address: string, amount: string | number, options: TransactionOptions ): Promise } export type Web3ErrorId = 'web3-getGasPrice' +export type GetBalanceErrorId = 'get-balance' export type ContractErrorId = | Web3ErrorId @@ -35,9 +39,14 @@ export type ContractErrorId = | RnsContractErrorId | StorageContractErrorId | StorageStakingContractErrorId + | NotifierContractErrorId + | NotifierStakingContractErrorId + | GetBalanceErrorId export enum TOKEN_TYPES { ERC20 = 'erc20', + ERC677 = 'erc677', + ERC777 = 'erc777', NATIVE = 'native' } @@ -67,3 +76,11 @@ export const SUPPORTED_TOKEN_RECORDS: TokenRecord = { tokenContract: RifERC20Contract, }, } + +export type CreateSubscriptionParams = { + subscriptionHash: string + providerAddress: string + signature: string + amount: Big + tokenAddress: string +} diff --git a/src/contracts/notifier/Notifier.ts b/src/contracts/notifier/Notifier.ts new file mode 100644 index 000000000..5ced0e5e7 --- /dev/null +++ b/src/contracts/notifier/Notifier.ts @@ -0,0 +1,119 @@ +import NotifierManager from '@rsksmart/rif-marketplace-notifier/build/contracts/NotifierManager.json' +import Big from 'big.js' +import { notifierAddress, notifierSupportedTokens } from 'contracts/config' +import { CreateSubscriptionParams, SupportedToken, TxOptions } from 'contracts/interfaces' +import ContractWithTokens from 'contracts/wrappers/contract-using-tokens' +import { BaseToken } from 'models/Token' +import { convertToWeiString } from 'utils/parsers' +import { getTokensFromConfigTokens } from 'utils/tokenUtils' +import Web3 from 'web3' +import { TransactionReceipt } from 'web3-eth' +import { AbiItem } from 'web3-utils' + +export type NotifierContractErrorId = 'contract-notifier' + +class NotifierContract extends ContractWithTokens { + public static gasMultiplier = 1.1 + + public static getInstance(web3: Web3): NotifierContract { + if (!NotifierContract.instance) { + NotifierContract.instance = new NotifierContract( + web3, + new web3.eth.Contract( + NotifierManager.abi as AbiItem[], + notifierAddress, + ), + getTokensFromConfigTokens(notifierSupportedTokens), + 'contract-notifier', + ) + } + return NotifierContract.instance + } + + private static instance: NotifierContract + + public isWhitelistedProvider( + account: string, + txOptions: TxOptions = {}, + ): Promise { + return this._call( + this.methods.isWhitelistedProvider(account), + { + ...txOptions, + from: account, + }, + ) + } + + public async registerProvider( + url: string, + txOptions: TxOptions, + ): Promise { + const registerProviderTx = await this.methods.registerProvider(url) + + return this.send( + registerProviderTx, + { + gasMultiplier: NotifierContract.gasMultiplier, + ...txOptions, + }, + ) + } + + public async withdrawFunds( + hash: string, + { tokenAddress }: BaseToken, + amount: Big, + from: string, + txOptions: TxOptions = {}, + ): Promise { + if (!hash) throw Error('Subscription hash not defined.') + + return this.send( + await this.methods.withdrawFunds( + hash, tokenAddress, convertToWeiString(amount), + ), + { + gasMultiplier: NotifierContract.gasMultiplier, + from, + ...txOptions, + }, + ) + } + + public isWhitelistedToken = ( + { tokenAddress }: SupportedToken, + txOptions: TxOptions, + ): Promise => this._call( + this.methods.isWhitelistedToken(tokenAddress), + txOptions, + ) + + public createSubscription = ( + data: CreateSubscriptionParams, + txOptions: TxOptions, + ): Promise => { + const { + providerAddress, + subscriptionHash, + signature, + amount, + tokenAddress, + } = data + const weiAmount = convertToWeiString(amount) + const createSubsTx = this.contract.methods.createSubscription( + providerAddress, + subscriptionHash, + signature, + tokenAddress, + weiAmount, + ) + return this.send(createSubsTx, { + gasMultiplier: NotifierContract.gasMultiplier, + ...txOptions, + value: weiAmount, + }) + } +} + +export default NotifierContract diff --git a/src/contracts/notifier/Staking.ts b/src/contracts/notifier/Staking.ts new file mode 100644 index 000000000..accfaecc5 --- /dev/null +++ b/src/contracts/notifier/Staking.ts @@ -0,0 +1,103 @@ +import Staking from '@rsksmart/rif-marketplace-notifier/build/contracts/Staking.json' +import { notifierStakingAddress, notifierSupportedTokens } from 'contracts/config' +import { SupportedToken, TxOptions } from 'contracts/interfaces' +import { validateBalance } from 'contracts/utils/accountBalance' +import ContractWithTokens from 'contracts/wrappers/contract-using-tokens' +import CustomError from 'models/CustomError' +import { convertToWeiString } from 'utils/parsers' +import { getTokensFromConfigTokens } from 'utils/tokenUtils' +import Web3 from 'web3' +import { TransactionReceipt } from 'web3-eth' +import { AbiItem } from 'web3-utils' +import Big from 'big.js' +import { ZERO_BYTES } from 'constants/strings' + +export type NotifierStakingContractErrorId = 'contract-notifier-staking' + +class NotifierStakingContract extends ContractWithTokens { + public static gasMultiplier = 1.1 + + public static getInstance(web3: Web3): NotifierStakingContract { + if (!NotifierStakingContract.instance) { + NotifierStakingContract.instance = new NotifierStakingContract( + web3, + new web3.eth.Contract( + Staking.abi as AbiItem[], + notifierStakingAddress, + ), + getTokensFromConfigTokens(notifierSupportedTokens), + 'contract-notifier-staking', + ) + } + return NotifierStakingContract.instance + } + + private static instance: NotifierStakingContract + + public async stake( + amount: Big, + txOptions: TxOptions, + ): Promise { + if (Big(amount).lte(Big(0))) { + throw new CustomError('The amount to stake should be greater then 0.') + } + + const { from: account, token } = txOptions + const { tokenAddress } = this.getToken(token) + const amountWei = convertToWeiString(amount) + + await validateBalance({ + web3: this.web3, minAmountWei: amountWei, account, token, + }) + + const stakeTx = this.methods.stake( + amountWei, + tokenAddress, + ZERO_BYTES, + ) + + return this.send( + stakeTx, + { + gasMultiplier: NotifierStakingContract.gasMultiplier, + ...txOptions, + value: amountWei, + }, + ) + } + + public unstake( + amount: Big, + txOptions: TxOptions, + ): Promise { + if (Big(amount).lte(Big(0))) { + throw new CustomError('The amount to unstake should be greater then 0.') + } + + const { tokenAddress } = this.getToken(txOptions.token) + const amountWei = convertToWeiString(amount) + + const unstakeTx = this.methods.unstake( + amountWei, + tokenAddress, + ZERO_BYTES, + ) + return this.send( + unstakeTx, + { + gasMultiplier: NotifierStakingContract.gasMultiplier, + ...txOptions, + }, + ) + } + + public isWhitelistedToken = ( + { tokenAddress }: SupportedToken, + txOptions: TxOptions, + ): Promise => this._call( + this.methods.isWhitelistedToken(tokenAddress), + txOptions, + ) +} + +export default NotifierStakingContract diff --git a/src/contracts/rns/Marketplace.ts b/src/contracts/rns/Marketplace.ts index bd55627eb..7df9ee640 100644 --- a/src/contracts/rns/Marketplace.ts +++ b/src/contracts/rns/Marketplace.ts @@ -1,15 +1,17 @@ +import ContractWithTokens from 'contracts/wrappers/contract-using-tokens' +import { getTokensFromConfigTokens } from 'utils/tokenUtils' import Web3 from 'web3' import { TransactionReceipt } from 'web3-eth' import { AbiItem } from 'web3-utils' - import RNSSimplePlacementsV1 from '../abi/nfts/RNSSimplePlacementsV1.json' -import { marketPlaceAddress } from '../config' -import { TransactionOptions } from '../interfaces' -import ContractBase from '../wrappers/contract-base' +import { marketPlaceAddress, rnsSupportedTokens } from '../config' +import { + SupportedToken, TOKEN_TYPES, TransactionOptions, TxOptions, +} from '../interfaces' export type MarketplaceContractErrorId = 'contract-marketplace-place' | 'contract-marketplace-unplace' | 'contract-marketplace-getPlacement' -class MarketplaceContract extends ContractBase { +class MarketplaceContract extends ContractWithTokens { public static gasMultiplier = 1.3 public static getInstance(web3: Web3): MarketplaceContract { @@ -20,6 +22,7 @@ class MarketplaceContract extends ContractBase { RNSSimplePlacementsV1.abi as AbiItem[], marketPlaceAddress, ), + getTokensFromConfigTokens(rnsSupportedTokens), 'marketplace-contract', ) } @@ -86,6 +89,34 @@ class MarketplaceContract extends ContractBase { }, ) } + + public isWhitelistedToken = async ( + { + type, + tokenAddress, + }: SupportedToken, + txOptions: TxOptions, + ): Promise => { + if (type === TOKEN_TYPES.NATIVE) { + return this._call( + this.methods.isGasPaymentAllowed(), + txOptions, + ) + } + + const wlByType = await this._call<{0: boolean, 1: boolean, 2: boolean}>( + this.methods.whitelistedPaymentToken(tokenAddress), + txOptions, + ) + + const wLTokens = { + [TOKEN_TYPES.ERC20]: wlByType[0], + [TOKEN_TYPES.ERC677]: wlByType[1], + [TOKEN_TYPES.ERC777]: wlByType[2], + } + + return wLTokens[type] + } } export default MarketplaceContract diff --git a/src/contracts/storage/Staking.ts b/src/contracts/storage/Staking.ts index 97a24b6ba..d1077eba3 100644 --- a/src/contracts/storage/Staking.ts +++ b/src/contracts/storage/Staking.ts @@ -3,10 +3,9 @@ import { convertToWeiString } from 'utils/parsers' import Web3 from 'web3' import { TransactionReceipt } from 'web3-eth' import { AbiItem } from 'web3-utils' - import { ZERO_BYTES } from 'constants/strings' -import { stakingAddress, storageSupportedTokens } from 'contracts/config' -import { TxOptions } from 'contracts/interfaces' +import { storageStakingAddress, storageSupportedTokens } from 'contracts/config' +import { SupportedToken, TxOptions } from 'contracts/interfaces' import { getTokensFromConfigTokens } from 'utils/tokenUtils' import ContractWithTokens from 'contracts/wrappers/contract-using-tokens' import Big from 'big.js' @@ -25,7 +24,7 @@ class StakingContract extends ContractWithTokens { web3, new web3.eth.Contract( Staking.abi as AbiItem[], - stakingAddress, + storageStakingAddress, ), getTokensFromConfigTokens(storageSupportedTokens), 'contract-storage-staking', @@ -114,6 +113,14 @@ class StakingContract extends ContractWithTokens { txOptions, ) } + + public isWhitelistedToken = ( + { tokenAddress }: SupportedToken, + txOptions: TxOptions, + ): Promise => this._call( + this.methods.isWhitelistedToken(tokenAddress), + txOptions, + ) } export default StakingContract diff --git a/src/contracts/storage/Storage.ts b/src/contracts/storage/Storage.ts index aad3a9290..02751adb7 100644 --- a/src/contracts/storage/Storage.ts +++ b/src/contracts/storage/Storage.ts @@ -1,15 +1,14 @@ import StorageManager from '@rsksmart/rif-marketplace-storage/build/contracts/StorageManager.json' +import { storageAddress, storageSupportedTokens } from 'contracts/config' +import { SupportedToken, TxOptions } from 'contracts/interfaces' +import { validateBalance } from 'contracts/utils/accountBalance' +import ContractWithTokens from 'contracts/wrappers/contract-using-tokens' +import { BaseToken, SYSTEM_SUPPORTED_SYMBOL } from 'models/Token' import { convertToWeiString } from 'utils/parsers' +import { getTokensFromConfigTokens } from 'utils/tokenUtils' import Web3 from 'web3' import { TransactionReceipt } from 'web3-eth' import { AbiItem } from 'web3-utils' - -import { storageAddress, storageSupportedTokens } from 'contracts/config' -import { TxOptions } from 'contracts/interfaces' -import { getTokensFromConfigTokens } from 'utils/tokenUtils' -import ContractWithTokens from 'contracts/wrappers/contract-using-tokens' -import { validateBalance } from 'contracts/utils/accountBalance' -import { SYSTEM_SUPPORTED_SYMBOL, BaseToken } from 'models/Token' import { encodeHash, prefixArray } from './utils' export type StorageContractErrorId = 'contract-storage' @@ -282,6 +281,14 @@ class StorageContract extends ContractWithTokens { }, ) } + + public isWhitelistedToken = ( + { tokenAddress }: SupportedToken, + txOptions: TxOptions, + ): Promise => this._call( + this.methods.isWhitelistedToken(tokenAddress), + txOptions, + ) } export default StorageContract diff --git a/src/contracts/utils/waitForReceipt.ts b/src/contracts/utils/waitForReceipt.ts index 3d94cada5..23f5aff0a 100644 --- a/src/contracts/utils/waitForReceipt.ts +++ b/src/contracts/utils/waitForReceipt.ts @@ -14,11 +14,17 @@ function waitForReceipt( timeElapsed += POLLING_INTERVAL const receipt = await web3.eth.getTransactionReceipt(txHash) - if (receipt != null) { + if (receipt?.status) { clearInterval(checkInterval) resolve(receipt) } + if (receipt && !receipt.status) { + reject( + new Error(`Transaction reverted, ${web3.eth.handleRevert && 'please, see the "MetaMask - RPC Error" bellow, under "data.error.message" for details.'} receipt: ${JSON.stringify(receipt, null, 2)}`), + ) + } + if (timeElapsed > TIMEOUT_LIMIT) { reject( new Error('Transaction receipt could not be retrieved - Timeout'), diff --git a/src/contracts/wrappers/contract-base.ts b/src/contracts/wrappers/contract-base.ts index 19d4da4ac..234cce8c6 100644 --- a/src/contracts/wrappers/contract-base.ts +++ b/src/contracts/wrappers/contract-base.ts @@ -19,6 +19,8 @@ export class ContractBase { this.name = name this.contract = contact this.web3 = web3 + + this.web3.eth.handleRevert = true } public get methods(): Record { @@ -89,10 +91,10 @@ export class ContractBase { return txReceipt } - protected async _call( + protected async _call( tx: any, txOptions: TxOptions, - ): Promise { + ): Promise { const { from, value, diff --git a/src/contracts/wrappers/contract-using-tokens.ts b/src/contracts/wrappers/contract-using-tokens.ts index be23a3711..d22eab6a3 100644 --- a/src/contracts/wrappers/contract-using-tokens.ts +++ b/src/contracts/wrappers/contract-using-tokens.ts @@ -12,7 +12,12 @@ import { } from '../interfaces' import ContractBase from './contract-base' -export class ContractWithTokens extends ContractBase { +export abstract class ContractWithTokens extends ContractBase { + public abstract isWhitelistedToken: ( + token: SupportedToken, + txOptions: TxOptions, + ) => Promise + private readonly supportedTokens: SupportedToken[] private _defaultToken: SupportedTokenSymbol diff --git a/src/hooks/useDisabledStyle.tsx b/src/hooks/useDisabledStyle.tsx new file mode 100644 index 000000000..af9cda6df --- /dev/null +++ b/src/hooks/useDisabledStyle.tsx @@ -0,0 +1,11 @@ +import { makeStyles, Theme } from '@material-ui/core/styles' + +const useDisabledStyle = makeStyles(({ palette }: Theme) => ({ + root: { + '& *': { + color: palette.text.disabled, + }, + }, +})) + +export default useDisabledStyle diff --git a/src/models/marketItems/NotifierEventItem.ts b/src/models/marketItems/NotifierEventItem.ts new file mode 100644 index 000000000..95973b424 --- /dev/null +++ b/src/models/marketItems/NotifierEventItem.ts @@ -0,0 +1,9 @@ +import { Item } from 'models/Market' +import { NotifierEvent } from './NotifierItem' + +export type NotifierEventItem = Item & { + type: string + channels: string + signature: string + event: NotifierEvent +} diff --git a/src/models/marketItems/NotifierFilters.ts b/src/models/marketItems/NotifierFilters.ts new file mode 100644 index 000000000..26e32b94e --- /dev/null +++ b/src/models/marketItems/NotifierFilters.ts @@ -0,0 +1,24 @@ +import { ProviderDTO } from 'api/rif-marketplace-cache/notifier/subscriptions/models' +import { SubscriptionDTO } from 'api/rif-notifier-service/models/subscriptions' +import { SupportedFiatSymbol } from 'models/Fiat' +import { MinMaxFilter } from 'models/Filters' +import { SupportedTokenSymbol } from 'models/Token' + +type PriceFilter = MinMaxFilter & { + fiatSymbol: SupportedFiatSymbol +} + +export type NotifierOffersFilters = { + size: MinMaxFilter + price: PriceFilter + currency?: Set + provider?: string +} + +export type NotifierSubscriptionsFilters = Partial + +export type NotifierProvidersFilters = Partial + +export type NotifierFilters = + | NotifierOffersFilters + | NotifierSubscriptionsFilters diff --git a/src/models/marketItems/NotifierItem.ts b/src/models/marketItems/NotifierItem.ts new file mode 100644 index 000000000..f295e46a1 --- /dev/null +++ b/src/models/marketItems/NotifierItem.ts @@ -0,0 +1,69 @@ +import { Item } from 'models/Market' +import Big from 'big.js' +import { SupportedToken } from 'contracts/interfaces' +import { SubscriptionDTO, TopicDTO } from 'api/rif-marketplace-cache/notifier/subscriptions/models' +import { SupportedEventType, SupportedEventChannel } from 'config/notifier' +import { PlanStatus } from 'api/rif-marketplace-cache/notifier/offers/models' + +export type PriceOption = { + token: SupportedToken + value: Big +} +export type NotifierPlanPriceOption = PriceOption + +export type Provider = { + provider: string + url: string +} + +export type EventChannel = { + type: SupportedEventChannel + origin: string +} + +export type EventChannels = Array + +export type NotifierPlan = Item & Provider & { + planId: number + name: string + channels: EventChannels + limit: number + priceOptions: PriceOption[] + daysLeft: number + planStatus: PlanStatus +} + +export type NotifierOfferItem = NotifierPlan + +export type NotifierSubscriptionItem = Item & Omit & { + price: Big + provider: Provider + token: SupportedToken + events: Array + withdrawableFunds: Big +} + +export type SelectedEventChannel = EventChannel & { + destination: string +} + +export type SelectedEventChannels = Array + +export type NotifierItem = NotifierOfferItem | NotifierSubscriptionItem + +export type NotifierEventParam = { + name: string + type: string + indexed?: boolean + order?: number +} + +export type NotifierEvent = { + name?: string + params?: Array + channels: SelectedEventChannels + smartContract?: string + type: SupportedEventType + signature?: string +} diff --git a/src/routes.ts b/src/routes.ts index bf7d23a75..e1c848854 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,24 +1,33 @@ const LISTING = 'listing' const CHECKOUT = 'checkout' const EDIT = 'edit' +const BUY = 'buy' +const SELL = 'sell' +const CANCEL = 'cancel' +const RENEW = 'renew' +const MY_OFFERS = 'myoffers' +const MY_PURCHASES = 'mypurchases' const LANDING = '/' const RNS = '/domains' -const RNS_BUY = `${RNS}/buy` -const RNS_SELL = `${RNS}/sell` -const RNS_CANCEL = `${RNS_SELL}/cancel` +const RNS_BUY = `${RNS}/${BUY}` +const RNS_SELL = `${RNS}/${SELL}` +const RNS_CANCEL = `${RNS_SELL}/${CANCEL}` const STORAGE = '/storage' -const STORAGE_BUY = `${STORAGE}/buy` -const STORAGE_SELL = `${STORAGE}/sell` -const STORAGE_MYOFFERS = `${STORAGE}/myoffers` -const STORAGE_MYOFFERS_CANCEL = `${STORAGE_MYOFFERS}/cancel` -const STORAGE_MYPURCHASES = `${STORAGE}/mypurchases` -const STORAGE_RENEW_AGREEMENT = `${STORAGE_MYPURCHASES}/renew` +const STORAGE_BUY = `${STORAGE}/${BUY}` +const STORAGE_SELL = `${STORAGE}/${SELL}` +const STORAGE_MYOFFERS = `${STORAGE}/${MY_OFFERS}` +const STORAGE_MYOFFERS_CANCEL = `${STORAGE_MYOFFERS}/${CANCEL}` +const STORAGE_MYPURCHASES = `${STORAGE}/${MY_PURCHASES}` +const STORAGE_RENEW_AGREEMENT = `${STORAGE_MYPURCHASES}/${RENEW}` -const TRIGGERS = '/notifications' -const TRIGGERS_BUY = `${TRIGGERS}/buy` +const NOTIFIER = '/notifier' +const NOTIFIER_BUY = `${NOTIFIER}/${BUY}` +const NOTIFIER_SELL = `${NOTIFIER}/${SELL}` +const NOTIFIER_MYOFFERS = `${NOTIFIER}/${MY_OFFERS}` +const NOTIFIER_MYPURCHASES = `${NOTIFIER}/${MY_PURCHASES}` const FAQ = '/faq' const ABOUT = '/about' @@ -62,10 +71,21 @@ const ROUTES = { RENEW: `${STORAGE_RENEW_AGREEMENT}/${CHECKOUT}`, }, }, - TRIGGERS: { - BASE: TRIGGERS, + NOTIFIER: { + BASE: NOTIFIER, BUY: { - BASE: TRIGGERS_BUY, + BASE: NOTIFIER_BUY, + CHECKOUT: `${NOTIFIER_BUY}/${CHECKOUT}`, + }, + SELL: { + BASE: NOTIFIER_SELL, + }, + MYOFFERS: { + BASE: NOTIFIER_MYOFFERS, + EDIT: `${NOTIFIER_MYOFFERS}/${EDIT}`, + }, + MYPURCHASES: { + BASE: NOTIFIER_MYPURCHASES, }, }, FAQ, diff --git a/src/ui-config.json b/src/ui-config.json index a9eb926da..6ad5a604d 100644 --- a/src/ui-config.json +++ b/src/ui-config.json @@ -1,19 +1,65 @@ { "ganache": { "contractAddresses": { - "rif": "0x67b5656d60a809915323bf2c40a8bef15a152e3e", + "rif": "0x67B5656d60a809915323Bf2C40A8bEF15A152e3e", "rnsDotRskOwner": "0x26b4AFb60d6C903165150C6F0AA14F8016bE4aec", "marketplace": "0xeF391648603DCb012e30eF706452b3DfF6466dE8", "storageManager": "0x1b88Bdb8269A1aB1372459F5a4eC3663D6f5cCc4", - "storageStaking": "0xdAA71FBBA28C946258DD3d5FcC9001401f72270F" + "storageStaking": "0x22d5C8BdD4346b390014a07109a8F830094d4abf", + "notifierManager": "0xc34175A79ACca40392bECD22ff10fAeBFE780Ae7", + "notifierStaking": "0xe97DbD7116D168190F8A6E7beB1092c103c53a12" }, "rnsManagerUrl": "http://localhost:3001", "services": { "rns": { - "tokens": ["rbtc", "rif"] + "tokens": [ + "rbtc", + "rif" + ] }, "storage": { - "tokens": ["rbtc", "rif"] + "tokens": [ + "rbtc", + "rif" + ] + }, + "notifier": { + "tokens": [ + "rbtc", + "rif" + ] + } + } + }, + "rskdevnet": { + "contractAddresses": { + "rif": "0x1Af2844A588759D0DE58abD568ADD96BB8B3B6D8", + "rnsDotRskOwner": "0xdac5481925A298B95Bf5b54c35b68FC6fc2eF423", + "marketplace": "0xDbDA66cB801b5BCBdF3d3188171D6eF49646FEE5", + "storageManager": "0x13cF0a53b6102b518e8b547d5E50b38C1b089E08", + "storageStaking": "0xc3e75147D582fFc126590C537cEe894180aAcDDC", + "notifierManager": "0x73b1C6D725eAfb2B9514e2aF092f9f61Fd005088", + "notifierStaking": "0xb0082444317d7DE625fE4185025cc23Abb0501dD" + }, + "rnsManagerUrl": "http://localhost:3001", + "services": { + "rns": { + "tokens": [ + "rbtc", + "rif" + ] + }, + "storage": { + "tokens": [ + "rbtc", + "rif" + ] + }, + "notifier": { + "tokens": [ + "rbtc", + "rif" + ] } } }, @@ -21,14 +67,25 @@ "contractAddresses": { "rif": "0x2acc95758f8b5f583470ba265eb685a8f45fc9d5", "rnsDotRskOwner": "0x45d3e4fb311982a06ba52359d44cb4f5980e0ef1", - "marketplace": "0xa966Be39A13723d991dFA92B2B0CF6b0c7416eE5" + "marketplace": "0xa966Be39A13723d991dFA92B2B0CF6b0c7416eE5", + "storageManager": "0xa18c181229F374b00f126fC952775d41A4F4c40e", + "storageStaking": "0xe82Eb1C0D40D555b8030116132EdA0B9f1032263" }, "rnsManagerUrl": "https://manager.rns.rifos.org", - "services": { - "rns": { - "tokens": ["rif"] - } - } + "services": { + "rns": { + "tokens": [ + "rbtc", + "rif" + ] + }, + "storage": { + "tokens": [ + "rbtc", + "rif" + ] + } + } }, "rsktestnet": { "contractAddresses": { @@ -36,15 +93,29 @@ "rnsDotRskOwner": "0xca0a477e19bac7e0e172ccfd2e3c28a7200bdb71", "marketplace": "0xFa5ade767a422C66cAFd94c3710f5b92467fB85e", "storageManager": "0x839856c0eC1aA2AeD25D47Fd3DDB7A14Dac3e76d", - "storageStaking": "0x11bE792f8fcfC84897b88e149dD3fb66b422256f" + "storageStaking": "0x11bE792f8fcfC84897b88e149dD3fb66b422256f", + "notifierManager": "0xcaED0CCbb3d9B9090d848Ea271f0abAa195f03EA", + "notifierStaking": "0x315645E455107213c3A35e56a12Aad595F10d922" }, "rnsManagerUrl": "https://testnet.manager.rns.rifos.org", "services": { "rns": { - "tokens": ["rif"] + "tokens": [ + "rbtc", + "rif" + ] }, "storage": { - "tokens": ["rbtc", "rif"] + "tokens": [ + "rbtc", + "rif" + ] + }, + "notifier": { + "tokens": [ + "rbtc", + "rif" + ] } } }, @@ -54,16 +125,30 @@ "rnsDotRskOwner": "0xca0a477e19bac7e0e172ccfd2e3c28a7200bdb71", "marketplace": "0x978908db72E43DB49A80c74A1383Bd5b3e832c46", "storageManager": "0xaF37117a4907331DC49b05bDC1DE920F12dBF715", - "storageStaking": "0xF1573D262924abE24334FDDD62c6Ba58288d2f8c" + "storageStaking": "0xF1573D262924abE24334FDDD62c6Ba58288d2f8c", + "notifierManager": "0xd60e913029a6790fb9e5b8c459b451dd6e501139", + "notifierStaking": "0x19578c5b4f3d382abaa494e221a5e654ee5e6dc6" }, "rnsManagerUrl": "https://testnet.manager.rns.rifos.org", "services": { "rns": { - "tokens": ["rif"] + "tokens": [ + "rbtc", + "rif" + ] }, "storage": { - "tokens": ["rbtc", "rif"] + "tokens": [ + "rbtc", + "rif" + ] + }, + "notifier": { + "tokens": [ + "rbtc", + "rif" + ] } } } -} +} \ No newline at end of file diff --git a/src/utils/priceUtils.ts b/src/utils/priceUtils.ts new file mode 100644 index 000000000..ba68bd37f --- /dev/null +++ b/src/utils/priceUtils.ts @@ -0,0 +1,36 @@ +import Big, { BigSource } from 'big.js' +import { TokenXR } from 'models/Market' + +export const PRICE_PRECISIONS = { + FIAT: 3, + CRYPTO: 8, +} as const + +export const squashTrailingZeroes = (text: string): string => text.replace(/0+$/, '0') + +export const toPrecision = ( + price: BigSource, + precisionType: keyof typeof PRICE_PRECISIONS, +): string => { + const precision = PRICE_PRECISIONS[precisionType] + + const bigPrice = Big(price) + const exponent = Math.abs(bigPrice.e) + + const fixTo = bigPrice.lt(1) && exponent > precision ? exponent : precision + + return squashTrailingZeroes(bigPrice.toFixed(fixTo)) +} + +export const toFiatPrecision = (price: BigSource): string => toPrecision(price, 'FIAT') +export const toCryptoPrecision = (price: BigSource): string => toPrecision(price, 'CRYPTO') + +export const getFiatPrice = ( + price: Big, + token?: TokenXR, +): string => toFiatPrecision(price.mul(token?.rate || 0)) + +export const getCryptoPrice = ( + price: BigSource, + token?: TokenXR, +): string => toCryptoPrecision(Big(price).div(token?.rate || 1)) diff --git a/src/utils/stringUtils.ts b/src/utils/stringUtils.ts index 5ca7b1c1b..64288e57d 100644 --- a/src/utils/stringUtils.ts +++ b/src/utils/stringUtils.ts @@ -14,6 +14,18 @@ export const isEmpty = ( text: string | unknown, ): boolean => !(text && String(text).trim()) +export const toChecksum = (address: string): string => toChecksumAddress( + address, networkId, +) + export const shortChecksumAddress = (address: string): string => shortenString( - toChecksumAddress(address, networkId), + toChecksum(address), ) + +export const removeURLProtocol = (url: string) => url.replace(/^http[s]*:\/\//, '') + +export const trailingSlashRegex = new RegExp(/\/$/, '') + +export const emailRegex = new RegExp(/^\S+@\S+\.\S+$/) + +export const ipRegex = new RegExp(/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}|(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/) diff --git a/src/utils/tokenUtils.ts b/src/utils/tokenUtils.ts index 00d3bfc64..d70f9eb28 100644 --- a/src/utils/tokenUtils.ts +++ b/src/utils/tokenUtils.ts @@ -3,7 +3,9 @@ import { SupportedToken, SUPPORTED_TOKEN_RECORDS } from 'contracts/interfaces' import { SupportedTokenSymbol, BaseToken } from 'models/Token' import { SYSTEM_TOKENS } from '../models/Token' -export const getSupportedTokenByName = (tokenName: SupportedTokenSymbol): SupportedToken => { +export const getSupportedTokenByName = ( + tokenName: SupportedTokenSymbol, +): SupportedToken => { const tokenObject: SupportedToken = SUPPORTED_TOKEN_RECORDS[tokenName] if (!tokenObject) { @@ -18,7 +20,9 @@ export const getTokensFromConfigTokens = ( export const getTokenByString = ( paymentToken: string, -): SupportedToken => getSupportedTokenByName(paymentToken.toLowerCase() as SupportedTokenSymbol) +): SupportedToken => getSupportedTokenByName( + paymentToken.toLowerCase() as SupportedTokenSymbol, +) export const getTokenByAddress = (tokenAddress: string): BaseToken => { const symbol = addressTokenRecord[ diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 06960edad..d22af6f85 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,9 +1,4 @@ -import Big from 'big.js' - -export const priceDisplay = (value: number | Big, maxDecimals = 8): string => value - .toFixed(maxDecimals) - .toString() - .replace(/[.,]00000000$/, '') +import Logger from './Logger' export enum UNIT_PREFIX_POW2 { KILO = 1024, @@ -22,3 +17,7 @@ export const getTabValueFromLocation = ( const activeTab = tabs.find((tab) => currentPath.includes(tab.to)) return activeTab?.to || defaultRoute } + +export const logNotImplemented = (name: string) => (info?: unknown): void => { + Logger.getInstance().warn(`We have yet to implement "${name}".`, info) +} diff --git a/src/utils/validationUtils.ts b/src/utils/validationUtils.ts new file mode 100644 index 000000000..83279a998 --- /dev/null +++ b/src/utils/validationUtils.ts @@ -0,0 +1,10 @@ +const validateURL = (url: string, validProtocols: Array): boolean => { + try { + const { protocol } = new URL(url) + return validProtocols.includes(protocol) + } catch { + return false + } +} + +export default validateURL