diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 0f5d238..f3f3f8f 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "20" cache: "npm" - run: npm ci - run: npm run test -- --coverage diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..9a2a0e2 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20 diff --git a/package-lock.json b/package-lock.json index 017edd9..23998ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,38 +1,38 @@ { "name": "ethereum-store", - "version": "0.2.3", + "version": "0.2.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ethereum-store", - "version": "0.2.3", + "version": "0.2.8", "license": "MIT", "dependencies": { "big.js": "^6.2.1", "buffer": "^6.0.3", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "lodash": "^4.17.21", "lodash.clonedeep": "^4.5.0", - "react-redux": "^8.1.2", - "react-router-dom": "^5.2.0", - "reactstrap": "^9.2.0", - "redux": "^4.2.1", + "react-redux": "^9.0.4", + "react-router-dom": "^6.21.0", + "reactstrap": "^9.2.1", + "redux": "^5.0.0", "redux-saga": "^1.2.3", "reselect": "^4.1.8", - "web3": "^4.1.1" + "web3": "^4.3.0" }, "devDependencies": { - "@babel/cli": "^7.23.0", - "@babel/core": "^7.23.3", - "@babel/preset-env": "^7.23.3", - "@openzeppelin/contracts": "^4.9.3", - "@testing-library/jest-dom": "^6.1.4", - "@testing-library/react": "^14.0.0", + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.6", + "@babel/preset-env": "^7.23.6", + "@openzeppelin/contracts": "^5.0.1", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.5.1", - "prettier": "^3.0.2", + "prettier": "^3.1.1", "react-scripts": "^5.0.1", - "sinon": "^15.2.0" + "sinon": "^17.0.1" }, "peerDependencies": { "react": "^18.2.0", @@ -50,9 +50,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", "dev": true }, "node_modules/@adraffy/ens-normalize": { @@ -86,9 +86,9 @@ } }, "node_modules/@babel/cli": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.0.tgz", - "integrity": "sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -115,12 +115,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -128,30 +128,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -194,12 +194,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.3", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -233,14 +233,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -249,17 +249,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -289,9 +289,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -473,9 +473,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -491,9 +491,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -514,23 +514,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -542,9 +542,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -586,9 +586,9 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -619,15 +619,13 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz", - "integrity": "sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz", + "integrity": "sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-create-class-features-plugin": "^7.23.7", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { @@ -1041,9 +1039,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", - "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1091,9 +1089,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", - "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1122,9 +1120,9 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", - "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -1139,9 +1137,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -1224,9 +1222,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", - "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1256,9 +1254,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", - "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1288,12 +1286,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1320,9 +1319,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", - "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1351,9 +1350,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", - "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1480,9 +1479,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", - "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1496,9 +1495,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", - "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1512,9 +1511,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", - "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.3", @@ -1547,9 +1546,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", - "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1563,9 +1562,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", - "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1611,9 +1610,9 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", - "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -1674,16 +1673,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -1755,16 +1754,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz", - "integrity": "sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", + "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "semver": "^6.3.1" }, "engines": { @@ -1851,13 +1850,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", - "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-create-class-features-plugin": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.23.3" }, @@ -1932,18 +1931,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", + "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", + "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1964,25 +1963,25 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.5", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", @@ -1990,15 +1989,15 @@ "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", "@babel/plugin-transform-parameters": "^7.23.3", "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", "@babel/plugin-transform-property-literals": "^7.23.3", "@babel/plugin-transform-regenerator": "^7.23.3", "@babel/plugin-transform-reserved-words": "^7.23.3", @@ -2012,9 +2011,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2085,9 +2084,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2110,20 +2109,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2131,12 +2130,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -2151,9 +2150,9 @@ "dev": true }, "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", "dev": true }, "node_modules/@csstools/postcss-cascade-layers": { @@ -2461,9 +2460,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2490,9 +2489,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2528,697 +2527,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -3252,6 +2580,96 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3377,9 +2795,9 @@ } }, "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -3596,9 +3014,9 @@ } }, "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -3943,9 +3361,9 @@ } }, "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -4114,9 +3532,9 @@ } }, "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -4262,9 +3680,9 @@ } }, "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -4447,9 +3865,9 @@ } }, "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -4780,9 +4198,9 @@ } }, "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -4909,9 +4327,9 @@ } }, "node_modules/@jest/test-sequencer/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -5412,20 +4830,20 @@ } }, "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "engines": { "node": ">= 16" }, @@ -5469,11 +4887,21 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.1.tgz", + "integrity": "sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w==", "dev": true }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", @@ -5534,9 +4962,9 @@ } }, "node_modules/@react-aria/ssr": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.0.tgz", - "integrity": "sha512-Bz6BqP6ZorCme9tSWHZVmmY+s7AU8l6Vl2NUYmBzezD//fVHHfFo4lFBn5tBuAaJEm3AuCLaJQ6H2qhxNSb7zg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.1.tgz", + "integrity": "sha512-NqzkLFP8ZVI4GSorS0AYljC13QW2sc8bDqJOkBvkAt3M8gbcAXJWVRGtZBCRscki9RZF+rNlnPdg0G0jYkhJcg==", "peer": true, "dependencies": { "@swc/helpers": "^0.5.0" @@ -5549,9 +4977,9 @@ } }, "node_modules/@redux-saga/core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.3.tgz", - "integrity": "sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", + "integrity": "sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA==", "dependencies": { "@babel/runtime": "^7.6.3", "@redux-saga/deferred": "^1.2.1", @@ -5559,7 +4987,6 @@ "@redux-saga/is": "^1.1.3", "@redux-saga/symbols": "^1.1.3", "@redux-saga/types": "^1.2.1", - "redux": "^4.0.4", "typescript-tuple": "^2.2.1" }, "funding": { @@ -5599,10 +5026,18 @@ "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==" }, + "node_modules/@remix-run/router": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", + "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@restart/hooks": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz", - "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", + "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", "peer": true, "dependencies": { "dequal": "^2.0.3" @@ -5721,15 +5156,15 @@ "dev": true }, "node_modules/@rushstack/eslint-patch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", + "integrity": "sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==", "dev": true }, "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", "funding": { "url": "https://paulmillr.com/funding/" } @@ -5747,6 +5182,28 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@scure/bip39": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", @@ -6143,17 +5600,17 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz", - "integrity": "sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.2.0.tgz", + "integrity": "sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw==", "dev": true, "dependencies": { - "@adobe/css-tools": "^4.3.1", + "@adobe/css-tools": "^4.3.2", "@babel/runtime": "^7.9.2", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", + "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.15", "redent": "^3.0.0" }, @@ -6229,6 +5686,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, "node_modules/@testing-library/jest-dom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6251,9 +5714,9 @@ } }, "node_modules/@testing-library/react": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.1.0.tgz", - "integrity": "sha512-hcvfZEEyO0xQoZeHmUbuMs7APJCGELpilL7bY+BaJaMP57aWc6q1etFwScnoZDheYjk4ESdlzPdQ33IbsKAK/A==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.1.2.tgz", + "integrity": "sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", @@ -6269,9 +5732,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.5.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", - "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, "engines": { "node": ">=12", @@ -6306,9 +5769,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -6319,9 +5782,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -6338,9 +5801,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -6375,9 +5838,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", - "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -6385,9 +5848,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", - "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz", + "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -6443,15 +5906,6 @@ "@types/node": "*" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -6516,17 +5970,14 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", - "dependencies": { - "undici-types": "~5.26.4" - } + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" }, "node_modules/@types/node-forge": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", - "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -6545,9 +5996,9 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.10", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", - "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/q": { "version": "1.5.8", @@ -6556,9 +6007,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -6568,9 +6019,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", - "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", + "version": "18.2.46", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz", + "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -6578,18 +6029,18 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.15", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", - "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", - "devOptional": true, + "version": "18.2.18", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", + "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", + "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", - "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "peer": true, "dependencies": { "@types/react": "*" @@ -6611,14 +6062,14 @@ "dev": true }, "node_modules/@types/scheduler": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", - "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==" + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/send": { @@ -6667,9 +6118,9 @@ "dev": true }, "node_modules/@types/trusted-types": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", - "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, "node_modules/@types/use-sync-external-store": { @@ -6692,9 +6143,9 @@ } }, "node_modules/@types/yargs": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", - "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -7202,6 +6653,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/abitype": { @@ -7232,9 +6684,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -7315,9 +6767,9 @@ } }, "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "node_modules/agent-base": { "version": "6.0.2", @@ -7500,9 +6952,9 @@ } }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-includes": { @@ -7958,13 +7410,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -7972,12 +7424,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "core-js-compat": "^3.33.1" }, "peerDependencies": { @@ -7985,12 +7437,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.4.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -8096,11 +7548,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, "node_modules/bfj": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", @@ -8144,11 +7591,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -8210,13 +7652,11 @@ "dev": true }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.0.tgz", + "integrity": "sha512-xdzMA6JGckxyJzZByjEWRcfKmDxXaGXZWVftah3FkCqdlePNS9DjHSUN5zkP4oEfz/t0EXXlro88EIhzwMB4zA==", "dev": true, "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -8249,11 +7689,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -8261,9 +7696,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -8280,9 +7715,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -8417,9 +7852,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001562", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz", - "integrity": "sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==", + "version": "1.0.30001574", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", + "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", "dev": true, "funding": [ { @@ -8532,14 +7967,14 @@ "dev": true }, "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -8787,9 +8222,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", - "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", + "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", "dev": true, "hasInstallScript": true, "funding": { @@ -8798,12 +8233,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -8811,9 +8246,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", - "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.0.tgz", + "integrity": "sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==", "dev": true, "hasInstallScript": true, "funding": { @@ -8897,9 +8332,9 @@ } }, "node_modules/create-jest/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -9324,9 +8759,9 @@ "dev": true }, "node_modules/cssdb": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz", - "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.10.0.tgz", + "integrity": "sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==", "dev": true, "funding": [ { @@ -9492,9 +8927,9 @@ "dev": true }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -9780,12 +9215,6 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -9864,6 +9293,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, "dependencies": { "webidl-conversions": "^5.0.0" @@ -9941,6 +9371,12 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -9963,30 +9399,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.583", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.583.tgz", - "integrity": "sha512-93y1gcONABZ7uqYe/JWDVQP/Pj/sQSunF0HVAPdlg/pfBnOyBMLlQUxWvkqcljJg1+W6cjvPuYD+r1Th9Tn8mA==", + "version": "1.4.620", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz", + "integrity": "sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==", "dev": true }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -10268,15 +9685,15 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -10415,9 +9832,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", @@ -10436,7 +9853,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -10839,9 +10256,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -10996,14 +10413,36 @@ "@scure/bip39": "1.2.1" } }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.2.tgz", + "integrity": "sha512-YpkrtILnMQz5jSEsJQRTpduaGT/CXuLnUIuOYzHA0v/7c8IX91m2J48wSKjzGL5L9J/Us3tLoUdb+OwE3U+FFQ==", "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "url": "https://github.com/sponsors/ethers-io/" }, { "type": "individual", @@ -11011,36 +10450,16 @@ } ], "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/eventemitter3": { @@ -11128,9 +10547,9 @@ } }, "node_modules/expect/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -11292,12 +10711,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -11354,9 +10767,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -11568,9 +10981,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -11595,6 +11008,34 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -12240,15 +11681,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -12269,42 +11701,6 @@ "he": "bin/he" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -12427,9 +11823,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -12446,7 +11842,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -12632,9 +12037,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -13400,6 +12805,24 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -13552,9 +12975,9 @@ } }, "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -13716,9 +13139,9 @@ } }, "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -13931,9 +13354,9 @@ } }, "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -14205,9 +13628,9 @@ } }, "node_modules/jest-config/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -14773,9 +14196,9 @@ } }, "node_modules/jest-each/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -15152,9 +14575,9 @@ } }, "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -15980,9 +15403,9 @@ } }, "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -16157,9 +15580,9 @@ } }, "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -16502,9 +15925,9 @@ } }, "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -16918,9 +16341,9 @@ } }, "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -17322,9 +16745,9 @@ } }, "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -17834,9 +17257,9 @@ } }, "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -18003,9 +17426,9 @@ } }, "node_modules/jest/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "optional": true, "peer": true, @@ -18104,11 +17527,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -18173,6 +17591,27 @@ } } }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -18761,12 +18200,8 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", @@ -18789,6 +18224,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -18962,9 +18406,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-path": { @@ -19079,13 +18523,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -19423,10 +18867,36 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/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==", + "dev": true, "dependencies": { "isarray": "0.0.1" } @@ -19434,7 +18904,8 @@ "node_modules/path-to-regexp/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -19625,9 +19096,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -19644,7 +19115,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -20111,21 +19582,27 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -20139,6 +19616,15 @@ } } }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/postcss-load-config/node_modules/yaml": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", @@ -20355,9 +19841,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz", + "integrity": "sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -20806,9 +20292,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -20923,9 +20409,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -21252,9 +20738,9 @@ "dev": true }, "node_modules/react-bootstrap": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.1.tgz", - "integrity": "sha512-ezgmh/ARCYp18LbZEqPp0ppvy+ytCmycDORqc8vXSKYV3cer4VH7OReV8uMOoKXmYzivJTxgzGHalGrHamryHA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.2.tgz", + "integrity": "sha512-a36B+EHsAI/aH+ZhXNILBFnqscE3zr10dWmjBmfhIb2QR7KSXJiGzYd6Faf/25G8G7/CP9TCL2B0WhUBOD2UBQ==", "peer": true, "dependencies": { "@babel/runtime": "^7.22.5", @@ -21458,35 +20944,23 @@ } }, "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.0.4.tgz", + "integrity": "sha512-9J1xh8sWO0vYq2sCxK2My/QO7MzUMRi3rpiILP/+tDr8krBHixC6JMM17fMK88+Oh3e4Ae6/sHIhNBgkUivwFA==", "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" + "@types/react": "^18.2.25", + "react": "^18.0", + "react-native": ">=0.69", + "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, "react-native": { "optional": true }, @@ -21495,11 +20969,6 @@ } } }, - "node_modules/react-redux/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -21510,46 +20979,35 @@ } }, "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", + "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "@remix-run/router": "1.14.1" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": ">=15" + "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "version": "6.21.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", + "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "@remix-run/router": "1.14.1", + "react-router": "6.21.1" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": ">=15" + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -21858,9 +21316,9 @@ } }, "node_modules/react-scripts/node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -22882,19 +22340,16 @@ } }, "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/redux-saga": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.3.tgz", - "integrity": "sha512-HDe0wTR5nhd8Xr5xjGzoyTbdAw6rjy1GDplFt3JKtKN8/MnkQSRqK/n6aQQhpw5NI4ekDVOaW+w4sdxPBaCoTQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.3.0.tgz", + "integrity": "sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ==", "dependencies": { - "@redux-saga/core": "^1.2.3" + "@redux-saga/core": "^1.3.0" } }, "node_modules/reflect.getprototypeof": { @@ -22936,9 +22391,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -22950,9 +22405,9 @@ } }, "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", "dev": true }, "node_modules/regexp.prototype.flags": { @@ -23099,11 +22554,6 @@ "node": ">=8" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, "node_modules/resolve-url-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", @@ -23458,11 +22908,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -23728,17 +23173,16 @@ "dev": true }, "node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", - "deprecated": "16.1.1", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", - "nise": "^5.1.4", + "nise": "^5.1.5", "supports-color": "^7.2.0" }, "funding": { @@ -23746,6 +23190,15 @@ "url": "https://opencollective.com/sinon" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, "node_modules/sinon/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -24098,6 +23551,27 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -24195,6 +23669,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -24279,14 +23766,14 @@ } }, "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -24297,24 +23784,50 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -24478,9 +23991,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", + "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -24591,9 +24104,9 @@ } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -24609,16 +24122,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -24701,16 +24214,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -24796,9 +24299,9 @@ "dev": true }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -24829,9 +24332,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -25044,11 +24547,6 @@ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", "dev": true }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -25250,9 +24748,9 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "optional": true, "peer": true, @@ -25265,11 +24763,6 @@ "node": ">=10.12.0" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -25341,25 +24834,25 @@ } }, "node_modules/web3": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-4.2.2.tgz", - "integrity": "sha512-im7weoHY7TW87nhFk10ysupZnsDJEO/xDpz985AgrTd/7KxExlzjjKd+4nue0WskUF0th0mgoMs1YaA8xUjCjw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.3.0.tgz", + "integrity": "sha512-YiLCsb5wmgJlSxRLzt7Z7H+CmlVVIKD8VaUQaZ+xKVG3Q7CpsO5Z6jmeKnlr6M9c6fDDsDnRM6G8g+nchZehbA==", "dependencies": { - "web3-core": "^4.3.1", + "web3-core": "^4.3.2", "web3-errors": "^1.1.4", "web3-eth": "^4.3.1", "web3-eth-abi": "^4.1.4", "web3-eth-accounts": "^4.1.0", - "web3-eth-contract": "^4.1.3", + "web3-eth-contract": "^4.1.4", "web3-eth-ens": "^4.0.8", "web3-eth-iban": "^4.0.7", "web3-eth-personal": "^4.0.8", "web3-net": "^4.0.7", "web3-providers-http": "^4.1.0", "web3-providers-ws": "^4.0.7", - "web3-rpc-methods": "^1.1.3", + "web3-rpc-methods": "^1.1.4", "web3-types": "^1.3.1", - "web3-utils": "^4.0.7", + "web3-utils": "^4.1.0", "web3-validator": "^2.0.3" }, "engines": { @@ -25368,16 +24861,17 @@ } }, "node_modules/web3-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.3.1.tgz", - "integrity": "sha512-xa3w5n/ESxp5HIbrwsYBhpAPx2KI5LprjRFEtRwP0GpqqhTcCSMMYoyItRqQQ+k9YnB0PoFpWJfJI6Qn5x8YUQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.3.2.tgz", + "integrity": "sha512-uIMVd/j4BgOnwfpY8ZT+QKubOyM4xohEhFZXz9xB8wimXWMMlYVlIK/TbfHqFolS9uOerdSGhsMbcK9lETae8g==", "dependencies": { "web3-errors": "^1.1.4", + "web3-eth-accounts": "^4.1.0", "web3-eth-iban": "^4.0.7", "web3-providers-http": "^4.1.0", "web3-providers-ws": "^4.0.7", "web3-types": "^1.3.1", - "web3-utils": "^4.0.7", + "web3-utils": "^4.1.0", "web3-validator": "^2.0.3" }, "engines": { @@ -25457,16 +24951,16 @@ } }, "node_modules/web3-eth-contract": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.1.3.tgz", - "integrity": "sha512-F6e3eyetUDiNOb78EDVJtNOb0H1GPz3xAZH8edSfYdhaxI9tTutP2V3p++kh2ZJ/RrdE2+xil7H/nPLgHymBvg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.1.4.tgz", + "integrity": "sha512-tJ4z6QLgtu8EQu2sXnLA7g427oxmngnbAUh+9kJKbP6Yep/oe+z79PqJv7H3MwqwUNW9T+/FeB2PnSQSyxz6ig==", "dependencies": { - "web3-core": "^4.3.1", + "web3-core": "^4.3.2", "web3-errors": "^1.1.4", "web3-eth": "^4.3.1", "web3-eth-abi": "^4.1.4", "web3-types": "^1.3.1", - "web3-utils": "^4.0.7", + "web3-utils": "^4.1.0", "web3-validator": "^2.0.3" }, "engines": { @@ -25589,9 +25083,9 @@ } }, "node_modules/web3-providers-ws/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -25609,12 +25103,12 @@ } }, "node_modules/web3-rpc-methods": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.1.3.tgz", - "integrity": "sha512-XB6SsCZZPdZUMPIRqDxJkZFKMu0/Y+yaExAt+Z7RqmuM7xF55fJ/Qb84LQho8zarvUoYziy4jnIfs+SXImxQUw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.1.4.tgz", + "integrity": "sha512-LTFNg4LFaeU8K9ecuT8fHDp/LOXyxCneeZjCrRYIW1u82Ly52SrY55FIzMIISGoG/iT5Wh7UiHOB3CQsWLBmbQ==", "dependencies": { - "web3-core": "^4.3.0", - "web3-types": "^1.3.0", + "web3-core": "^4.3.2", + "web3-types": "^1.3.1", "web3-validator": "^2.0.3" }, "engines": { @@ -25632,13 +25126,13 @@ } }, "node_modules/web3-utils": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.0.7.tgz", - "integrity": "sha512-sy8S6C2FIa5NNHc8DjND+Fx3S8KDAizuh5RbL1RX3h0PRbFgPfWzF5RfUns8gTt0mjJuOhs/IaDhrZfeTszG5A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.1.0.tgz", + "integrity": "sha512-+VJWR6FtCsgwuJr5tvSvQlSEG06586df8h2CxGc9tcNtIDyJKNkSDDWJkdNPvyDhhXFzQYFh8QOGymD1CIP6fw==", "dependencies": { "ethereum-cryptography": "^2.0.0", - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", + "web3-errors": "^1.1.4", + "web3-types": "^1.3.1", "web3-validator": "^2.0.3" }, "engines": { @@ -25854,9 +25348,9 @@ } }, "node_modules/webpack-dev-server/node_modules/@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" @@ -25916,9 +25410,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -26050,9 +25544,9 @@ } }, "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "dev": true }, "node_modules/whatwg-mimetype": { @@ -26513,6 +26007,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -26565,11 +26110,11 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", diff --git a/package.json b/package.json index 06d60a7..99bed99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ethereum-store", - "version": "0.2.4", + "version": "0.2.8", "description": "Ethereum store for react redux", "scripts": { "prettier": "prettier --write .", @@ -34,28 +34,28 @@ "dependencies": { "big.js": "^6.2.1", "buffer": "^6.0.3", - "ethers": "^5.7.2", + "ethers": "^6.9.0", "lodash": "^4.17.21", "lodash.clonedeep": "^4.5.0", - "react-redux": "^8.1.2", - "react-router-dom": "^5.2.0", - "reactstrap": "^9.2.0", - "redux": "^4.2.1", + "react-redux": "^9.0.4", + "react-router-dom": "^6.21.0", + "reactstrap": "^9.2.1", + "redux": "^5.0.0", "redux-saga": "^1.2.3", "reselect": "^4.1.8", - "web3": "^4.1.1" + "web3": "^4.3.0" }, "devDependencies": { - "@babel/cli": "^7.23.0", - "@babel/core": "^7.23.3", - "@babel/preset-env": "^7.23.3", - "@openzeppelin/contracts": "^4.9.3", - "@testing-library/jest-dom": "^6.1.4", - "@testing-library/react": "^14.0.0", + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.6", + "@babel/preset-env": "^7.23.6", + "@openzeppelin/contracts": "^5.0.1", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.5.1", - "prettier": "^3.0.2", + "prettier": "^3.1.1", "react-scripts": "^5.0.1", - "sinon": "^15.2.0" + "sinon": "^17.0.1" }, "peerDependencies": { "react": "^18.2.0", diff --git a/src/App.js b/src/App.js index c05caf0..ff1b1f7 100644 --- a/src/App.js +++ b/src/App.js @@ -1,12 +1,12 @@ -import React, { useEffect } from "react"; -import { Switch, BrowserRouter as Router } from "react-router-dom"; +import React, { useEffect, useRef } from "react"; +import { Route, Routes } from "react-router-dom"; import { useDispatch } from "react-redux"; // Import Routes all import { userRoutes } from "./routes/allRoutes"; -import Middleware from "./routes/middleware/Middleware"; function App() { let dispatch = useDispatch(); + const mounted = useRef(false); useEffect(() => { const interval = setInterval(() => { @@ -15,15 +15,22 @@ function App() { return () => clearInterval(interval); }, [dispatch]); + // Initial useEffects + useEffect(() => { + mounted.current = true; + dispatch({ type: "SET_USER_CURRENT_CHAIN", name: "Mumbai", id: 80001, rpc: "https://rpc.ankr.com/polygon_mumbai" }); + return () => { + mounted.current = false; + }; + }, [dispatch]); + return ( - - - {userRoutes.map((route, idx) => ( - - ))} - - + + {userRoutes.map((route) => ( + } /> + ))} + ); } diff --git a/src/helpers/contractRegistry.js b/src/helpers/contractRegistry.js index eff55b1..10e0552 100644 --- a/src/helpers/contractRegistry.js +++ b/src/helpers/contractRegistry.js @@ -1,7 +1,7 @@ /* This file is used only for testing purposes. */ const { ethers } = require("ethers"); -const roProvider = new ethers.providers.JsonRpcProvider("https://rpc.ankr.com/polygon_mumbai"); +const roProvider = new ethers.JsonRpcProvider("https://rpc.ankr.com/polygon_mumbai"); const abis = {}; // Mapping (abiName => abi) const formatters = {}; // Mapping (abiName => method => outputFormatterFunction) diff --git a/src/helpers/mock_helper.js b/src/helpers/mock_helper.js index f190291..a1a3974 100644 --- a/src/helpers/mock_helper.js +++ b/src/helpers/mock_helper.js @@ -46,7 +46,7 @@ export const mockProviderFn = () => { ret._defaultProvider = { getSigner: sinon.fake.resolves({ signMessage: () => "0x1234567890", - _signTypedData: () => "0x0987654321", + signTypedData: () => "0x0987654321", }), }; // Default provider ret.default = (provider) => { @@ -63,7 +63,7 @@ export const mockProviderRejectsFn = () => { ret._defaultProvider = { getSigner: sinon.fake.resolves({ signMessage: sinon.fake.rejects("Error signing message"), - _signTypedData: sinon.fake.rejects("Error signing typed message"), + signTypedData: sinon.fake.rejects("Error signing typed message"), }), }; // Default provider ret.default = (provider) => { diff --git a/src/package-index.js b/src/package-index.js index 77e79bf..673f796 100644 --- a/src/package-index.js +++ b/src/package-index.js @@ -14,9 +14,6 @@ let selectUserAddressFn; let selectChainIdFn; let selectProviderFn; -// Chain -let envChain; - export function initializeEthereumStore(options) { const { getEncodedCall, @@ -29,7 +26,6 @@ export function initializeEthereumStore(options) { selectUserAddress, selectChainId, selectProvider, - chain, } = options; getEncodedCallFn = getEncodedCall; @@ -42,7 +38,6 @@ export function initializeEthereumStore(options) { selectUserAddressFn = selectUserAddress; selectChainIdFn = selectChainId; selectProviderFn = selectProvider; - envChain = chain; } export { @@ -56,5 +51,4 @@ export { selectUserAddressFn, selectChainIdFn, selectProviderFn, - envChain, }; diff --git a/src/pages/StaticDashboard/staticDashboard.js b/src/pages/StaticDashboard/staticDashboard.js index ad219af..fecfc29 100644 --- a/src/pages/StaticDashboard/staticDashboard.js +++ b/src/pages/StaticDashboard/staticDashboard.js @@ -5,7 +5,7 @@ import { Container } from "reactstrap"; import { Button } from "react-bootstrap"; import { useDispatch } from "react-redux"; import { connect } from "react-redux"; -import { selectEthCallMultiple } from "../../store/ethereum/selectors"; +import { selectCurrentChain, selectEthCallMultiple } from "../../store/ethereum/selectors"; import SubsManager from "./subsManager"; const componentEthCalls = function () { @@ -19,7 +19,7 @@ const componentEthCalls = function () { ]; }; -const Static = ({ totalSupply, subscriptions }) => { +const Static = ({ totalSupply, subscriptions, currentChain }) => { let dispatch = useDispatch(); const [sub, setSub] = useState(false); const mounted = useRef(false); @@ -36,7 +36,7 @@ const Static = ({ totalSupply, subscriptions }) => { dispatch({ type: "ETH_REMOVE_SUBSCRIPTION", key: "staticDashboard" }); mounted.current = false; }; - }, [dispatch]); + }, [dispatch, currentChain]); return ( @@ -94,8 +94,9 @@ const Static = ({ totalSupply, subscriptions }) => { const mapStateToProps = (state) => { const [totalSupply] = selectEthCallMultiple(state.EthereumReducer, componentEthCalls()); + const currentChain = selectCurrentChain(state.EthereumReducer); const subscriptions = state.EthereumReducer.subscriptions; - return { totalSupply, subscriptions }; + return { totalSupply, subscriptions, currentChain }; }; export default connect(mapStateToProps, null)(Static); diff --git a/src/pages/StaticDashboard/subsManager.js b/src/pages/StaticDashboard/subsManager.js index cfc5ced..82a0cee 100644 --- a/src/pages/StaticDashboard/subsManager.js +++ b/src/pages/StaticDashboard/subsManager.js @@ -1,7 +1,7 @@ import React, { useEffect, useRef } from "react"; import { useDispatch } from "react-redux"; import { connect } from "react-redux"; -import { selectEthCallMultiple } from "../../store/ethereum/selectors"; +import { selectCurrentChain, selectEthCallMultiple } from "../../store/ethereum/selectors"; const componentEthCalls = function () { return [ @@ -14,7 +14,7 @@ const componentEthCalls = function () { ]; }; -const SubsManager = ({ symbol }) => { +const SubsManager = ({ symbol, currentChain }) => { let dispatch = useDispatch(); const mounted = useRef(false); @@ -30,7 +30,7 @@ const SubsManager = ({ symbol }) => { dispatch({ type: "ETH_REMOVE_SUBSCRIPTION", key: "subsManager" }); mounted.current = false; }; - }, [dispatch]); + }, [dispatch, currentChain]); return ( @@ -47,7 +47,8 @@ const SubsManager = ({ symbol }) => { const mapStateToProps = (state) => { const [symbol] = selectEthCallMultiple(state.EthereumReducer, componentEthCalls()); - return { symbol }; + const currentChain = selectCurrentChain(state.EthereumReducer); + return { symbol, currentChain }; }; export default connect(mapStateToProps, null)(SubsManager); diff --git a/src/routes/middleware/Middleware.js b/src/routes/middleware/Middleware.js deleted file mode 100644 index b45e096..0000000 --- a/src/routes/middleware/Middleware.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { Route } from "react-router-dom"; - -const Middleware = ({ component: Component, ...rest }) => ( - { - return ; - }} - /> -); - -Middleware.propTypes = { - component: PropTypes.any, - location: PropTypes.object, - layout: PropTypes.any, -}; - -export default Middleware; diff --git a/src/store/ethereum/actionTypes.js b/src/store/ethereum/actionTypes.js index f7246e7..32f3eb4 100644 --- a/src/store/ethereum/actionTypes.js +++ b/src/store/ethereum/actionTypes.js @@ -82,3 +82,5 @@ export const ETH_PLAIN_SIGN_FAILED = "ETH_PLAIN_SIGN_FAILED"; * {type: ETH_PLAIN_SIGN_PROCESSED, key: userAddress, signature: "0x1234...", message: "message to sign"} * {type: ETH_PLAIN_SIGN_FAILED, key: userAddress, payload: error.message } */ + +export const SET_USER_CURRENT_CHAIN = "SET_USER_CURRENT_CHAIN"; diff --git a/src/store/ethereum/reducer.js b/src/store/ethereum/reducer.js index c5103a6..a417f6d 100644 --- a/src/store/ethereum/reducer.js +++ b/src/store/ethereum/reducer.js @@ -23,254 +23,222 @@ import { ETH_PLAIN_SIGN, ETH_PLAIN_SIGN_PROCESSED, ETH_PLAIN_SIGN_FAILED, + SET_USER_CURRENT_CHAIN, } from "./actionTypes"; const { ethers } = require("ethers"); const INIT_STATE = { - calls: {}, - /* - * calls: { "0xsfsdf"_getBalance(nicolas): { - *
_: { - * state: "LOADING|LOADED|ERROR", - * value: , - * retries: undefined | number - * } - * } - * - */ - call_metadata: {}, // Different dictionary to avoid re-rendering if only timestamp changes - /* - * : {timestamp: } - */ - subscriptions: {}, - /* - * : [ ETH call list ] - */ timestamp: 0, - transacts: [], - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { name: "Mumbai", id: 80001, rpc: "https://rpc.ankr.com/polygon_mumbai" }, + chainState: { + /* + * : { + * calls: { "0xsfsdf"_getBalance(nicolas): { + *
_: { + * state: "LOADING|LOADED|ERROR", + * value: , + * retries: undefined | number + * } + * } + * // Different dictionary to avoid re-rendering if only timestamp changes + * call_metadata: { + * call_key>: {timestamp: } + * }, + * subscriptions: { + * : [ ETH call list ] + * }, + * transacts: [], + * signs: {}, + * siweSigns: {}, + * eipSigns: {}, + */ + }, }; +function modifyNode(state, path, newValueFn) { + if (path.length === 1) return { ...state, [path[0]]: newValueFn(state[path[0]] || {}) }; + else { + return { ...state, [path[0]]: modifyNode(state[path[0]] || {}, path.slice(1, path.length), newValueFn) }; + } +} + const EthereumReducer = (state = INIT_STATE, action) => { + let chainId; switch (action.type) { case ETH_CALL: - let key = action.address + "_" + getEncodedCallFn(action.address, action.abi, action.method, action.args); - let newCallState = state.calls[key] ? { ...state.calls[key] } : {}; - if (newCallState.state !== "LOADED") - newCallState.state = newCallState.state !== "LOADED" ? "LOADING" : newCallState.state; - if (action.retry !== undefined) newCallState.retries = action.retry; - state = { ...state, calls: { ...state.calls, [key]: newCallState } }; + chainId = state.currentChain.id; + let rpc = state.currentChain.rpc; + let key = action.address + "_" + getEncodedCallFn(action.address, action.abi, action.method, action.args, rpc); + state = modifyNode(state, ["chainState", chainId, "calls", key], (call) => { + call = call || {}; + call.state = call.state !== "LOADED" ? "LOADING" : call.state; + if (action.retry !== undefined) call.retries = action.retry; + return call; + }); break; case ETH_CALL_SUCCESS: - state = { - ...state, - calls: { - ...state.calls, - [action.call_key]: { state: "LOADED", value: action.value }, - }, - call_metadata: { - ...state.call_metadata, - [action.call_key]: { - ...(state.call_metadata[action.call_key] || {}), - timestamp: action.timestamp, - }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "call_metadata", action.call_key], () => { + return { timestamp: action.timestamp }; + }); + state = modifyNode(state, ["chainState", chainId, "calls", action.call_key], () => { + return { state: "LOADED", value: action.value }; + }); break; case ETH_CALL_FAIL: - state = { - ...state, - calls: { - ...state.calls, - [action.call_key]: { ...state.calls[action.call_key], state: "ERROR" }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "calls", action.call_key], (x) => { + return { ...x, state: "ERROR" }; + }); break; case ETH_ADD_SUBSCRIPTION: - state = { - ...state, - subscriptions: { - ...state.subscriptions, - [action.key]: action.componentEthCalls, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "subscriptions", action.key], () => action.componentEthCalls); break; case ETH_REMOVE_SUBSCRIPTION: - let newMountedComponents = { ...state.subscriptions }; - delete newMountedComponents[action.key]; - state = { - ...state, - subscriptions: newMountedComponents, - }; + let newChainState = { ...state.chainState }; + delete newChainState[state.currentChain.id]?.subscriptions[action.key]; + state = { ...state, chainState: newChainState }; break; case SET_TIMESTAMP_TO_REFRESH: - state = { - ...state, - timestamp: action.timestamp, - }; + state = { ...state, timestamp: action.timestamp }; break; case ETH_TRANSACT: - state = { - ...state, - transacts: [...state.transacts, { address: action.address, method: action.method, args: action.args }], - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId], (x) => { + x.transacts = [...(x.transacts || []), { address: action.address, method: action.method, args: action.args }]; + return x; + }); break; case ETH_TRANSACT_QUEUED: - let newTransacts = [...state.transacts]; - newTransacts[action.id] = { ...newTransacts[action.id], txHash: action.txHash, state: "QUEUED" }; - state = { ...state, transacts: newTransacts }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "transacts"], (transacts) => { + return (transacts || []).with(action.id, { ...transacts[action.id], txHash: action.txHash, state: "QUEUED" }); + }); break; case ETH_TRANSACT_REJECTED: - let transactWithError = [...state.transacts]; - transactWithError[action.id] = { ...transactWithError[action.id], error: action.payload, state: "REJECTED" }; - state = { ...state, transacts: transactWithError }; - + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "transacts"], (transacts) => { + return (transacts || []).with(action.id, { ...transacts[action.id], error: action.payload, state: "REJECTED" }); + }); break; case ETH_TRANSACT_MINED: - let transactMined = [...state.transacts]; - transactMined[action.id] = { ...transactMined[action.id], state: "MINED" }; - state = { ...state, transacts: transactMined }; - + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "transacts"], (transacts) => { + return (transacts || []).with(action.id, { ...transacts[action.id], state: "MINED" }); + }); break; case ETH_TRANSACT_REVERTED: - let transactRejected = [...state.transacts]; - transactRejected[action.id] = { ...transactRejected[action.id], state: "REVERTED" }; - state = { ...state, transacts: transactRejected }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "transacts"], (transacts) => { + return (transacts || []).with(action.id, { ...transacts[action.id], state: "REVERTED" }); + }); break; case ETH_TRANSACT_EXPIRED: - let transactExpired = [...state.transacts]; - transactExpired[action.id] = { ...transactExpired[action.id], state: "EXPIRED" }; - state = { ...state, transacts: transactExpired }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "transacts"], (transacts) => { + return (transacts || []).with(action.id, { ...transacts[action.id], state: "EXPIRED" }); + }); break; case ETH_SIWE_SIGN: - state = { - ...state, - siweSigns: { - ...state.siweSigns, - [action.userAddress]: { state: "PENDING" }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "siweSigns", action.userAddress], () => { + return { state: "PENDING" }; + }); break; case SET_ETH_SIWE_SIGN: case ETH_SIWE_SIGN_PROCESSED: - state = { - ...state, - siweSigns: { - ...state.siweSigns, - [action.key]: { - state: "SIGNED", - signature: action.signature, - message: action.message, - email: action.email, - country: action.country, - occupation: action.occupation, - whitelist: action.whitelist, - }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "siweSigns", action.key], () => { + return { + state: "SIGNED", + signature: action.signature, + message: action.message, + email: action.email, + country: action.country, + occupation: action.occupation, + whitelist: action.whitelist, + }; + }); break; case ETH_SIWE_SIGN_FAILED: - state = { - ...state, - siweSigns: { - ...state.siweSigns, - [action.key]: { ...state.siweSigns[action.key], state: "ERROR", error: action.payload }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "siweSigns", action.key], (x) => { + return { ...x, state: "ERROR", error: action.payload }; + }); break; case ETH_EIP_712_SIGN: - const eipKey = ethers.utils._TypedDataEncoder.encode(action.domain, action.types, action.value); - state = { - ...state, - eipSigns: { - ...state.eipSigns, - [eipKey]: { state: "PENDING" }, - }, - }; + chainId = state.currentChain.id; + const eipKey = ethers.TypedDataEncoder.encode(action.domain, action.types, action.value); + state = modifyNode(state, ["chainState", chainId, "eipSigns", eipKey], () => { + return { state: "PENDING" }; + }); break; case ETH_EIP_712_SIGN_PROCESSED: - state = { - ...state, - eipSigns: { - ...state.eipSigns, - [action.key]: { - state: "SIGNED", - userAddress: action.userAddress, - signature: action.signature, - domain: action.domain, - types: action.types, - value: action.value, - }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "eipSigns", action.key], () => { + return { + state: "SIGNED", + userAddress: action.userAddress, + signature: action.signature, + domain: action.domain, + types: action.types, + value: action.value, + }; + }); break; case ETH_EIP_712_SIGN_FAILED: - state = { - ...state, - eipSigns: { - ...state.eipSigns, - [action.key]: { - ...state.eipSigns[action.key], - state: "ERROR", - error: action.payload, - userAddress: action.userAddress, - }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "eipSigns", action.key], (x) => { + return { ...x, state: "ERROR", error: action.payload, userAddress: action.userAddress }; + }); break; case ETH_PLAIN_SIGN: - state = { - ...state, - signs: { - ...state.signs, - [action.userAddress]: { state: "PENDING" }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "signs", action.userAddress], () => { + return { state: "PENDING" }; + }); break; case ETH_PLAIN_SIGN_PROCESSED: - state = { - ...state, - signs: { - ...state.signs, - [action.key]: { - state: "SIGNED", - signature: action.signature, - message: action.message, - }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "signs", action.key], () => { + return { + state: "SIGNED", + signature: action.signature, + message: action.message, + }; + }); break; case ETH_PLAIN_SIGN_FAILED: - state = { - ...state, - signs: { - ...state.signs, - [action.key]: { ...state.signs[action.key], state: "ERROR", error: action.payload }, - }, - }; + chainId = state.currentChain.id; + state = modifyNode(state, ["chainState", chainId, "signs", action.key], (x) => { + return { ...x, state: "ERROR", error: action.payload }; + }); + break; + + case SET_USER_CURRENT_CHAIN: + state = { ...state, currentChain: { name: action.name, id: action.id, rpc: action.rpc } }; break; default: diff --git a/src/store/ethereum/reducer.test.js b/src/store/ethereum/reducer.test.js new file mode 100644 index 0000000..a10aade --- /dev/null +++ b/src/store/ethereum/reducer.test.js @@ -0,0 +1,728 @@ +import EthereumReducer from "./reducer.js"; +import { initializeEthereumStore } from "../../package-index"; +import * as contractRegistry from "../../helpers/contractRegistry"; + +const { ethers } = require("ethers"); + +const currencyAddress = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"; // Polygon USDC address +contractRegistry.registerABI("ERC20Permit", require("@openzeppelin/contracts/build/contracts/ERC20Permit.json").abi); +contractRegistry.registerContract(currencyAddress, "ERC20Permit"); +contractRegistry.registerFormatter("ERC20Permit", "totalSupply", undefined); +contractRegistry.registerFormatter("ERC20Permit", "name", undefined); + +describe("Ethereum Reducer tests", () => { + /* Mocking tx receipt function and initialize saga */ + initializeEthereumStore({ + getEncodedCall: contractRegistry.getEncodedCall, + getContract: contractRegistry.getContract, + getAbiName: contractRegistry.getAbiName, + getFormatter: contractRegistry.getFormatter, + getSignerContract: contractRegistry.getSignerContract, + getTxReceiptStatus: () => 1, // just for testing + selectChainId: () => 1234, // just for testing + selectProvider: () => {}, + selectUserAddress: () => "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", // just for testing + }); + + const state = { + timestamp: 0, + currentChain: { name: "Mumbai", id: 80001, rpc: "https://rpc.ankr.com/polygon_mumbai" }, + chainState: {}, + }; + + it("Should handle initial state", () => { + const initialState = state; + const action = { type: "fake_action" }; + const expectedState = initialState; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should SET_USER_CURRENT_CHAIN", () => { + const initialState = { ...state }; + const action = { + type: "SET_USER_CURRENT_CHAIN", + name: "NewChain", + id: 1234, + rpc: "https://foo-rpc.com/", + }; + const expectedState = { ...state, currentChain: { name: "NewChain", id: 1234, rpc: "https://foo-rpc.com/" } }; + + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one subscription", () => { + const initialState = { ...state, chainState: { 80001: { subscriptions: {} } } }; + const action = { + type: "ETH_ADD_SUBSCRIPTION", + key: "foo", + componentEthCalls: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }], + }; + const expectedState = { + ...state, + chainState: { + 80001: { subscriptions: { foo: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }] } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should remove one subscription", () => { + const initialState = { + ...state, + chainState: { + 80001: { subscriptions: { foo: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }] } }, + }, + }; + const action = { + type: "ETH_ADD_SUBSCRIPTION", + key: "foo", + componentEthCalls: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }], + }; + const expectedState = { + ...state, + chainState: { + 80001: { subscriptions: { foo: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }] } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add new subscription", () => { + const initialState = { + ...state, + chainState: { + 80001: { subscriptions: { foo: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }] } }, + }, + }; + const action = { + type: "ETH_ADD_SUBSCRIPTION", + key: "bar", + componentEthCalls: [{ address: "0x01", abi: "ERC20Permit", method: "name", args: [] }], + }; + const expectedState = { + ...state, + chainState: { + 80001: { + subscriptions: { + foo: [{ address: "0x00", abi: "ERC20Permit", method: "totalSupply", args: [] }], + bar: [{ address: "0x01", abi: "ERC20Permit", method: "name", args: [] }], + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one ETH_CALL", () => { + const initialState = { ...state, chainState: { 80001: { calls: {} } } }; + const action = { + type: "ETH_CALL", + address: "0x00", + abi: "ERC20Permit", + method: "name", + args: [], + }; + const expectedState = { + ...state, + chainState: { + 80001: { calls: { "0x00_0x06fdde03": { state: "LOADING" } } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one ETH_CALL and there is already another one", () => { + const initialState = { ...state, chainState: { 80001: { calls: { "0x00_0x06fdde03": { state: "LOADING" } } } } }; + const action = { + type: "ETH_CALL", + address: "0x00", + abi: "ERC20Permit", + method: "totalSupply", + args: [], + }; + const expectedState = { + ...state, + chainState: { + 80001: { calls: { "0x00_0x06fdde03": { state: "LOADING" }, "0x00_0x18160ddd": { state: "LOADING" } } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should retry the ETH_CALL", () => { + const initialState = { ...state, chainState: { 80001: { calls: {} } } }; + const action = { + type: "ETH_CALL", + address: "0x00", + abi: "ERC20Permit", + method: "name", + args: [], + retry: 5, + }; + const expectedState = { + ...state, + chainState: { + 80001: { calls: { "0x00_0x06fdde03": { state: "LOADING", retries: 5 } } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("The ETH_CALL was successful", () => { + const initialState = { ...state, chainState: { 80001: { calls: { "0x00_0x06fdde03": { state: "LOADING" } } } } }; + const action = { + type: "ETH_CALL_SUCCESS", + call_key: "0x00_0x06fdde03", + value: "FakeUSDC", + timestamp: 1703683845252, + }; + + const expectedState = { + ...state, + chainState: { + 80001: { + calls: { "0x00_0x06fdde03": { state: "LOADED", value: "FakeUSDC" } }, + call_metadata: { "0x00_0x06fdde03": { timestamp: 1703683845252 } }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("The ETH_CALL was successful and there is already another one", () => { + const initialState = { + ...state, + chainState: { + 80001: { + calls: { "0x00_0x06fdde03": { state: "LOADED", value: "FakeUSDC" }, "0x00_0x18160ddd": { state: "LOADING" } }, + call_metadata: { "0x00_0x06fdde03": { timestamp: 1703683845252 } }, + }, + }, + }; + const action = { + type: "ETH_CALL_SUCCESS", + call_key: "0x00_0x18160ddd", + value: 100, + timestamp: 1703683849000, + }; + + const expectedState = { + ...state, + chainState: { + 80001: { + calls: { + "0x00_0x06fdde03": { state: "LOADED", value: "FakeUSDC" }, + "0x00_0x18160ddd": { state: "LOADED", value: 100 }, + }, + call_metadata: { + "0x00_0x06fdde03": { timestamp: 1703683845252 }, + "0x00_0x18160ddd": { timestamp: 1703683849000 }, + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("The ETH_CALL fails", () => { + const initialState = { + ...state, + chainState: { 80001: { calls: { "0x00_0x06fdde03": { state: "LOADING", retries: 9 } } } }, + }; + const action = { type: "ETH_CALL_FAIL", payload: "eth call fails", call_key: "0x00_0x06fdde03" }; + + const expectedState = { + ...state, + chainState: { + 80001: { + calls: { "0x00_0x06fdde03": { state: "ERROR", retries: 9 } }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one ETH_TRANSACT", () => { + const initialState = { ...state, chainState: { 80001: { transacts: [] } } }; + const action = { + type: "ETH_TRANSACT", + address: currencyAddress, + abi: "ERC20Permit", + method: "deposit", + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + }; + const expectedState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + }, + ], + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Queued the ETH_TRANSACT", () => { + const initialState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + }, + ], + }, + }, + }; + const action = { + type: "ETH_TRANSACT_QUEUED", + id: 0, + txHash: "0x1234567890", + }; + const expectedState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "QUEUED", + }, + ], + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Reject the ETH_TRANSACT", () => { + const initialState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + }, + ], + }, + }, + }; + const action = { + type: "ETH_TRANSACT_REJECTED", + id: 0, + payload: "user rejects the transaction", + }; + const expectedState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + error: "user rejects the transaction", + state: "REJECTED", + }, + ], + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Mined the ETH_TRANSACT", () => { + const initialState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "QUEUED", + }, + ], + }, + }, + }; + const action = { + type: "ETH_TRANSACT_MINED", + id: 0, + }; + const expectedState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "MINED", + }, + ], + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Revert the ETH_TRANSACT", () => { + const initialState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "QUEUED", + }, + ], + }, + }, + }; + const action = { + type: "ETH_TRANSACT_REVERTED", + id: 0, + }; + const expectedState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "REVERTED", + }, + ], + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Expire the ETH_TRANSACT", () => { + const initialState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "QUEUED", + }, + ], + }, + }, + }; + const action = { + type: "ETH_TRANSACT_EXPIRED", + id: 0, + }; + const expectedState = { + ...state, + chainState: { + 80001: { + transacts: [ + { + address: currencyAddress, + args: ["0x4d68Cf31d613070b18E406AFd6A42719a62a0785", 100000000], + method: "deposit", + txHash: "0x1234567890", + state: "EXPIRED", + }, + ], + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one ETH_SIWE_SIGN", () => { + const initialState = { ...state, chainState: { 80001: { siweSigns: {} } } }; + const action = { + type: "ETH_SIWE_SIGN", + message: "Please sign this message", + userAddress: "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", + email: "test@test.com", + country: "Argentina", + occupation: "Dev", + whitelist: "0xEE18C16327F7c8C6aA740394f7f5F8d90FFB4BC0", // random address + }; + const expectedState = { + ...state, + chainState: { + 80001: { siweSigns: { "0x4d68Cf31d613070b18E406AFd6A42719a62a0785": { state: "PENDING" } } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should PROCESS the ETH_SIWE_SIGN", () => { + const initialState = { + ...state, + chainState: { 80001: { siweSigns: { "0x4d68Cf31d613070b18E406AFd6A42719a62a0785": { state: "PENDING" } } } }, + }; + const action = { + type: "ETH_SIWE_SIGN_PROCESSED", + key: "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", + signature: "0xabcd12345", + message: "Please sign this message", + email: "test@test.com", + country: "Argentina", + occupation: "Dev", + whitelist: "0xEE18C16327F7c8C6aA740394f7f5F8d90FFB4BC0", // random address + }; + const expectedState = { + ...state, + chainState: { + 80001: { + siweSigns: { + "0x4d68Cf31d613070b18E406AFd6A42719a62a0785": { + state: "SIGNED", + signature: "0xabcd12345", + message: "Please sign this message", + email: "test@test.com", + country: "Argentina", + occupation: "Dev", + whitelist: "0xEE18C16327F7c8C6aA740394f7f5F8d90FFB4BC0", // random address + }, + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("ETH_SIWE_SIGN should fail", () => { + const initialState = { + ...state, + chainState: { 80001: { siweSigns: { "0x4d68Cf31d613070b18E406AFd6A42719a62a0785": { state: "PENDING" } } } }, + }; + const action = { + type: "ETH_SIWE_SIGN_FAILED", + key: "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", + payload: "Error in the signature", + }; + const expectedState = { + ...state, + chainState: { + 80001: { + siweSigns: { + "0x4d68Cf31d613070b18E406AFd6A42719a62a0785": { + state: "ERROR", + error: "Error in the signature", + }, + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one ETH_EIP_712_SIGN", () => { + const initialState = { ...state, chainState: { 80001: { eipSigns: {} } } }; + const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; + const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address + const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour + const types = { + Permit: [ + { name: "owner", type: "address" }, + { name: "spender", type: "address" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "deadline", type: "uint256" }, + ], + }; + const value = { + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, + nonce: 10, + deadline: deadline, + }; + const usdcDomain = { name: "USDC", version: "1", chainId: 80001, verifyingContract: currencyAddress }; + const action = { + type: "ETH_EIP_712_SIGN", + domain: usdcDomain, + types: types, + value: value, + }; + + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + const expectedState = { + ...state, + chainState: { + 80001: { eipSigns: { [key]: { state: "PENDING" } } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Proccess the ETH_EIP_712_SIGN", () => { + const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; + const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address + const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour + const types = { + Permit: [ + { name: "owner", type: "address" }, + { name: "spender", type: "address" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "deadline", type: "uint256" }, + ], + }; + const value = { + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, + nonce: 10, + deadline: deadline, + }; + const usdcDomain = { name: "USDC", version: "1", chainId: 80001, verifyingContract: currencyAddress }; + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + const initialState = { ...state, chainState: { 80001: { eipSigns: { [key]: { state: "PENDING" } } } } }; + const action = { + type: "ETH_EIP_712_SIGN_PROCESSED", + key: key, + userAddress: ethers.getAddress(userAddr), + signature: "0xabcd12345", + domain: usdcDomain, + types: types, + value: value, + }; + const expectedState = { + ...state, + chainState: { + 80001: { + eipSigns: { + [key]: { + state: "SIGNED", + signature: "0xabcd12345", + types: types, + domain: usdcDomain, + userAddress: ethers.getAddress(userAddr), + value: value, + }, + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("The ETH_EIP_712_SIGN failed", () => { + const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; + const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address + const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour + const types = { + Permit: [ + { name: "owner", type: "address" }, + { name: "spender", type: "address" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "deadline", type: "uint256" }, + ], + }; + const value = { + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, + nonce: 10, + deadline: deadline, + }; + const usdcDomain = { name: "USDC", version: "1", chainId: 80001, verifyingContract: currencyAddress }; + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + const initialState = { ...state, chainState: { 80001: { eipSigns: { [key]: { state: "PENDING" } } } } }; + const action = { + type: "ETH_EIP_712_SIGN_FAILED", + key: key, + userAddress: ethers.getAddress(userAddr), + payload: "error processing the sign", + }; + const expectedState = { + ...state, + chainState: { + 80001: { + eipSigns: { + [key]: { + state: "ERROR", + error: "error processing the sign", + userAddress: ethers.getAddress(userAddr), + }, + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Should add one ETH_PLAIN_SIGN", () => { + const initialState = { ...state, chainState: { 80001: { signs: {} } } }; + const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; + const action = { type: "ETH_PLAIN_SIGN", message: "Please sign this message", userAddress: userAddr }; + + const expectedState = { + ...state, + chainState: { + 80001: { signs: { [userAddr]: { state: "PENDING" } } }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); + + it("Proccess the ETH_PLAIN_SIGN", () => { + const initialState = { ...state, chainState: { 80001: { signs: {} } } }; + const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; + const action = { + type: "ETH_PLAIN_SIGN_PROCESSED", + key: userAddr, + signature: "0xabcd1234", + message: "Please sign this message", + }; + + const expectedState = { + ...state, + chainState: { + 80001: { + signs: { + [userAddr]: { + state: "SIGNED", + signature: "0xabcd1234", + message: "Please sign this message", + }, + }, + }, + }, + }; + expect(EthereumReducer(initialState, action)).toEqual(expectedState); + }); +}); diff --git a/src/store/ethereum/saga.js b/src/store/ethereum/saga.js index 2ebd6d0..0342d2b 100644 --- a/src/store/ethereum/saga.js +++ b/src/store/ethereum/saga.js @@ -36,21 +36,20 @@ import { getTxReceiptStatusFn, selectChainIdFn, selectProviderFn, - envChain, selectUserAddressFn, } from "../../package-index"; const { ethers } = require("ethers"); async function signMessageTyped(userState, domain, types, value) { - const provider = new ethers.providers.Web3Provider(selectProviderFn(userState), "any"); + const provider = new ethers.BrowserProvider(selectProviderFn(userState), "any"); const signer = await provider.getSigner(); - const signatureHash = await signer._signTypedData(domain, types, value); + const signatureHash = await signer.signTypedData(domain, types, value); return signatureHash; } async function signMessage(userState, address, message) { - const provider = new ethers.providers.Web3Provider(selectProviderFn(userState), "any"); + const provider = new ethers.BrowserProvider(selectProviderFn(userState), "any"); const signer = await provider.getSigner(); const signatureHash = await signer.signMessage(message); return signatureHash; @@ -77,18 +76,21 @@ async function ethCall(address, abi, method, args) { } async function ethSignerCall(address, abi, method, args, userState) { - let provider = new ethers.providers.Web3Provider(selectProviderFn(userState), "any"); - let contract = getSignerContractFn(address, abi, provider); - const estimatedGas = await contract["estimateGas"][method](...args).then((gas) => { + let provider = new ethers.BrowserProvider(selectProviderFn(userState), "any"); + let contract = await getSignerContractFn(address, abi, provider); + const estimatedGas = await contract[method].estimateGas(...args).then((gas) => { return gas; }); args = args || []; - return await contract[method](...args, { gasLimit: estimatedGas.mul(gas.increase).div(100) }); + const gasLimit = (estimatedGas * ethers.toBigInt(gas.increase)) / 100n; + return await contract[method](...args, { gasLimit: gasLimit }); } export function* makeEthCall({ retry, address, abi, method, args, forceCall, maxAge }) { - const key = address + "_" + getEncodedCallFn(address, abi, method, args); + const state = yield select((state) => state.EthereumReducer); + const rpc = state.currentChain.rpc; + const key = address + "_" + getEncodedCallFn(address, abi, method, args, rpc); if (forceCall === undefined || forceCall === false) { maxAge = maxAge === undefined ? ethereum.defaultMaxAge : maxAge; const state = yield select((state) => state.EthereumReducer); @@ -124,9 +126,10 @@ export function* makeEthCall({ retry, address, abi, method, args, forceCall, max export function* makeEthTransact({ address, abi, method, args }) { const state = yield select((state) => state.EthereumReducer); const userState = yield select((state) => state.UserReducer); - const id = state.transacts.length - 1; + const chainId = state.currentChain.id; + const id = state.chainState[chainId].transacts.length - 1; try { - if (selectChainIdFn(userState) === envChain.id) { + if (selectChainIdFn(userState) === chainId) { const response = yield call(_.partial(ethSignerCall, address, abi, method, args, userState)); yield put({ type: ETH_TRANSACT_QUEUED, id: id, txHash: response.hash }); } @@ -140,7 +143,7 @@ export function* makeEthTransact({ address, abi, method, args }) { export function* listenTransact({ id, txHash, retry }) { let response; const userState = yield select((state) => state.UserReducer); - let provider = new ethers.providers.Web3Provider(selectProviderFn(userState), "any"); + let provider = new ethers.BrowserProvider(selectProviderFn(userState), "any"); try { yield delay(ethereum.retry.timeout * 10); if (!retry || retry < ethereum.retry.transactCount) { @@ -163,7 +166,9 @@ export function* listenTransact({ id, txHash, retry }) { export function* refreshAllSubscriptionsCalls() { const state = yield select((state) => state.EthereumReducer); - const subscriptions = state.subscriptions; + const chainId = state.currentChain.id; + const rpc = state.currentChain.rpc; + const subscriptions = state.chainState[chainId]?.subscriptions; const now = new Date().getTime(); const timestamp = state.timestamp; if (timestamp === 0 || timestamp < now) { @@ -172,7 +177,7 @@ export function* refreshAllSubscriptionsCalls() { for (const key in subscriptions) { const subscriptionArray = subscriptions[key]; for (const sub of subscriptionArray) { - let key = sub.address + "_" + getEncodedCallFn(sub.address, sub.abi, sub.method, sub.args); + let key = sub.address + "_" + getEncodedCallFn(sub.address, sub.abi, sub.method, sub.args, rpc); if (!keyArray.has(key)) ethCalls.add(sub); keyArray.add(key); } @@ -202,7 +207,7 @@ export function* makeEthEipSign({ domain, types, value }) { const signatureHash = yield call(signMessageTyped, userState, domain, types, value); yield put({ type: ETH_EIP_712_SIGN_PROCESSED, - key: ethers.utils._TypedDataEncoder.encode(domain, types, value), + key: ethers.TypedDataEncoder.encode(domain, types, value), userAddress: addr, signature: signatureHash, domain: domain, @@ -212,7 +217,7 @@ export function* makeEthEipSign({ domain, types, value }) { } catch (error) { yield put({ type: ETH_EIP_712_SIGN_FAILED, - key: ethers.utils._TypedDataEncoder.encode(domain, types, value), + key: ethers.TypedDataEncoder.encode(domain, types, value), userAddress: addr, payload: error.message, }); @@ -221,7 +226,7 @@ export function* makeEthEipSign({ domain, types, value }) { export function* makeEthSiweSign({ message, userAddress, email, country, occupation, whitelist }) { const userState = yield select((state) => state.UserReducer); - const addr = ethers.utils.getAddress(userAddress); + const addr = ethers.getAddress(userAddress); try { const signatureHash = yield call(signMessage, userState, addr, message); yield put({ @@ -241,7 +246,7 @@ export function* makeEthSiweSign({ message, userAddress, email, country, occupat export function* makeSign({ message, userAddress }) { const userState = yield select((state) => state.UserReducer); - const addr = ethers.utils.getAddress(userAddress); + const addr = ethers.getAddress(userAddress); try { const signatureHash = yield call(signMessage, userState, addr, message); yield put({ diff --git a/src/store/ethereum/saga.test.js b/src/store/ethereum/saga.test.js index 42a39b2..768ada1 100644 --- a/src/store/ethereum/saga.test.js +++ b/src/store/ethereum/saga.test.js @@ -14,11 +14,12 @@ import { selectEthCallTimestampByKey, selectSign, selectEthSiweSign, + selectLastTransact, } from "./selectors"; import { ethereum } from "../../config"; const sinon = require("sinon"); -const { ethers, BigNumber } = require("ethers"); +const { ethers } = require("ethers"); let contractMock; let providerMock; @@ -37,7 +38,7 @@ contractRegistry.registerFormatter("ERC20Permit", "balanceOf", _.partial(BNToDec const usdcContract = contractRegistry.getContract(currencyAddress); let fakeUsdcContract = {}; -beforeEach(() => { +beforeEach(async () => { store.dispatch({ type: "RESET_ALL" }); contractMock = sinon.spy(mock_helper.mockContractFn()); sinon.replaceGetter(ethers, "Contract", () => contractMock); @@ -45,6 +46,13 @@ beforeEach(() => { fakeUsdcContract = { interface: usdcContract.interface }; contractMock.byAddress(currencyAddress, fakeUsdcContract); contractRegistry.registerContract(currencyAddress, "ERC20Permit"); + + await store.dispatch({ + type: "SET_USER_CURRENT_CHAIN", + name: "NewChain", + id: 1234, + rpc: "https://foo-rpc.com/", + }); }); afterEach(() => { @@ -55,11 +63,11 @@ afterEach(() => { describe("All the test with provider resolver mock", () => { beforeEach(() => { providerMock = sinon.spy(mock_helper.mockProviderFn()); - sinon.replaceGetter(ethers.providers, "Web3Provider", () => providerMock); + sinon.replaceGetter(ethers, "BrowserProvider", () => providerMock); }); test("ETH_ADD_SUBSCRIPTION and ETH_DISPATCH_CLOCK with one ethCall", async () => { - const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(ethers.BigNumber.from(12.345e6))); + const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(12.345e6)); assert.strictEqual(ethers.Contract.callCount, 1); await store.dispatch({ @@ -69,16 +77,19 @@ describe("All the test with provider resolver mock", () => { }); assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: {}, - call_metadata: {}, - transacts: [], timestamp: 0, - subscriptions: { - totalSupplyComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], + chainState: { + 1234: { + subscriptions: { + totalSupplyComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], + }, + }, + }, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", }, - signs: {}, - siweSigns: {}, - eipSigns: {}, }); assert.strictEqual( @@ -91,7 +102,7 @@ describe("All the test with provider resolver mock", () => { await new Promise((r) => setTimeout(r, 0)); - assert.deepEqual(store.getState().EthereumReducer.calls, { + assert.deepEqual(store.getState().EthereumReducer.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: Big(12.345), @@ -104,7 +115,7 @@ describe("All the test with provider resolver mock", () => { }); test("ETH_ADD_SUBSCRIPTION and ETH_DISPATCH_CLOCK with two ethCall", async () => { - const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(ethers.BigNumber.from(12.345e6))); + const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(12.345e6)); const fakeName = (fakeUsdcContract.name = sinon.fake.resolves("Peso")); assert.strictEqual(ethers.Contract.callCount, 1); @@ -118,19 +129,22 @@ describe("All the test with provider resolver mock", () => { }); assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: {}, - call_metadata: {}, - transacts: [], timestamp: 0, - subscriptions: { - totalSupplyComponent: [ - { address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }, - { address: currencyAddress, abi: "ERC20Permit", method: "name", args: [] }, - ], + chainState: { + 1234: { + subscriptions: { + totalSupplyComponent: [ + { address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }, + { address: currencyAddress, abi: "ERC20Permit", method: "name", args: [] }, + ], + }, + }, + }, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", }, - signs: {}, - siweSigns: {}, - eipSigns: {}, }); assert.strictEqual( @@ -144,7 +158,7 @@ describe("All the test with provider resolver mock", () => { await new Promise((r) => setTimeout(r, 0)); - assert.deepEqual(store.getState().EthereumReducer.calls, { + assert.deepEqual(store.getState().EthereumReducer.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: Big(12.345), @@ -167,7 +181,7 @@ describe("All the test with provider resolver mock", () => { }); test("Only ONE call with TWO subscritions to the SAME METHOD", async () => { - const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(ethers.BigNumber.from(12.345e6))); + const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(12.345e6)); assert.strictEqual(ethers.Contract.callCount, 1); await store.dispatch({ @@ -183,23 +197,26 @@ describe("All the test with provider resolver mock", () => { }); assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: {}, - call_metadata: {}, - transacts: [], timestamp: 0, - subscriptions: { - totalSupplyComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], - secondComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], + chainState: { + 1234: { + subscriptions: { + totalSupplyComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], + secondComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], + }, + }, + }, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", }, - signs: {}, - siweSigns: {}, - eipSigns: {}, }); store.dispatch({ type: "ETH_DISPATCH_CLOCK" }); const call_key = currencyAddress + "_0x18160ddd"; // "18160ddd" == kekac256("totalSupply()") await new Promise((r) => setTimeout(r, 0)); - assert.deepEqual(store.getState().EthereumReducer.calls, { + assert.deepEqual(store.getState().EthereumReducer.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: Big(12.345), @@ -211,14 +228,15 @@ describe("All the test with provider resolver mock", () => { ); await store.dispatch({ type: "ETH_REMOVE_SUBSCRIPTION", key: "secondComponent" }); - assert.deepStrictEqual(store.getState().EthereumReducer.subscriptions, { + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].subscriptions, { totalSupplyComponent: [{ address: currencyAddress, abi: "ERC20Permit", method: "totalSupply", args: [] }], }); }); test("ETH_CALL with simple method", async () => { - const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(ethers.BigNumber.from(12.345e6))); + const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(12.345e6)); assert.strictEqual(ethers.Contract.callCount, 1); + await store.dispatch({ type: "ETH_CALL", address: currencyAddress, @@ -232,29 +250,32 @@ describe("All the test with provider resolver mock", () => { assert.strictEqual(ethers.Contract.callCount, 1); const call_key = currencyAddress + "_0x18160ddd"; // "18160ddd" == kekac256("totalSupply()") assert.deepStrictEqual(store.getState().EthereumReducer, { - call_metadata: {}, - calls: { - [call_key]: { - state: "LOADING", + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + state: "LOADING", + }, + }, }, }, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); const now = new Date().getTime(); await new Promise((r) => setTimeout(r, 0)); const ethStore = store.getState().EthereumReducer; - assert.deepEqual(ethStore.calls, { + assert.deepEqual(ethStore.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: Big(12.345), }, }); - assert(now - ethStore.call_metadata[call_key].timestamp < 100); + assert(now - ethStore.chainState["1234"].call_metadata[call_key].timestamp < 100); sinon.assert.calledOnce(fakeTotalSupply); assert.ok( selectEthCall(store.getState().EthereumReducer, currencyAddress, "ERC20Permit", "totalSupply").eq(Big(12.345)) @@ -264,6 +285,7 @@ describe("All the test with provider resolver mock", () => { test("ETH_CALL with simple without formatter", async () => { const fakeName = (fakeUsdcContract.name = sinon.fake.resolves("Peso")); assert.strictEqual(ethers.Contract.callCount, 1); + await store.dispatch({ type: "ETH_CALL", address: currencyAddress, @@ -273,21 +295,24 @@ describe("All the test with provider resolver mock", () => { assert.strictEqual(ethers.Contract.callCount, 1); const call_key = currencyAddress + "_0x06fdde03"; // "06fdde03" == kekac256("name()") assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: { - [call_key]: { - state: "LOADING", + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + state: "LOADING", + }, + }, }, }, - call_metadata: {}, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.calls, { + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: "Peso", @@ -297,7 +322,7 @@ describe("All the test with provider resolver mock", () => { }); test("ETH_CALL method with parameter", async () => { - const fakeBalanceOf = (fakeUsdcContract.balanceOf = sinon.fake.resolves(ethers.BigNumber.from(78.345678e6))); + const fakeBalanceOf = (fakeUsdcContract.balanceOf = sinon.fake.resolves(78.345678e6)); assert.strictEqual(ethers.Contract.callCount, 1); const addr = "0x4d68cf31d613070b18e406afd6a42719a62a0785"; await store.dispatch({ @@ -311,21 +336,24 @@ describe("All the test with provider resolver mock", () => { assert.strictEqual(ethers.Contract.callCount, 1); const call_key = currencyAddress + "_0x70a08231000000000000000000000000" + addr.substring(2); assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: { - [call_key]: { - state: "LOADING", + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + state: "LOADING", + }, + }, }, }, - call_metadata: {}, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.calls, { + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: Big(78.345678), @@ -352,34 +380,40 @@ describe("All the test with provider resolver mock", () => { assert.strictEqual(ethers.Contract.callCount, 1); const call_key = currencyAddress + "_0x18160ddd"; // "18160ddd" == kekac256("totalSupply()") assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: { - [call_key]: { - state: "LOADING", + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + state: "LOADING", + }, + }, }, }, - call_metadata: {}, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); await new Promise((r) => setTimeout(r, 100)); assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: { - [call_key]: { - retries: 4, - state: "ERROR", + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + retries: 4, + state: "ERROR", + }, + }, }, }, - call_metadata: {}, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); }); @@ -387,7 +421,6 @@ describe("All the test with provider resolver mock", () => { sinon.replace(ethereum, "retry", { timeout: 10, count: 5 }); const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.rejects("Error")); assert.strictEqual(ethers.Contract.callCount, 1); - await store.dispatch({ type: "ETH_CALL", address: currencyAddress, @@ -397,39 +430,45 @@ describe("All the test with provider resolver mock", () => { assert.strictEqual(ethers.Contract.callCount, 1); const call_key = currencyAddress + "_0x18160ddd"; // "18160ddd" == kekac256("totalSupply()") assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: { - [call_key]: { - state: "LOADING", + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + state: "LOADING", + }, + }, }, }, - call_metadata: {}, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); await new Promise((r) => setTimeout(r, 15)); - fakeUsdcContract.totalSupply = sinon.fake.resolves(ethers.BigNumber.from(123.2e6)); + fakeUsdcContract.totalSupply = sinon.fake.resolves(123.2e6); assert.deepStrictEqual(store.getState().EthereumReducer, { - calls: { - [call_key]: { - state: "LOADING", - retries: 1, + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + retries: 1, + state: "LOADING", + }, + }, }, }, - call_metadata: {}, - transacts: [], - timestamp: 0, - subscriptions: {}, - signs: {}, - siweSigns: {}, - eipSigns: {}, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, }); sinon.assert.calledTwice(fakeTotalSupply); await new Promise((r) => setTimeout(r, 21)); - assert.deepStrictEqual(store.getState().EthereumReducer.calls, { + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].calls, { [call_key]: { state: "LOADED", value: Big(123.2), @@ -441,10 +480,7 @@ describe("All the test with provider resolver mock", () => { const txHash = "0x000001"; const txStatus = 1; // 1 == "success" const fakeApprove = (fakeUsdcContract.approve = sinon.fake.resolves({ hash: txHash })); //TxHash - const fakeEstimateGas = (fakeUsdcContract["estimateGas"] = { - approve: sinon.fake.resolves(BigNumber.from(100000)), - }); - + const fakeEstimateGas = (fakeUsdcContract.approve["estimateGas"] = sinon.fake.resolves(100000n)); /* Mocking tx receipt function and initialize saga */ initializeEthereumStore({ getEncodedCall: contractRegistry.getEncodedCall, @@ -453,14 +489,9 @@ describe("All the test with provider resolver mock", () => { getFormatter: contractRegistry.getFormatter, getSignerContract: contractRegistry.getSignerContract, getTxReceiptStatus: sinon.fake.resolves(txStatus), - selectChainId: () => 80001, // just for testing + selectChainId: () => 1234, // just for testing selectProvider: () => {}, selectUserAddress: () => "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", // just for testing - // just for testing - chain: { - id: 80001, - rpc: "https://matic-mumbai.chainstacklabs.com/", - }, }); assert.strictEqual(ethers.Contract.callCount, 1); @@ -470,31 +501,32 @@ describe("All the test with provider resolver mock", () => { address: currencyAddress, abi: "ERC20Permit", method: "approve", - args: ["0x01", ethers.BigNumber.from(10)], + args: ["0x01", 10], }); - const id = store.getState().EthereumReducer.transacts.length - 1; - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].method, "approve"); + const id = store.getState().EthereumReducer.chainState["1234"].transacts.length - 1; + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].transacts[id].method, "approve"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].state, "QUEUED"); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].txHash, txHash); + let lastTx = selectLastTransact(store.getState().EthereumReducer); + assert.deepStrictEqual(lastTx.state, "QUEUED"); + assert.deepStrictEqual(lastTx.txHash, txHash); await new Promise((r) => setTimeout(r, 1000)); sinon.assert.callCount(fakeApprove, 1); - sinon.assert.callCount(fakeEstimateGas["approve"], 1); + sinon.assert.callCount(fakeEstimateGas, 1); + + lastTx = selectLastTransact(store.getState().EthereumReducer); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].state, "MINED"); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].txHash, txHash); + assert.deepStrictEqual(lastTx.state, "MINED"); + assert.deepStrictEqual(lastTx.txHash, txHash); }); test("ETH_TRANSACT reverted", async () => { const txHash = "0x000001"; const txStatus = 0; // 0 == reverted const fakeApprove = (fakeUsdcContract.approve = sinon.fake.resolves({ hash: txHash })); //TxHash - const fakeEstimateGas = (fakeUsdcContract["estimateGas"] = { - approve: sinon.fake.resolves(BigNumber.from(100000)), - }); + const fakeEstimateGas = (fakeUsdcContract.approve["estimateGas"] = sinon.fake.resolves(100000n)); /* Mocking tx receipt function and initialize saga */ initializeEthereumStore({ @@ -504,14 +536,9 @@ describe("All the test with provider resolver mock", () => { getFormatter: contractRegistry.getFormatter, getSignerContract: contractRegistry.getSignerContract, getTxReceiptStatus: sinon.fake.resolves(txStatus), - selectChainId: () => 80001, // just for testing + selectChainId: () => 1234, // just for testing selectProvider: () => {}, selectUserAddress: () => "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", // just for testing - // just for testing - chain: { - id: 80001, - rpc: "https://matic-mumbai.chainstacklabs.com/", - }, }); assert.strictEqual(ethers.Contract.callCount, 1); @@ -521,30 +548,30 @@ describe("All the test with provider resolver mock", () => { address: currencyAddress, abi: "ERC20Permit", method: "approve", - args: ["0x01", ethers.BigNumber.from(10)], + args: ["0x01", 10], }); - const id = store.getState().EthereumReducer.transacts.length - 1; - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].method, "approve"); + let lastTx = selectLastTransact(store.getState().EthereumReducer); + assert.deepStrictEqual(lastTx.method, "approve"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].state, "QUEUED"); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].txHash, txHash); + lastTx = selectLastTransact(store.getState().EthereumReducer); + assert.deepStrictEqual(lastTx.state, "QUEUED"); + assert.deepStrictEqual(lastTx.txHash, txHash); await new Promise((r) => setTimeout(r, 1001)); + lastTx = selectLastTransact(store.getState().EthereumReducer); sinon.assert.callCount(fakeApprove, 1); - sinon.assert.callCount(fakeEstimateGas["approve"], 1); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].state, "REVERTED"); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].txHash, txHash); + sinon.assert.callCount(fakeEstimateGas, 1); + assert.deepStrictEqual(lastTx.state, "REVERTED"); + assert.deepStrictEqual(lastTx.txHash, txHash); }); test("ETH_TRANSACT rejected", async () => { const txHash = "0x000001"; const txStatus = 0; // 0 == reverted const fakeApprove = (fakeUsdcContract.approve = sinon.fake.resolves({ hash: txHash })); //TxHash - const fakeEstimateGas = (fakeUsdcContract["estimateGas"] = { - approve: sinon.fake.resolves(BigNumber.from(100000)), - }); + const fakeEstimateGas = (fakeUsdcContract.approve["estimateGas"] = sinon.fake.resolves(100000n)); /* Mocking tx receipt function and initialize saga */ initializeEthereumStore({ @@ -554,14 +581,9 @@ describe("All the test with provider resolver mock", () => { getFormatter: contractRegistry.getFormatter, getSignerContract: contractRegistry.getSignerContract, getTxReceiptStatus: sinon.fake.rejects(txStatus), - selectChainId: () => 80001, // just for testing + selectChainId: () => 1234, // just for testing selectProvider: () => {}, selectUserAddress: () => "0x4d68Cf31d613070b18E406AFd6A42719a62a0785", // just for testing - // just for testing - chain: { - id: 80001, - rpc: "https://matic-mumbai.chainstacklabs.com/", - }, }); assert.strictEqual(ethers.Contract.callCount, 1); @@ -571,25 +593,27 @@ describe("All the test with provider resolver mock", () => { address: currencyAddress, abi: "ERC20Permit", method: "approve", - args: ["0x01", ethers.BigNumber.from(10)], + args: ["0x01", 10], }); - const id = store.getState().EthereumReducer.transacts.length - 1; - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].method, "approve"); + let lastTx = selectLastTransact(store.getState().EthereumReducer); + assert.deepStrictEqual(lastTx.method, "approve"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].state, "QUEUED"); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].txHash, txHash); + lastTx = selectLastTransact(store.getState().EthereumReducer); + assert.deepStrictEqual(lastTx.state, "QUEUED"); + assert.deepStrictEqual(lastTx.txHash, txHash); await new Promise((r) => setTimeout(r, 1001)); + lastTx = selectLastTransact(store.getState().EthereumReducer); sinon.assert.callCount(fakeApprove, 1); - sinon.assert.callCount(fakeEstimateGas["approve"], 1); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].state, "REJECTED"); - assert.deepStrictEqual(store.getState().EthereumReducer.transacts[id].txHash, txHash); + sinon.assert.callCount(fakeEstimateGas, 1); + assert.deepStrictEqual(lastTx.state, "REJECTED"); + assert.deepStrictEqual(lastTx.txHash, txHash); }); test("ETH_CALL method with timestamp", async () => { - fakeUsdcContract.totalSupply = sinon.fake.resolves(ethers.BigNumber.from(12.345e6)); + fakeUsdcContract.totalSupply = sinon.fake.resolves(12.345e6); assert.strictEqual(ethers.Contract.callCount, 1); await store.dispatch({ type: "ETH_CALL", @@ -636,7 +660,7 @@ describe("All the test with provider resolver mock", () => { userAddress: userAddr, }); - assert.deepStrictEqual(store.getState().EthereumReducer.signs[userAddr].state, "PENDING"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].signs[userAddr].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); @@ -649,6 +673,7 @@ describe("All the test with provider resolver mock", () => { test("ETH_SIWE_SIGN resolves", async () => { const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; const whitelistAddr = "0x99b2949F4b12bF14F9AD66De374Cd5A2BF6a0C15"; + await store.dispatch({ type: "ETH_SIWE_SIGN", userAddress: userAddr, @@ -659,7 +684,7 @@ describe("All the test with provider resolver mock", () => { whitelist: whitelistAddr, }); - assert.deepStrictEqual(store.getState().EthereumReducer.siweSigns[userAddr].state, "PENDING"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].siweSigns[userAddr].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); @@ -674,11 +699,10 @@ describe("All the test with provider resolver mock", () => { const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour fakeUsdcContract.nonces = sinon.fake.resolves(2); - const usdcDomain = { name: "USDC", version: "1", - chainId: 8001, + chainId: 80001, verifyingContract: currencyAddress, }; @@ -693,9 +717,9 @@ describe("All the test with provider resolver mock", () => { }; const value = { - owner: ethers.utils.getAddress(userAddr), - spender: ethers.utils.getAddress(spenderAddr), - value: ethers.BigNumber.from(100e6), + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, nonce: await fakeUsdcContract.nonces(userAddr), deadline: deadline, }; @@ -707,26 +731,25 @@ describe("All the test with provider resolver mock", () => { value: value, }); - const key = ethers.utils._TypedDataEncoder.encode(usdcDomain, types, value); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "PENDING"); + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "SIGNED"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].signature, "0x0987654321"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].value, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "SIGNED"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].signature, "0x0987654321"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].value, value); }); test("Signed two eip712 message ETH_EIP_712_SIGN and get the bigger sign", async () => { const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour - fakeUsdcContract.nonces = sinon.fake.resolves(BigNumber.from(2)); - + fakeUsdcContract.nonces = sinon.fake.resolves(2); const usdcDomain = { name: "USDC", version: "1", - chainId: 8001, + chainId: 80001, verifyingContract: currencyAddress, }; @@ -741,9 +764,9 @@ describe("All the test with provider resolver mock", () => { }; let value = { - owner: ethers.utils.getAddress(userAddr), - spender: ethers.utils.getAddress(spenderAddr), - value: ethers.BigNumber.from(100e6), + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, nonce: await fakeUsdcContract.nonces(userAddr), deadline: deadline, }; @@ -755,19 +778,19 @@ describe("All the test with provider resolver mock", () => { value: value, }); - const key = ethers.utils._TypedDataEncoder.encode(usdcDomain, types, value); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "PENDING"); + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "SIGNED"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].signature, "0x0987654321"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].value, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "SIGNED"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].signature, "0x0987654321"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].value, value); value = { - owner: ethers.utils.getAddress(userAddr), - spender: ethers.utils.getAddress(spenderAddr), - value: ethers.BigNumber.from(200e6), + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 200e6, nonce: await fakeUsdcContract.nonces(userAddr), deadline: deadline, }; @@ -779,14 +802,17 @@ describe("All the test with provider resolver mock", () => { value: value, }); - const key2 = ethers.utils._TypedDataEncoder.encode(usdcDomain, types, value); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].state, "PENDING"); + const key2 = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].state, "SIGNED"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].signature, "0x0987654321"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].value, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].state, "SIGNED"); + assert.deepStrictEqual( + store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].signature, + "0x0987654321" + ); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].value, value); let biggerSign = selectBiggerSign( store.getState().EthereumReducer, @@ -803,12 +829,11 @@ describe("All the test with provider resolver mock", () => { const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address const secondSpender = "0x329731D4FB96Ec52039e222bC4cC67a86b582A86"; const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour - fakeUsdcContract.nonces = sinon.fake.resolves(BigNumber.from(2)); - + fakeUsdcContract.nonces = sinon.fake.resolves(2); const usdcDomain = { name: "USDC", version: "1", - chainId: 8001, + chainId: 80001, verifyingContract: currencyAddress, }; @@ -823,9 +848,9 @@ describe("All the test with provider resolver mock", () => { }; let value = { - owner: ethers.utils.getAddress(userAddr), - spender: ethers.utils.getAddress(spenderAddr), - value: ethers.BigNumber.from(100e6), + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, nonce: await fakeUsdcContract.nonces(userAddr), deadline: deadline, }; @@ -837,24 +862,24 @@ describe("All the test with provider resolver mock", () => { value: value, }); - const key = ethers.utils._TypedDataEncoder.encode(usdcDomain, types, value); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "PENDING"); + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "SIGNED"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].signature, "0x0987654321"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].value, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "SIGNED"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].signature, "0x0987654321"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].value, value); assert.deepStrictEqual( - store.getState().EthereumReducer.eipSigns[key].value.spender, - ethers.utils.getAddress(spenderAddr) + store.getState().EthereumReducer.chainState["1234"].eipSigns[key].value.spender, + ethers.getAddress(spenderAddr) ); // second spender value = { - owner: ethers.utils.getAddress(userAddr), - spender: ethers.utils.getAddress(secondSpender), - value: ethers.BigNumber.from(200e6), + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(secondSpender), + value: 200e6, nonce: await fakeUsdcContract.nonces(userAddr), deadline: deadline, }; @@ -866,17 +891,20 @@ describe("All the test with provider resolver mock", () => { value: value, }); - const key2 = ethers.utils._TypedDataEncoder.encode(usdcDomain, types, value); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].state, "PENDING"); + const key2 = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].state, "SIGNED"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].signature, "0x0987654321"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key2].value, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].state, "SIGNED"); + assert.deepStrictEqual( + store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].signature, + "0x0987654321" + ); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].value, value); assert.deepStrictEqual( - store.getState().EthereumReducer.eipSigns[key2].value.spender, - ethers.utils.getAddress(secondSpender) + store.getState().EthereumReducer.chainState["1234"].eipSigns[key2].value.spender, + ethers.getAddress(secondSpender) ); let biggerSign = selectBiggerSign( @@ -899,25 +927,118 @@ describe("All the test with provider resolver mock", () => { ); assert.deepStrictEqual(biggerSign, undefined); }); + + test("ETH_CALL, change Chain and ETH_CALL again", async () => { + const fakeTotalSupply = (fakeUsdcContract.totalSupply = sinon.fake.resolves(12.345e6)); + const fakeName = (fakeUsdcContract.name = sinon.fake.resolves("FakeUSDC")); + assert.strictEqual(ethers.Contract.callCount, 1); + + await store.dispatch({ + type: "ETH_CALL", + address: currencyAddress, + abi: "ERC20Permit", + method: "totalSupply", + }); + assert.strictEqual( + selectEthCall(store.getState().EthereumReducer, currencyAddress, "ERC20Permit", "totalSupply"), + undefined + ); + assert.strictEqual(ethers.Contract.callCount, 1); + const call_key = currencyAddress + "_0x18160ddd"; // "18160ddd" == kekac256("totalSupply()") + assert.deepStrictEqual(store.getState().EthereumReducer, { + timestamp: 0, + chainState: { + 1234: { + calls: { + [call_key]: { + state: "LOADING", + }, + }, + }, + }, + currentChain: { + id: 1234, + name: "NewChain", + rpc: "https://foo-rpc.com/", + }, + }); + const now = new Date().getTime(); + await new Promise((r) => setTimeout(r, 0)); + let ethStore = store.getState().EthereumReducer; + assert.deepEqual(ethStore.chainState["1234"].calls, { + [call_key]: { + state: "LOADED", + value: Big(12.345), + }, + }); + assert(now - ethStore.chainState["1234"].call_metadata[call_key].timestamp < 100); + sinon.assert.calledOnce(fakeTotalSupply); + assert.ok( + selectEthCall(store.getState().EthereumReducer, currencyAddress, "ERC20Permit", "totalSupply").eq(Big(12.345)) + ); + + store.dispatch({ + type: "SET_USER_CURRENT_CHAIN", + name: "SecondChain", + id: 5678, + rpc: "https://foo-rpc.com/", + }); + + ethStore = store.getState().EthereumReducer; + assert.deepEqual(ethStore.currentChain, { + id: 5678, + name: "SecondChain", + rpc: "https://foo-rpc.com/", + }); + + await store.dispatch({ + type: "ETH_CALL", + address: currencyAddress, + abi: "ERC20Permit", + method: "name", + }); + assert.strictEqual( + selectEthCall(store.getState().EthereumReducer, currencyAddress, "ERC20Permit", "name"), + undefined + ); + const call_key_2 = currencyAddress + "_0x06fdde03"; // "06fdde03" == kekac256("name()") + await new Promise((r) => setTimeout(r, 0)); + + ethStore = store.getState().EthereumReducer; + assert.deepEqual(ethStore.chainState["1234"].calls, { + [call_key]: { + state: "LOADED", + value: Big(12.345), + }, + }); + assert.deepEqual(ethStore.chainState["5678"].calls, { + [call_key_2]: { + state: "LOADED", + value: "FakeUSDC", + }, + }); + + sinon.assert.calledOnce(fakeTotalSupply); + sinon.assert.calledOnce(fakeName); + }); }); describe("All the tests with provider REJECTED Mock", () => { beforeEach(() => { let rejectedMock = sinon.spy(mock_helper.mockProviderRejectsFn()); - sinon.replaceGetter(ethers.providers, "Web3Provider", () => rejectedMock); + sinon.replaceGetter(ethers, "BrowserProvider", () => rejectedMock); }); test("Rejects eip712 message ETH_EIP_712_SIGN", async () => { const userAddr = "0x4d68Cf31d613070b18E406AFd6A42719a62a0785"; const spenderAddr = "0x78f1626224f48A4E24FD7Cc7bF070A1740D5cafD"; // receive money address const deadline = Math.floor(Date.now() / 1000) + 60 * 60; // 1 hour - fakeUsdcContract.nonces = sinon.fake.resolves(2); const usdcDomain = { name: "USDC", version: "1", - chainId: 8001, + chainId: 80001, verifyingContract: currencyAddress, }; @@ -932,9 +1053,9 @@ describe("All the tests with provider REJECTED Mock", () => { }; const value = { - owner: ethers.utils.getAddress(userAddr), - spender: ethers.utils.getAddress(spenderAddr), - value: ethers.BigNumber.from(100e6), + owner: ethers.getAddress(userAddr), + spender: ethers.getAddress(spenderAddr), + value: 100e6, nonce: await fakeUsdcContract.nonces(userAddr), deadline: deadline, }; @@ -946,13 +1067,16 @@ describe("All the tests with provider REJECTED Mock", () => { value: value, }); - const key = ethers.utils._TypedDataEncoder.encode(usdcDomain, types, value); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "PENDING"); + const key = ethers.TypedDataEncoder.encode(usdcDomain, types, value); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].state, "ERROR"); - assert.deepStrictEqual(store.getState().EthereumReducer.eipSigns[key].error, "Error signing typed message"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].eipSigns[key].state, "ERROR"); + assert.deepStrictEqual( + store.getState().EthereumReducer.chainState["1234"].eipSigns[key].error, + "Error signing typed message" + ); }); test("Rejects ETH_PLAIN_SIGN with message", async () => { @@ -963,7 +1087,7 @@ describe("All the tests with provider REJECTED Mock", () => { userAddress: userAddr, }); - assert.deepStrictEqual(store.getState().EthereumReducer.signs[userAddr].state, "PENDING"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].signs[userAddr].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); @@ -985,7 +1109,7 @@ describe("All the tests with provider REJECTED Mock", () => { whitelist: whitelistAddr, }); - assert.deepStrictEqual(store.getState().EthereumReducer.siweSigns[userAddr].state, "PENDING"); + assert.deepStrictEqual(store.getState().EthereumReducer.chainState["1234"].siweSigns[userAddr].state, "PENDING"); await new Promise((r) => setTimeout(r, 0)); diff --git a/src/store/ethereum/selectors.js b/src/store/ethereum/selectors.js index c00eaa5..9f4b652 100644 --- a/src/store/ethereum/selectors.js +++ b/src/store/ethereum/selectors.js @@ -4,70 +4,114 @@ import { getEncodedCallFn } from "../../package-index"; const { ethers } = require("ethers"); -const getCalls = (state) => state.calls; -const getCallMetadata = (state) => state.call_metadata; -const getTransacts = (state) => state.transacts; -const getSigns = (state) => state.signs; -const getSiweSigns = (state) => state.siweSigns; -const getEIPSigns = (state) => state.eipSigns; +const getCurrentChain = (state) => state.currentChain; +const getChainState = (state) => state.chainState; + +const getChainStateCalls = (state) => { + const chainId = getCurrentChain(state).id; + const chainState = getChainState(state); + return chainState[chainId] ? chainState[chainId].calls : {}; +}; + +const getChainStateCallMetadata = (state) => { + const chainId = getCurrentChain(state).id; + const chainState = getChainState(state); + return chainState[chainId] ? chainState[chainId].call_metadata : {}; +}; + +const getChainStateEIPSigns = (state) => { + const chainId = getCurrentChain(state).id; + const chainState = getChainState(state); + return chainState[chainId] && chainState[chainId].eipSigns ? chainState[chainId].eipSigns : {}; +}; + +const getChainStatePlainSigns = (state) => { + const chainId = getCurrentChain(state).id; + const chainState = getChainState(state); + return chainState[chainId] && chainState[chainId].signs ? chainState[chainId].signs : {}; +}; + +const getChainStateSiweSigns = (state) => { + const chainId = getCurrentChain(state).id; + const chainState = getChainState(state); + return chainState[chainId] && chainState[chainId].siweSigns ? chainState[chainId].siweSigns : {}; +}; + +const getChainStateTransacts = (state) => { + const chainId = getCurrentChain(state).id; + const chainState = getChainState(state); + return chainState[chainId] && chainState[chainId].transacts ? chainState[chainId].transacts : []; +}; const getSignKey = (__, address) => { return address; }; -const getCallKey = (__, address, abiName, method, ...args) => - address + "_" + getEncodedCallFn(address, abiName, method, args); +const getCallKey = (state, address, abiName, method, ...args) => { + const rpc = state.currentChain.rpc; + return address + "_" + getEncodedCallFn(address, abiName, method, args, rpc); +}; -const getCallKeys = (__, calls) => - _.map(calls, (call) => { - return call.address + "_" + getEncodedCallFn(call.address, call.abi, call.method, call.args); +const getCallKeys = (state, calls) => { + const rpc = state.currentChain.rpc; + return _.map(calls, (call) => { + return call.address + "_" + getEncodedCallFn(call.address, call.abi, call.method, call.args, rpc); }); +}; + +export const selectCurrentChain = createSelector([getCurrentChain], (currentChain) => currentChain); export const selectEthCall = createSelector( - [getCalls, getCallKey], - (calls, callKey) => calls[callKey] && calls[callKey].value + [getChainStateCalls, getCallKey], + (calls, callKey) => calls && calls[callKey] && calls[callKey].value ); export const selectEthCallTimestamp = createSelector( - [getCallMetadata, getCallKey], - (callMeta, callKey) => callMeta[callKey] && callMeta[callKey].timestamp + [getChainStateCallMetadata, getCallKey], + (callMeta, callKey) => callMeta && callMeta[callKey] && callMeta[callKey].timestamp ); export const selectEthCallTimestampByKey = createSelector( - [getCallMetadata, (__, callKey) => callKey], - (callMeta, callKey) => callMeta[callKey] && callMeta[callKey].timestamp + [getChainStateCallMetadata, (__, callKey) => callKey], + (callMeta, callKey) => callMeta && callMeta[callKey] && callMeta[callKey].timestamp ); export const selectEthCallState = createSelector( - [getCalls, getCallKey], + [getChainStateCalls, getCallKey], (calls, callKey) => calls[callKey] && calls[callKey].state ); -export const selectEthCallMultiple = createSelector([getCalls, getCallKeys], (calls, callKeys) => - _.map(callKeys, (callKey) => { - return calls[callKey] === undefined ? {} : { value: calls[callKey].value, state: calls[callKey].state }; - }) -); +export const selectEthCallMultiple = createSelector([getChainStateCalls, getCallKeys], (calls, callKeys) => { + return _.map(callKeys, (callKey) => { + return !calls || calls[callKey] === undefined ? {} : { value: calls[callKey].value, state: calls[callKey].state }; + }); +}); -export const selectLastTransact = createSelector([getTransacts], (transacts) => transacts[transacts.length - 1]); +export const selectLastTransact = createSelector( + [getChainStateTransacts], + (transacts) => transacts[transacts.length - 1] +); -export const selectSign = createSelector([getSigns, getSignKey], (signs, signKey) => signs[signKey]); +export const selectSign = createSelector([getChainStatePlainSigns, getSignKey], (signs, signKey) => signs[signKey]); -export const selectEthSiweSign = createSelector([getSiweSigns, getSignKey], (signs, ethSignKey) => signs[ethSignKey]); +export const selectEthSiweSign = createSelector( + [getChainStateSiweSigns, getSignKey], + (signs, ethSignKey) => signs[ethSignKey] +); export const selectBiggerSign = createSelector( - [getEIPSigns, (__, addr, nonce, spender) => ({ addr, nonce, spender })], + [getChainStateEIPSigns, (__, addr, nonce, spender) => ({ addr, nonce, spender })], (signs, params) => { - const userAddr = ethers.utils.getAddress(params.addr); + const userAddr = ethers.getAddress(params.addr); const nonce = params.nonce; - const spenderAddr = params.spender ? ethers.utils.getAddress(params.spender) : ""; + const spenderAddr = params.spender ? ethers.getAddress(params.spender) : ""; const filteredSigns = Object.keys(signs).filter((sign) => { return ( signs[sign].state === "SIGNED" && - userAddr === ethers.utils.getAddress(signs[sign].userAddress) && - signs[sign].value.nonce.eq(nonce) && + userAddr === ethers.getAddress(signs[sign].userAddress) && + signs[sign].value.nonce === nonce && spenderAddr && - spenderAddr === ethers.utils.getAddress(signs[sign].value.spender) + spenderAddr === ethers.getAddress(signs[sign].value.spender) ); }); const sortedSigns = filteredSigns.sort((s1, s2) => { diff --git a/src/store/sagas.js b/src/store/sagas.js index 7a8b082..30fd968 100644 --- a/src/store/sagas.js +++ b/src/store/sagas.js @@ -20,12 +20,6 @@ initializeEthereumStore({ selectChainId: () => 80001, // just for testing selectProvider: () => {}, selectUserAddress: () => "0x4d68cf31d613070b18e406afd6a42719a62a0785", // just for testing - // just for testing - chain: { - id: 80001, - rpc: "https://rpc.ankr.com/polygon_mumbai", - network: "maticmum", - }, }); export default function* rootSaga() {