From b76307f7da2845a6239542b2c0722714e65050e3 Mon Sep 17 00:00:00 2001 From: Gauthier Petetin Date: Mon, 24 Jul 2023 16:51:54 -0300 Subject: [PATCH 01/20] feat: Add guidelines for contributors (#6187) * Add coding guidelines * Add contributing guidelines * Update link to coding guidelines in PR template * fix(guidelines): adjust based on Nico's comments * fix(guidelines): format file structure properly --- .github/CONTRIBUTING.md | 25 ++++++ .../coding_guidelines/CODING_GUIDELINES.md | 76 +++++++++++++++++++ .github/pull_request_template.md | 4 +- 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/coding_guidelines/CODING_GUIDELINES.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000000..5c7b6e81a1f --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Welcome to MetaMask! + +If you're submitting code to MetaMask, there are some simple things we'd appreciate you doing to help us stay organized! + +### Finding the right project + +Before taking the time to code and implement something, feel free to open an issue and discuss it! There may even be an issue already open, and together we may come up with a specific strategy before you take your precious time to write code. + +There are also plenty of open issues we'd love help with. Search the [`good first issue`](https://github.com/MetaMask/metamask-mobile/contribute) label, or head to Gitcoin and earn ETH for completing projects we've posted bounties on. + +If you're picking up a bounty or an existing issue, feel free to ask clarifying questions on the issue as you go about your work. + +### Submitting a pull request +When you're done with your project / bugfix / feature and ready to submit a PR, there are a couple guidelines we ask you to follow: + +- [ ] **Make sure you followed our [`coding guidelines`](https://github.com/MetaMask/metamask-mobile/blob/main/.github/coding_guidelines/CODING_GUIDELINES.md)**: These guidelines aim to maintain consistency and readability across the codebase. They help ensure that the code is easy to understand, maintain, and modify, which is particularly important when working with multiple contributors. +- [ ] **Test it**: For any new programmatic functionality, we like unit tests when possible, so if you can keep your code cleanly isolated, please do add a test file to the `tests` folder. +- [ ] **Add to the CHANGELOG**: Help us keep track of all the moving pieces by adding an entry to the [`CHANGELOG.md`](https://github.com/MetaMask/metamask-mobile/blob/main/CHANGELOG.md) with a link to your PR. +- [ ] **Meet the spec**: Make sure the PR adds functionality that matches the issue you're closing. This is especially important for bounties: sometimes design or implementation details are included in the conversation, so read carefully! +- [ ] **Close the issue**: If this PR closes an open issue, add the line `fixes #$ISSUE_NUMBER`. Ex. For closing issue 418, include the line `fixes #418`. If it doesn't close the issue but addresses it partially, just include a reference to the issue number, like `#418`. +- [ ] **Keep it simple**: Try not to include multiple features in a single PR, and don't make extraneous changes outside the scope of your contribution. All those touched files make things harder to review ;) +- [ ] **PR against `main`**: Submit your PR against the `main` branch. This is where we merge new features to be included in forthcoming releases. When we initiate a new release, we create a branch named `release/x.y.z`, serving as a snapshot of the `main` branch. This particular branch is utilized to construct the builds, which are then tested during the release regression testing phase before they are submitted to the stores for production. In the event your PR is a hot-fix for a bug identified on the `release/x.y.z` branch, you should still submit your PR against the `main` branch. This PR will subsequently be cherry-picked into the `release/x.y.z` branch by our release engineers. +- [ ] **Get the PR reviewed by code owners**: At least two code owner approvals are mandatory before merging any PR. + +And that's it! Thanks for helping out. diff --git a/.github/coding_guidelines/CODING_GUIDELINES.md b/.github/coding_guidelines/CODING_GUIDELINES.md new file mode 100644 index 00000000000..f2aa54ecfab --- /dev/null +++ b/.github/coding_guidelines/CODING_GUIDELINES.md @@ -0,0 +1,76 @@ +# MetaMask Mobile Coding Guidelines + +### 1. New Code Should be Typescript +- New components and utilities should be written in Typescript and enforce typing. +- Existing code should be refactored into Typescript where time allows. If you are replacing a component use Typescript. + +### 2. Using Functional Components and Hooks Instead of Classes +- Use functional components and hooks as they result in more concise and readable code compared to classes. + +### 3. Organize Files Related to the Same Component in One Folder +- An example of a component file structure: + +```.tsx +AvatarAccount +├── AvatarAccount.constants.ts +├── AvatarAccount.stories.tsx +├── AvatarAccount.styles.ts +├── AvatarAccount.test.tsx +├── AvatarAccount.tsx +├── AvatarAccount.types.ts +├── README.md +├── __snapshots__ +│   └── AvatarAccount.test.tsx.snap +└── index.ts +``` + +### 4. Follow Naming Conventions +- You should always use PascalCase when naming components to differentiate them from other non-component TSX files. For example: *TextField*, *NavMenu*, and *SuccessButton*. +- Use camelCase for functions declared inside components like *handleInput()* or *showElement()*. +- When creating hooks use *withHookName()*. + +### 5. Avoid Repetitive Code +- If you notice you are writing duplicated code or components, convert it into a component, utility functions or hooks that can be reused. Do this with [scalable intention](https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction). + +### 6. Component Optimization +- For functional components, instead of having large return statements, break the component down into smaller sub-components. +- Use memoizing techniques where possible. Utilize the useMemo hook for values and useCallback for functions. Follow recommended React Native guidance. + +### 7. Use Object Destructuring For Props +- Instead of passing the props object, use object destructuring to pass the prop name. This discards the need to refer to the props object each time you need to use it. + +```tsx +import React from 'react'; +import { View } from 'react-native'; + +const MyComponent = ({id}) => { + return ; +}; + +const MyComponent = (props, context) => { + const { id } = props; + return ; +}; + +const Foo = class extends React.PureComponent { + render() { + const { title } = this.context; + return {title} + } +}; + +``` + +### 8. Document Each Component/Utility +- New utility functions should be documented [TSDoc](https://tsdoc.org) commenting format. +- Referencing our component docs. +- If applicable add URL to online resources if they are meaningful for the component/method. + +### 9. Write Tests for Each Component/Utility +- Write tests for the components you create as it reduces the possibilities of errors. Testing ensures that the components are behaving as you would expect. In this project Jest is used, and it provides an environment where you can execute your tests. + +### 10. External packages should be well maintained +- New packages should only be integrated if the application doesn’t have the existing functionality and it cannot be added by implementing a small utility function. Use the https://snyk.io/advisor/ to assess the popularity, maintainability and security analysis. The package must be in good standing to be added to the project. +- Update existing dependencies when you notice they are out of date. + +[Source](https://www.makeuseof.com/must-follow-react-practices/) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e32030a2630..2d071bb0302 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -5,7 +5,7 @@ Please ensure that any applicable requirements below are satisfied before submit --> **Development & PR Process** -1. Follow MetaMask [Mobile Coding Standards](https://docs.google.com/document/d/1VJLwTRsUw_5EDq_o8d6sSbXUAYENLurkRitYO45eY5o/edit?usp=sharing) +1. Follow MetaMask [Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/coding_guidelines/CODING_GUIDELINES.md) 2. Add `release-xx` label to identify the PR slated for a upcoming release (will be used in release discussion) 3. Add `needs-dev-review` label when work is completed 4. Add `needs-qa` label when dev review is completed @@ -23,7 +23,7 @@ _If applicable, add screenshots and/or recordings to visualize the before and af **Issue** -Progresses #??? +fixes #??? **Checklist** From 7760842a51ba614ca988199c6ac34fc0a1461b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Loureiro?= <1649425+jpcloureiro@users.noreply.github.com> Date: Mon, 24 Jul 2023 23:19:54 +0100 Subject: [PATCH 02/20] fix: Browser external application alert on trusted deeplink protocols (#6742) * browser: set an allowlist for trusted deeplink protocols allow the OS to deeplink trusted protocols such as `wc:` and `metamask:` * browser: add trusted deeplink protocols * browser: add negative tests --------- Co-authored-by: Curtis David --- app/components/Views/BrowserTab/index.js | 9 +++++ app/util/browser/index.test.ts | 44 ++++++++++++++++++++++++ app/util/browser/index.ts | 11 ++++++ 3 files changed, 64 insertions(+) diff --git a/app/components/Views/BrowserTab/index.js b/app/components/Views/BrowserTab/index.js index 8f23a127190..fe52d8fd78e 100644 --- a/app/components/Views/BrowserTab/index.js +++ b/app/components/Views/BrowserTab/index.js @@ -30,6 +30,7 @@ import onUrlSubmit, { prefixUrlWithProtocol, isTLD, protocolAllowList, + trustedProtocolToDeeplink, getAlertMessage, allowLinkOpen, getUrlObj, @@ -800,6 +801,14 @@ export const BrowserTab = (props) => { const { protocol } = new URL(url); if (protocolAllowList.includes(protocol)) return true; + // If it is a trusted deeplink protocol, do not show the + // warning alert. Allow the OS to deeplink the URL + // and stop the webview from loading it. + if (trustedProtocolToDeeplink.includes(protocol)) { + allowLinkOpen(url); + return false; + } + const alertMsg = getAlertMessage(protocol, strings); // Pop up an alert dialog box to prompt the user for permission diff --git a/app/util/browser/index.test.ts b/app/util/browser/index.test.ts index 061ded74725..ecc6ac7d95a 100644 --- a/app/util/browser/index.test.ts +++ b/app/util/browser/index.test.ts @@ -2,6 +2,7 @@ import onUrlSubmit, { isTLD, getAlertMessage, protocolAllowList, + trustedProtocolToDeeplink, prefixUrlWithProtocol, getUrlObj, getHost, @@ -198,3 +199,46 @@ describe('Browser utils :: protocolWhitelist', () => { expect(protocolAllowList.includes(protocol)).toBeTruthy(); }); }); + +describe('Browser utils :: trustedProtocolToDeeplink', () => { + it('should match wc: protocol', () => { + const { protocol } = new URL('wc:f82jdjfjakjskdfj'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeTruthy(); + }); + it('should match metamask: protocol', () => { + const { protocol } = new URL('metamask://dapp/home.metamask.io'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeTruthy(); + }); + it('should match ethereum: protocol', () => { + const { protocol } = new URL('ethereum://tx'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeTruthy(); + }); + it('should match dapp: protocol', () => { + const { protocol } = new URL('dapp://home.metamask.io'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeTruthy(); + }); + it('should not match eth: protocol', () => { + const { protocol } = new URL('eth://home.metamask.io'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeFalsy(); + }); + it('should not match tel: protocol', () => { + const { protocol } = new URL('tel://home.metamask.io'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeFalsy(); + }); + it('should not match mailto: protocol', () => { + const { protocol } = new URL('mailto://home.metamask.io'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeFalsy(); + }); + it('should not match ldap: protocol', () => { + const { protocol } = new URL('ldap://home.metamask.io'); + + expect(trustedProtocolToDeeplink.includes(protocol)).toBeFalsy(); + }); +}); diff --git a/app/util/browser/index.ts b/app/util/browser/index.ts index 7ba35556cb4..d90a223fc90 100644 --- a/app/util/browser/index.ts +++ b/app/util/browser/index.ts @@ -100,6 +100,17 @@ export const isTLD = (hostname: string, error: any) => */ export const protocolAllowList = ['about:', 'http:', 'https:']; +/** + * + * List of all trusted protocols for OS Linker to handle + */ +export const trustedProtocolToDeeplink = [ + 'wc:', + 'metamask:', + 'ethereum:', + 'dapp:', +]; + /** * Returns translated warning message for the * warning dialog box the user sees when the to be loaded From 8e35f3f488f1b09e830d7523ace2c8503e66d976 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 25 Jul 2023 09:08:49 -0230 Subject: [PATCH 03/20] chore: Update Jest to v28 (#6876) Jest has been updated to v28. This will enable us to use new features introduced in Jest v28, in later PRs. See here for the migration guide: https://jestjs.io/docs/28.x/upgrading-to-jest28 --- package.json | 6 +- yarn.lock | 1164 +++++++++++++++++++++----------------------------- 2 files changed, 498 insertions(+), 672 deletions(-) diff --git a/package.json b/package.json index 7aea99b8af9..22bf994ce51 100644 --- a/package.json +++ b/package.json @@ -360,7 +360,7 @@ "@testing-library/react-native": "12.1.2", "@types/enzyme": "^3.10.9", "@types/is-url": "^1.2.30", - "@types/jest": "^27.2.0", + "@types/jest": "^28.1.8", "@types/node": "^17.0.21", "@types/qs": "^6.9.7", "@types/react": "^17.0.11", @@ -386,7 +386,7 @@ "assert": "1.4.1", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.1.0", - "babel-jest": "^27.2.0", + "babel-jest": "^28.1.3", "babel-loader": "^8.2.3", "babel-plugin-transform-inline-environment-variables": "0.4.3", "babel-plugin-transform-remove-console": "6.9.4", @@ -410,7 +410,7 @@ "ganache": "^7.7.7", "husky": "1.3.1", "improved-yarn-audit": "^3.0.0", - "jest": "^27.2.0", + "jest": "^28.1.3", "jest-junit": "^15.0.0", "jetifier": "2.0.0", "lint-staged": "10.5.4", diff --git a/yarn.lock b/yarn.lock index cadd8808eeb..129c6d78a63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -197,6 +197,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== +"@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + "@babel/core@^7.0.0", "@babel/core@^7.14.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" @@ -218,7 +223,28 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": +"@babel/core@^7.11.6": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + +"@babel/core@^7.12.3": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== @@ -337,6 +363,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -439,6 +475,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" @@ -777,6 +824,17 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" @@ -985,6 +1043,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" @@ -1116,6 +1181,15 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + "@babel/highlight@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" @@ -1187,6 +1261,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== +"@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -2514,6 +2593,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.7.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" @@ -3952,48 +4047,49 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== +"@jest/core@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.8.1" + ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" micromatch "^4.0.4" + pretty-format "^28.1.3" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" @@ -4005,15 +4101,15 @@ dependencies: "@jest/types" "^29.5.0" -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^27.5.1" + jest-mock "^28.1.3" "@jest/environment@^29.5.0": version "29.5.0" @@ -4032,17 +4128,25 @@ dependencies: jest-get-type "^28.0.2" -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" "@jest/fake-timers@^29.5.0": version "29.5.0" @@ -4056,45 +4160,45 @@ jest-mock "^29.5.0" jest-util "^29.5.0" -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" + glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" + strip-ansi "^6.0.0" terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" + v8-to-istanbul "^9.0.1" "@jest/schemas@^28.1.3": version "28.1.3" @@ -4117,55 +4221,55 @@ dependencies: "@sinclair/typebox" "^0.25.16" -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== dependencies: + "@jridgewell/trace-mapping" "^0.3.13" callsites "^3.0.0" graceful-fs "^4.2.9" - source-map "^0.6.0" -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== dependencies: - "@jest/test-result" "^27.5.1" + "@jest/test-result" "^28.1.3" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" + jest-haste-map "^28.1.3" + slash "^3.0.0" -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.1" "@jest/types@^26.6.2": version "26.6.2" @@ -4827,7 +4931,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== @@ -6271,10 +6375,10 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" @@ -6834,11 +6938,6 @@ "@testing-library/dom" "^9.0.0" "@types/react-dom" "^18.0.0" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tradle/react-native-http@2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@tradle/react-native-http/-/react-native-http-2.0.1.tgz#af19e240e1e580bfa249563924d1be472686f48b" @@ -6891,7 +6990,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== @@ -6924,13 +7023,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/babel__traverse@^7.0.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.4.tgz#0fa6be6c182288831be8c31c35dab6d6ccac47c5" - integrity sha512-TLG7CsGZZmX9aDF78UuJxnNTfQyRUFU0OYIVyIblr0/wd/HvsIo8wmuB90CszeD2MtLLAE9Tt4cWvk+KVkyGIw== - dependencies: - "@babel/types" "^7.3.0" - "@types/base64-stream@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/base64-stream/-/base64-stream-1.0.2.tgz#5a6c99eb4701a3d2aafd3082d8b44be7b1be1325" @@ -7101,10 +7193,10 @@ "@types/minimatch" "^5.1.2" "@types/node" "*" -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" @@ -7167,13 +7259,13 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.2.0": - version "27.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" - integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== +"@types/jest@^28.1.8": + version "28.1.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" + integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^28.0.0" + pretty-format "^28.0.0" "@types/jsftp@2.1.2": version "2.1.2" @@ -8707,11 +8799,6 @@ Base64@~0.2.0: resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028" integrity sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg= -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -8803,14 +8890,6 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-jsx@^5.0.0, acorn-jsx@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -8821,11 +8900,6 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - acorn-walk@^8.1.1, acorn-walk@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" @@ -8841,7 +8915,7 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1: +acorn@^8.4.1: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -10199,16 +10273,15 @@ babel-eslint@10.1.0, babel-eslint@^10.0.1, babel-eslint@^10.1.0: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-jest@^27.2.0, babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/transform" "^28.1.3" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" + babel-preset-jest "^28.1.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -10257,14 +10330,14 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-plugin-macros@^2.0.0: @@ -10395,12 +10468,12 @@ babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.4.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== dependencies: - babel-plugin-jest-hoist "^27.5.1" + babel-plugin-jest-hoist "^28.1.3" babel-preset-current-node-syntax "^1.0.0" babel-runtime@^6.26.0: @@ -10853,7 +10926,7 @@ browserslist@^4.21.3: node-releases "^2.0.8" update-browserslist-db "^1.0.10" -browserslist@^4.21.5: +browserslist@^4.21.5, browserslist@^4.21.9: version "4.21.9" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -12245,23 +12318,6 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - csstype@^2.5.7: version "2.6.19" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" @@ -12380,15 +12436,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - date-fns@^2.29.3: version "2.29.3" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" @@ -12478,11 +12525,6 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decimal.js@^10.2.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -12926,11 +12968,6 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - diff-sequences@^28.1.1: version "28.1.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" @@ -13049,13 +13086,6 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - domhandler@^4.0.0, domhandler@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" @@ -13259,10 +13289,10 @@ emittery@0.10.0: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== emoji-regex@^7.0.1: version "7.0.3" @@ -13666,18 +13696,6 @@ escodegen@^1.8.1: optionalDependencies: source-map "~0.6.1" -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-esnext@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz#8695b858fcf40d28c1aedca181f700528c7b60c6" @@ -15068,17 +15086,7 @@ expect-webdriverio@^3.0.0: expect "^28.1.0" jest-matcher-utils "^28.1.0" -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -expect@^28.1.0: +expect@^28.0.0, expect@^28.1.0, expect@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== @@ -15637,15 +15645,6 @@ form-data@^2.5.0: combined-stream "^1.0.6" mime-types "^2.1.12" -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -16462,13 +16461,6 @@ html-element-map@^1.0.0: array.prototype.filter "^1.0.0" call-bind "^1.0.2" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -16511,15 +16503,6 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -17316,11 +17299,6 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-primitive@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-3.0.1.tgz#98c4db1abff185485a657fc2905052b940524d05" @@ -17632,98 +17610,85 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== dependencies: - "@jest/types" "^27.5.1" execa "^5.0.0" - throat "^6.0.1" + p-limit "^3.1.0" -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" prompts "^2.0.1" - yargs "^16.2.0" + yargs "^17.3.1" -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" + glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^27.5.1" + pretty-format "^28.1.3" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - jest-diff@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" @@ -17734,48 +17699,35 @@ jest-diff@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== dependencies: detect-newline "^3.0.0" -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.3" chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" + jest-mock "^28.1.3" + jest-util "^28.1.3" jest-environment-node@^29.2.1: version "29.5.0" @@ -17794,59 +17746,30 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - jest-get-type@^28.0.2: version "28.0.2" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" micromatch "^4.0.4" - walker "^1.0.7" + walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - jest-junit@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-15.0.0.tgz#a47544ab42e9f8fe7ada56306c218e09e52bd690" @@ -17857,23 +17780,13 @@ jest-junit@^15.0.0: uuid "^8.3.2" xml "^1.0.1" -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" jest-matcher-utils@^28.1.0, jest-matcher-utils@^28.1.3: version "28.1.3" @@ -17885,21 +17798,6 @@ jest-matcher-utils@^28.1.0, jest-matcher-utils@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-message-util@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" @@ -17930,12 +17828,12 @@ jest-message-util@^29.5.0: slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.3" "@types/node" "*" jest-mock@^29.5.0: @@ -17952,92 +17850,95 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^27.0.6, jest-regex-util@^27.5.1: +jest-regex-util@^27.0.6: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== dependencies: - "@jest/types" "^27.5.1" chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" + jest-haste-map "^28.1.3" jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" + jest-util "^28.1.3" + jest-validate "^28.1.3" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.8.1" + emittery "^0.10.2" graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^27.0.6, jest-serializer@^27.5.1: +jest-serializer@^27.0.6: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== @@ -18045,35 +17946,36 @@ jest-serializer@^27.0.6, jest-serializer@^27.5.1: "@types/node" "*" graceful-fs "^4.2.9" -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== dependencies: - "@babel/core" "^7.7.2" + "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.5.1" + expect "^28.1.3" graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" + pretty-format "^28.1.3" + semver "^7.3.5" -jest-util@^27.2.0, jest-util@^27.5.1: +jest-util@^27.2.0: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== @@ -18121,32 +18023,33 @@ jest-validate@^26.5.2: leven "^3.1.0" pretty-format "^26.6.2" -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^28.1.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.5.1" + jest-get-type "^28.0.2" leven "^3.1.0" - pretty-format "^27.5.1" + pretty-format "^28.1.3" -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.5.1" + emittery "^0.10.2" + jest-util "^28.1.3" string-length "^4.0.1" -jest-worker@^27.2.0, jest-worker@^27.5.1: +jest-worker@^27.2.0: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -18155,14 +18058,24 @@ jest-worker@^27.2.0, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== dependencies: - "@jest/core" "^27.5.1" + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" import-local "^3.0.2" - jest-cli "^27.5.1" + jest-cli "^28.1.3" jetifier@2.0.0: version "2.0.0" @@ -18307,39 +18220,6 @@ jscodeshift@^0.13.1: temp "^0.8.4" write-file-atomic "^2.3.0" -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -19130,7 +19010,7 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg== -lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.9, lodash@^4.2.1, lodash@^4.6.1, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.9, lodash@^4.2.1, lodash@^4.6.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -19304,6 +19184,13 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -21214,11 +21101,6 @@ number-to-bn@1.7.0: bn.js "4.11.6" strip-hex-prefix "1.0.0" -nwsapi@^2.2.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" - integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -21655,7 +21537,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -21846,7 +21728,7 @@ parse5-htmlparser2-tree-adapter@^6.0.1: dependencies: parse5 "^6.0.1" -parse5@6.0.1, parse5@^6.0.1: +parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -22365,7 +22247,7 @@ pretty-format@^26.5.2, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -22374,7 +22256,7 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^28.1.3: +pretty-format@^28.0.0, pretty-format@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== @@ -24572,13 +24454,6 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" @@ -24699,6 +24574,11 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.0.0, semver@^7.3.2, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -25193,7 +25073,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -"source-map-support@0.3.2 - 1.0.0", source-map-support@0.5.21, source-map-support@^0.5.12, source-map-support@^0.5.19, source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@^0.x, source-map-support@~0.5.20: +"source-map-support@0.3.2 - 1.0.0", source-map-support@0.5.21, source-map-support@^0.5.12, source-map-support@^0.5.19, source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.9, source-map-support@^0.x, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -25201,6 +25081,14 @@ source-map-resolve@^0.5.0: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.16: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -25853,11 +25741,6 @@ swappable-obj-proxy@^1.1.0: resolved "https://registry.yarnpkg.com/swappable-obj-proxy/-/swappable-obj-proxy-1.1.0.tgz#fe23c60a0df22499e85d94b71297d9c39ff05fa4" integrity sha512-bXbKO85b0YNbZi/61TjRAbNtY49ABKu7rQ4k2+RFXPL7TA2mphttfqAqCeJ+lrlKlkYc5pvm6erFk6vOWJSpdw== -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -26061,11 +25944,6 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - through2@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" @@ -26127,7 +26005,7 @@ tmp@^0.2.1: dependencies: rimraf "^3.0.0" -tmpl@1.0.x: +tmpl@1.0.5, tmpl@1.0.x: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -26189,7 +26067,7 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== -tough-cookie@4.1.3, tough-cookie@^2.3.3, tough-cookie@^4.0.0, tough-cookie@~2.5.0: +tough-cookie@4.1.3, tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== @@ -26199,13 +26077,6 @@ tough-cookie@4.1.3, tough-cookie@^2.3.3, tough-cookie@^4.0.0, tough-cookie@~2.5. universalify "^0.2.0" url-parse "^1.5.3" -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -26419,7 +26290,7 @@ typed-styles@^0.0.7: resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: +typedarray-to-buffer@3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -26849,14 +26720,14 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" - source-map "^0.7.3" valid-url@1.0.9: version "1.0.9" @@ -26927,20 +26798,6 @@ vm2@>=3.9.17, vm2@^3.9.3: acorn "^8.7.0" acorn-walk "^8.2.0" -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - walker@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -26948,6 +26805,13 @@ walker@^1.0.7: dependencies: makeerror "1.0.x" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + warn-once@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.0.tgz#4f58d89b84f968d0389176aa99e0cf0f14ffd4c8" @@ -27208,18 +27072,6 @@ webidl-conversions@^5.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - whatwg-fetch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" @@ -27230,11 +27082,6 @@ whatwg-fetch@^3.0.0, whatwg-fetch@^3.4.1: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - whatwg-url-without-unicode@8.0.0-3: version "8.0.0-3" resolved "https://registry.yarnpkg.com/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b" @@ -27252,15 +27099,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -27455,15 +27293,13 @@ write-file-atomic@^2.3.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== +write-file-atomic@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" + signal-exit "^3.0.7" write@1.0.3: version "1.0.3" @@ -27506,7 +27342,7 @@ ws@^7, ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== -ws@^7.2.3, ws@^7.4.6: +ws@^7.2.3: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -27553,11 +27389,6 @@ xhr@^2.0.1, xhr@^2.2.0: parse-headers "^2.0.0" xtend "^4.0.0" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" @@ -27591,11 +27422,6 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - xmldom@^0.6.0, xmldom@^0.x: version "0.6.0" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.6.0.tgz#43a96ecb8beece991cef382c08397d82d4d0c46f" @@ -27800,7 +27626,7 @@ yargs@^17.0.0: y18n "^5.0.5" yargs-parser "^21.0.0" -yargs@^17.5.1: +yargs@^17.3.1, yargs@^17.5.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From abbd9b2a98f876f1e8ab6e195e455263f4dc9bfc Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 25 Jul 2023 11:43:29 -0230 Subject: [PATCH 04/20] test: Remove obsolete test fixture state (#6879) The `NetworkController` state property `provider` was still referenced in a few unit tests, despite the fact that it no longer exists. All such obsolete state references have been removed. This change was done to simplify PR #6872, which is part of https://github.com/MetaMask/mobile-planning/issues/798 --- app/components/UI/AccountInfoCard/index.test.tsx | 3 --- .../ApproveTransactionHeader.test.tsx | 3 --- app/components/hooks/useExistingAddress.test.ts | 6 ------ 3 files changed, 12 deletions(-) diff --git a/app/components/UI/AccountInfoCard/index.test.tsx b/app/components/UI/AccountInfoCard/index.test.tsx index 4ac740dc3fd..5ce7c9aa040 100644 --- a/app/components/UI/AccountInfoCard/index.test.tsx +++ b/app/components/UI/AccountInfoCard/index.test.tsx @@ -48,9 +48,6 @@ const initialState = { type: 'sepolia', nickname: 'Sepolia', }, - provider: { - ticker: 'eth', - }, }, TokenBalancesController: { contractBalances: {}, diff --git a/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx b/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx index 1d80c0770ad..de0d8ce0c3d 100644 --- a/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx +++ b/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx @@ -82,9 +82,6 @@ const initialState = { type: 'sepolia', nickname: 'Sepolia', }, - provider: { - ticker: 'eth', - }, }, AddressBookController: { addressBook: {}, diff --git a/app/components/hooks/useExistingAddress.test.ts b/app/components/hooks/useExistingAddress.test.ts index 21077401985..722c39c46a6 100644 --- a/app/components/hooks/useExistingAddress.test.ts +++ b/app/components/hooks/useExistingAddress.test.ts @@ -18,9 +18,6 @@ jest.mock('react-redux', () => ({ }, NetworkController: { network: 1, - provider: { - ticker: 'eth', - }, }, AddressBookController: { addressBook: { @@ -52,9 +49,6 @@ const initialState = { }, NetworkController: { network: 1, - provider: { - ticker: 'eth', - }, }, AddressBookController: { addressBook: { From 32ea4dd304f4c0f0510fffc7e27909921893cacf Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 25 Jul 2023 12:15:56 -0230 Subject: [PATCH 05/20] Update `@metamask/controller-utils` to v3.4 (#6884) The `@metamask/controller-utils` package has been updated to v3.4. This package had previously been held back because v3.1.0 introduced a usage of the BigInt API, which was a compatibility issue. But that should no longer be a problem now that React Native has been upgraded. There were no breaking changes in this range of updates, but there were a few additions and rearrangements that required substantial patch updates. This change was done to simplify PR #6872, which is part of https://github.com/MetaMask/mobile-planning/issues/798 --- package.json | 3 +- .../@metamask+controller-utils+3.0.0.patch | 64 -------- .../@metamask+controller-utils+3.4.0.patch | 152 ++++++++++++++++++ yarn.lock | 69 +++++++- 4 files changed, 219 insertions(+), 69 deletions(-) delete mode 100644 patches/@metamask+controller-utils+3.0.0.patch create mode 100644 patches/@metamask+controller-utils+3.4.0.patch diff --git a/package.json b/package.json index 22bf994ce51..6776ec3f384 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,6 @@ "react-native-level-fs/**/bl": "^1.2.3", "react-native-level-fs/**/semver": "^4.3.2", "@metamask/contract-metadata": "^2.1.0", - "@metamask/controller-utils": "~3.0.0", "@metamask/approval-controller": "3.4.0", "@exodus/react-native-payments/validator": "^13.7.0", "react-devtools-core": "4.22.1", @@ -158,7 +157,7 @@ "@metamask/base-controller": "^2.0.0", "@metamask/composable-controller": "^2.0.0", "@metamask/contract-metadata": "^2.1.0", - "@metamask/controller-utils": "~3.0.0", + "@metamask/controller-utils": "^3.4.0", "@metamask/design-tokens": "^1.11.1", "@metamask/eth-sig-util": "^4.0.1", "@metamask/etherscan-link": "^2.0.0", diff --git a/patches/@metamask+controller-utils+3.0.0.patch b/patches/@metamask+controller-utils+3.0.0.patch deleted file mode 100644 index 248b0978396..00000000000 --- a/patches/@metamask+controller-utils+3.0.0.patch +++ /dev/null @@ -1,64 +0,0 @@ -diff --git a/node_modules/@metamask/controller-utils/dist/constants.d.ts b/node_modules/@metamask/controller-utils/dist/constants.d.ts -index 8517c15..e96b439 100644 ---- a/node_modules/@metamask/controller-utils/dist/constants.d.ts -+++ b/node_modules/@metamask/controller-utils/dist/constants.d.ts -@@ -23,6 +23,7 @@ export declare const ASSET_TYPES: { - export declare const TESTNET_TICKER_SYMBOLS: { - GOERLI: string; - SEPOLIA: string; -+ LINEA_GOERLI: string; - }; - export declare const TESTNET_NETWORK_TYPE_TO_TICKER_SYMBOL: { - [K in NetworkType]: string; -diff --git a/node_modules/@metamask/controller-utils/dist/constants.js b/node_modules/@metamask/controller-utils/dist/constants.js -index e77af58..0ffbafb 100644 ---- a/node_modules/@metamask/controller-utils/dist/constants.js -+++ b/node_modules/@metamask/controller-utils/dist/constants.js -@@ -31,12 +31,15 @@ exports.ASSET_TYPES = { - exports.TESTNET_TICKER_SYMBOLS = { - GOERLI: 'GoerliETH', - SEPOLIA: 'SepoliaETH', -+ LINEA_GOERLI: 'LineaETH', - }; - // TYPED NetworkType TICKER SYMBOLS - exports.TESTNET_NETWORK_TYPE_TO_TICKER_SYMBOL = { - goerli: 'GoerliETH', - sepolia: 'SepoliaETH', -+ 'linea-goerli': 'LineaETH', - mainnet: '', -+ 'linea-mainnet': '', - rpc: '', - localhost: '', - }; -diff --git a/node_modules/@metamask/controller-utils/dist/types.d.ts b/node_modules/@metamask/controller-utils/dist/types.d.ts -index 4403885..5f52027 100644 ---- a/node_modules/@metamask/controller-utils/dist/types.d.ts -+++ b/node_modules/@metamask/controller-utils/dist/types.d.ts -@@ -1,11 +1,13 @@ - /** - * Human-readable network name - */ --export declare type NetworkType = 'localhost' | 'mainnet' | 'goerli' | 'sepolia' | 'rpc'; -+export declare type NetworkType = 'localhost' | 'mainnet' | 'goerli' | 'sepolia' | 'linea-goerli' | 'linea-mainnet' | 'rpc'; - export declare enum NetworksChainId { - mainnet = "1", - goerli = "5", - sepolia = "11155111", -+ "linea-goerli" = "59140", -+ "linea-mainnet" = "59144", - localhost = "", - rpc = "" - } -diff --git a/node_modules/@metamask/controller-utils/dist/types.js b/node_modules/@metamask/controller-utils/dist/types.js -index ea81681..a5135ca 100644 ---- a/node_modules/@metamask/controller-utils/dist/types.js -+++ b/node_modules/@metamask/controller-utils/dist/types.js -@@ -6,6 +6,8 @@ var NetworksChainId; - NetworksChainId["mainnet"] = "1"; - NetworksChainId["goerli"] = "5"; - NetworksChainId["sepolia"] = "11155111"; -+ NetworksChainId["linea-goerli"] = "59140"; -+ NetworksChainId["linea-mainnet"] = "59144"; - NetworksChainId["localhost"] = ""; - NetworksChainId["rpc"] = ""; - })(NetworksChainId = exports.NetworksChainId || (exports.NetworksChainId = {})); diff --git a/patches/@metamask+controller-utils+3.4.0.patch b/patches/@metamask+controller-utils+3.4.0.patch new file mode 100644 index 00000000000..85e1df96817 --- /dev/null +++ b/patches/@metamask+controller-utils+3.4.0.patch @@ -0,0 +1,152 @@ +diff --git a/node_modules/@metamask/controller-utils/dist/constants.d.ts b/node_modules/@metamask/controller-utils/dist/constants.d.ts +index c8e8769..a78401d 100644 +--- a/node_modules/@metamask/controller-utils/dist/constants.d.ts ++++ b/node_modules/@metamask/controller-utils/dist/constants.d.ts +@@ -27,6 +27,7 @@ export declare const ASSET_TYPES: { + export declare const TESTNET_TICKER_SYMBOLS: { + GOERLI: string; + SEPOLIA: string; ++ LINEA_GOERLI: string; + }; + /** + * Map of all build-in Infura networks to their network, ticker and chain IDs. +@@ -53,6 +54,20 @@ export declare const BUILT_IN_NETWORKS: { + readonly blockExplorerUrl: "https://etherscan.io"; + }; + }; ++ readonly "linea-goerli": { ++ readonly chainId: NetworksChainId["linea-goerli"]; ++ readonly ticker: NetworksTicker["linea-goerli"]; ++ readonly rpcPrefs: { ++ readonly blockExplorerUrl: "https://explorer.goerli.linea.build"; ++ }; ++ }; ++ readonly "linea-mainnet": { ++ readonly chainId: NetworksChainId["linea-mainnet"]; ++ readonly ticker: NetworksTicker["linea-mainnet"]; ++ readonly rpcPrefs: { ++ readonly blockExplorerUrl: "https://lineascan.build"; ++ }; ++ }; + readonly localhost: { + readonly chainId: NetworksChainId.localhost; + readonly blockExplorerUrl: undefined; +diff --git a/node_modules/@metamask/controller-utils/dist/constants.js b/node_modules/@metamask/controller-utils/dist/constants.js +index 7bef0e7..07e2249 100644 +--- a/node_modules/@metamask/controller-utils/dist/constants.js ++++ b/node_modules/@metamask/controller-utils/dist/constants.js +@@ -36,6 +36,7 @@ exports.ASSET_TYPES = { + exports.TESTNET_TICKER_SYMBOLS = { + GOERLI: 'GoerliETH', + SEPOLIA: 'SepoliaETH', ++ LINEA_GOERLI: 'LineaETH' + }; + /** + * Map of all build-in Infura networks to their network, ticker and chain IDs. +@@ -62,6 +63,20 @@ exports.BUILT_IN_NETWORKS = { + blockExplorerUrl: 'https://etherscan.io', + }, + }, ++ [types_1.NetworkType["linea-goerli"]]: { ++ chainId: types_1.NetworksChainId["linea-goerli"], ++ ticker: types_1.NetworksTicker["linea-goerli"], ++ rpcPrefs: { ++ blockExplorerUrl: 'https://explorer.goerli.linea.build', ++ }, ++ }, ++ [types_1.NetworkType["linea-mainnet"]]: { ++ chainId: types_1.NetworksChainId["linea-mainnet"], ++ ticker: types_1.NetworksTicker["linea-mainnet"], ++ rpcPrefs: { ++ blockExplorerUrl: 'https://lineascan.build', ++ }, ++ }, + [types_1.NetworkType.localhost]: { + chainId: types_1.NetworksChainId.localhost, + blockExplorerUrl: undefined, +@@ -107,5 +122,7 @@ exports.NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP = { + [types_1.NetworkId.goerli]: types_1.NetworkType.goerli, + [types_1.NetworkId.sepolia]: types_1.NetworkType.sepolia, + [types_1.NetworkId.mainnet]: types_1.NetworkType.mainnet, ++ [types_1.NetworkId["linea-goerli"]]: types_1.NetworkType["linea-goerli"], ++ [types_1.NetworkId["linea-mainnet"]]: types_1.NetworkType["linea-mainnet"], + }; + //# sourceMappingURL=constants.js.map +diff --git a/node_modules/@metamask/controller-utils/dist/types.d.ts b/node_modules/@metamask/controller-utils/dist/types.d.ts +index 014dbb9..1d6189b 100644 +--- a/node_modules/@metamask/controller-utils/dist/types.d.ts ++++ b/node_modules/@metamask/controller-utils/dist/types.d.ts +@@ -6,6 +6,8 @@ export declare enum NetworkType { + mainnet = "mainnet", + goerli = "goerli", + sepolia = "sepolia", ++ "linea-goerli" = 'linea-goerli', ++ "linea-mainnet" = 'linea-mainnet', + rpc = "rpc" + } + /** +@@ -19,18 +21,24 @@ export declare enum NetworksChainId { + mainnet = "1", + goerli = "5", + sepolia = "11155111", ++ "linea-goerli" = "59140", ++ "linea-mainnet" = "59144", + localhost = "", + rpc = "" + } + export declare enum NetworkId { + mainnet = "1", + goerli = "5", +- sepolia = "11155111" ++ sepolia = "11155111", ++ "linea-goerli" = "59140", ++ "linea-mainnet" = "59144" + } + export declare enum NetworksTicker { + mainnet = "ETH", + goerli = "GoerliETH", + sepolia = "SepoliaETH", ++ "linea-goerli" = 'LineaETH', ++ "linea-mainnet" = 'ETH', + localhost = "", + rpc = "" + } +diff --git a/node_modules/@metamask/controller-utils/dist/types.js b/node_modules/@metamask/controller-utils/dist/types.js +index 398c77b..604bda1 100644 +--- a/node_modules/@metamask/controller-utils/dist/types.js ++++ b/node_modules/@metamask/controller-utils/dist/types.js +@@ -10,6 +10,8 @@ var NetworkType; + NetworkType["mainnet"] = "mainnet"; + NetworkType["goerli"] = "goerli"; + NetworkType["sepolia"] = "sepolia"; ++ NetworkType["linea-goerli"] = "linea-goerli"; ++ NetworkType["linea-mainnet"] = "linea-mainnet"; + NetworkType["rpc"] = "rpc"; + })(NetworkType = exports.NetworkType || (exports.NetworkType = {})); + /** +@@ -27,6 +29,8 @@ var NetworksChainId; + NetworksChainId["mainnet"] = "1"; + NetworksChainId["goerli"] = "5"; + NetworksChainId["sepolia"] = "11155111"; ++ NetworksChainId["linea-goerli"] = "59140"; ++ NetworksChainId["linea-mainnet"] = "59144"; + NetworksChainId["localhost"] = ""; + NetworksChainId["rpc"] = ""; + })(NetworksChainId = exports.NetworksChainId || (exports.NetworksChainId = {})); +@@ -35,12 +39,16 @@ var NetworkId; + NetworkId["mainnet"] = "1"; + NetworkId["goerli"] = "5"; + NetworkId["sepolia"] = "11155111"; ++ NetworkId["linea-goerli"] = "59140"; ++ NetworkId["linea-mainnet"] = "59144"; + })(NetworkId = exports.NetworkId || (exports.NetworkId = {})); + var NetworksTicker; + (function (NetworksTicker) { + NetworksTicker["mainnet"] = "ETH"; + NetworksTicker["goerli"] = "GoerliETH"; + NetworksTicker["sepolia"] = "SepoliaETH"; ++ NetworksTicker["linea-goerli"] = "LineaETH"; ++ NetworksTicker["linea-mainnet"] = "ETH"; + NetworksTicker["localhost"] = ""; + NetworksTicker["rpc"] = ""; + })(NetworksTicker = exports.NetworksTicker || (exports.NetworksTicker = {})); diff --git a/yarn.lock b/yarn.lock index 129c6d78a63..974ed49f5e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5299,7 +5299,19 @@ resolved "https://registry.yarnpkg.com/@metamask/contract-metadata/-/contract-metadata-2.2.0.tgz#277764d0d56e37180ae7644a9d11eb96295b36fc" integrity sha512-SM6A4C7vXNbVpgMTX67kfW8QWvu3eSXxMZlY5PqZBTkvri1s9zgQ0uwRkK5r2VXNEoVmXCDnnEX/tX5EzzgNUQ== -"@metamask/controller-utils@^1.0.0", "@metamask/controller-utils@^3.0.0", "@metamask/controller-utils@^3.4.0", "@metamask/controller-utils@^4.0.1", "@metamask/controller-utils@~3.0.0": +"@metamask/controller-utils@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@metamask/controller-utils/-/controller-utils-1.0.0.tgz#2e2261b65c3f38ba0c5b893743fca8cce764339c" + integrity sha512-LXIpnmF/C5/vCBX0u2DiUWA55utZy54guUV+A8qUYmz8PvZrXfK7mdq1zlk8z0aq+aO0rHHfSVbTNacEE3TlAQ== + dependencies: + eth-ens-namehash "^2.0.8" + eth-rpc-errors "^4.0.0" + ethereumjs-util "^7.0.10" + ethjs-unit "^0.1.6" + fast-deep-equal "^3.1.3" + isomorphic-fetch "^3.0.0" + +"@metamask/controller-utils@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@metamask/controller-utils/-/controller-utils-3.0.0.tgz#e0984cdab14280409297671b5858891527c5e4ee" integrity sha512-JjFWBZnnh5DSX2tRsw5xtXxaqVkTzaW7mkSZ+lL3LoCAw47Cf8zGP1kGR6VKxcceKi+MpEFvZr7gf1OFnOoEjw== @@ -5310,6 +5322,33 @@ ethjs-unit "^0.1.6" fast-deep-equal "^3.1.3" +"@metamask/controller-utils@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@metamask/controller-utils/-/controller-utils-3.4.0.tgz#3714799a3e2648cd758272612578238749e3e11b" + integrity sha512-/++y7qXUd9+aRzOklypfzmehO87QVKndlJXsbLRk36W5L5DJo4lrR2pd/IBbwbWEhFJWHhlfbMD+T+gEBvIftw== + dependencies: + "@metamask/utils" "^5.0.1" + "@spruceid/siwe-parser" "1.1.3" + eth-ens-namehash "^2.0.8" + eth-rpc-errors "^4.0.2" + ethereumjs-util "^7.0.10" + ethjs-unit "^0.1.6" + fast-deep-equal "^3.1.3" + +"@metamask/controller-utils@^4.0.1": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@metamask/controller-utils/-/controller-utils-4.3.0.tgz#63d6fef8ddbdf42ed0b94a0cf929d1898832004c" + integrity sha512-WVbapIpjEJtKxZz/1w5DctnZ0h7V3OWu0X46MHEmV8Brna/nN8x6UZ4zySLD9tZGFaO7p3vxJpl7/EK8nSvf9A== + dependencies: + "@metamask/utils" "^6.2.0" + "@spruceid/siwe-parser" "1.1.3" + eth-ens-namehash "^2.0.8" + eth-query "^2.1.2" + eth-rpc-errors "^4.0.2" + ethereumjs-util "^7.0.10" + ethjs-unit "^0.1.6" + fast-deep-equal "^3.1.3" + "@metamask/controllers@^26.0.0": version "26.0.0" resolved "git+https://github.com/MetaMask/controllers.git#d4e9507d9612f2d36c3f848333b33330a19b811b" @@ -5607,7 +5646,7 @@ semver "^7.3.8" superstruct "^1.0.3" -"@metamask/utils@^5.0.2": +"@metamask/utils@^5.0.1", "@metamask/utils@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== @@ -5618,6 +5657,18 @@ semver "^7.3.8" superstruct "^1.0.3" +"@metamask/utils@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-6.2.0.tgz#7e63ad2db33117df6fef89449db3a86dcd6b42b5" + integrity sha512-nM5CujDd4STfwx4ic/gim9G1W9oZcWUGKN4WbAT4waEkqNSIluVmZeHgxUKvdajZ7iCFDnjDLajkD4sP7c/ClQ== + dependencies: + "@ethereumjs/tx" "^4.1.2" + "@noble/hashes" "^1.3.1" + "@types/debug" "^4.1.7" + debug "^4.3.4" + semver "^7.3.8" + superstruct "^1.0.3" + "@ngraveio/bc-ur@^1.1.5", "@ngraveio/bc-ur@^1.1.6": version "1.1.6" resolved "https://registry.yarnpkg.com/@ngraveio/bc-ur/-/bc-ur-1.1.6.tgz#8f8c75fff22f6a5e4dfbc5a6b540d7fe8f42cd39" @@ -5648,7 +5699,7 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== -"@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0": +"@noble/hashes@^1.3.0", "@noble/hashes@^1.3.1", "@noble/hashes@~1.3.0": version "1.3.1" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== @@ -6387,6 +6438,13 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== +"@spruceid/siwe-parser@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@spruceid/siwe-parser/-/siwe-parser-1.1.3.tgz#0eebe8bbd63c6de89cb44c06b6329b00b305df65" + integrity sha512-oQ8PcwDqjGWJvLmvAF2yzd6iniiWxK0Qtz+Dw+gLD/W5zOQJiKIUXwslHOm8VB8OOOKW9vfR3dnPBhHaZDvRsw== + dependencies: + apg-js "^4.1.1" + "@stablelib/aead@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" @@ -9130,6 +9188,11 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +apg-js@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/apg-js/-/apg-js-4.1.3.tgz#0cb9dc99f8830740d7a8f9fc0048fa618ae4d199" + integrity sha512-XYyDcoBho8OpnWPRnedMwyL+76ovCtsESerHZEfY39dO4IrEqN97mdEYkOyHa0XTX5+3+U5FmpqPLttK0f7n6g== + appdirsjs@^1.2.4: version "1.2.6" resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.6.tgz#fccf9ee543315492867cacfcfd4a2b32257d30ac" From 19e52f7a271a1acee2bbccd2592e48821acd5c5c Mon Sep 17 00:00:00 2001 From: sethkfman <10342624+sethkfman@users.noreply.github.com> Date: Tue, 25 Jul 2023 10:28:57 -0600 Subject: [PATCH 06/20] fix: Android filename validation when downloading from browser (#6844) * added filename validation and Toast when validation fails during downloading * Added null check with fileName --- patches/react-native-webview+11.13.0.patch | 137 +++++++++++---------- 1 file changed, 72 insertions(+), 65 deletions(-) diff --git a/patches/react-native-webview+11.13.0.patch b/patches/react-native-webview+11.13.0.patch index 28d02a5346d..311d1734e94 100644 --- a/patches/react-native-webview+11.13.0.patch +++ b/patches/react-native-webview+11.13.0.patch @@ -83,7 +83,7 @@ index 0000000..f4a6af9 + } +} diff --git a/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java b/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java -index f743bbc..a612d0f 100644 +index f743bbc..ede5475 100644 --- a/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java +++ b/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java @@ -5,6 +5,7 @@ import android.annotation.TargetApi; @@ -128,7 +128,7 @@ index f743bbc..a612d0f 100644 import android.widget.FrameLayout; import androidx.annotation.Nullable; -@@ -88,18 +96,51 @@ import com.reactnativecommunity.webview.events.TopRenderProcessGoneEvent; +@@ -88,18 +96,54 @@ import com.reactnativecommunity.webview.events.TopRenderProcessGoneEvent; import org.json.JSONException; import org.json.JSONObject; @@ -148,6 +148,7 @@ index f743bbc..a612d0f 100644 +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.charset.UnsupportedCharsetException; ++import java.text.Bidi; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; @@ -174,13 +175,15 @@ index f743bbc..a612d0f 100644 + +import android.content.DialogInterface; +import android.os.Bundle; ++import android.widget.Toast; ++ +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + /** * Manages instances of {@link WebView} *

-@@ -137,13 +178,19 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -137,13 +181,19 @@ public class RNCWebViewManager extends SimpleViewManager { public static final int COMMAND_LOAD_URL = 7; public static final int COMMAND_FOCUS = 8; @@ -201,7 +204,7 @@ index f743bbc..a612d0f 100644 protected static final String HTML_MIME_TYPE = "text/html"; protected static final String JAVASCRIPT_INTERFACE = "ReactNativeWebView"; protected static final String HTTP_METHOD_POST = "POST"; -@@ -155,13 +202,19 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -155,13 +205,19 @@ public class RNCWebViewManager extends SimpleViewManager { protected RNCWebChromeClient mWebChromeClient = null; protected boolean mAllowsFullscreenVideo = false; @@ -226,7 +229,7 @@ index f743bbc..a612d0f 100644 }; } -@@ -182,6 +235,7 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -182,6 +238,7 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.LOLLIPOP) protected WebView createViewInstance(ThemedReactContext reactContext) { RNCWebView webView = createRNCWebViewInstance(reactContext); @@ -234,7 +237,7 @@ index f743bbc..a612d0f 100644 setupWebChromeClient(reactContext, webView); reactContext.addLifecycleEventListener(webView); mWebViewConfig.configWebView(webView); -@@ -209,47 +263,156 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -209,47 +266,161 @@ public class RNCWebViewManager extends SimpleViewManager { } webView.setDownloadListener(new DownloadListener() { @@ -250,24 +253,28 @@ index f743bbc..a612d0f 100644 - String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); - String downloadMessage = "Downloading " + fileName; -+ AlertDialog.Builder builder = new AlertDialog.Builder(mReactContext); -+ builder.setMessage("Do you want to download \n" + fileName + "?"); -+ builder.setCancelable(false); -+ builder.setPositiveButton("Download", new DialogInterface.OnClickListener() { -+ public void onClick(DialogInterface dialog, int which) { -+ String downloadMessage = "Downloading " + fileName; -+ -+ //Attempt to add cookie, if it exists -+ URL urlObj = null; -+ try { -+ urlObj = new URL(url); -+ String baseUrl = urlObj.getProtocol() + "://" + urlObj.getHost(); -+ String cookie = CookieManager.getInstance().getCookie(baseUrl); -+ request.addRequestHeader("Cookie", cookie); -+ } catch (MalformedURLException e) { -+ System.out.println("Error getting cookie for DownloadManager: " + e.toString()); -+ e.printStackTrace(); -+ } ++ //Filename validation checking for files that use RTL characters and do not allow those types ++ if(fileName == null || (fileName != null && (new Bidi(fileName, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT).isMixed()))) { ++ Toast.makeText(mReactContext, "Invalid filename or type", Toast.LENGTH_SHORT).show(); ++ } else { ++ AlertDialog.Builder builder = new AlertDialog.Builder(mReactContext); ++ builder.setMessage("Do you want to download \n" + fileName + "?"); ++ builder.setCancelable(false); ++ builder.setPositiveButton("Download", new DialogInterface.OnClickListener() { ++ public void onClick(DialogInterface dialog, int which) { ++ String downloadMessage = "Downloading " + fileName; ++ ++ //Attempt to add cookie, if it exists ++ URL urlObj = null; ++ try { ++ urlObj = new URL(url); ++ String baseUrl = urlObj.getProtocol() + "://" + urlObj.getHost(); ++ String cookie = CookieManager.getInstance().getCookie(baseUrl); ++ request.addRequestHeader("Cookie", cookie); ++ } catch (MalformedURLException e) { ++ System.out.println("Error getting cookie for DownloadManager: " + e.toString()); ++ e.printStackTrace(); ++ } - //Attempt to add cookie, if it exists - URL urlObj = null; @@ -279,25 +286,25 @@ index f743bbc..a612d0f 100644 - } catch (MalformedURLException e) { - System.out.println("Error getting cookie for DownloadManager: " + e.toString()); - e.printStackTrace(); -- } -+ //Finish setting up request -+ request.addRequestHeader("User-Agent", userAgent); -+ request.setTitle(fileName); -+ request.setDescription(downloadMessage); -+ request.allowScanningByMediaScanner(); -+ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); -+ request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); -+ module.setDownloadRequest(request); -+ if (module.grantFileDownloaderPermissions()) { -+ module.downloadFile(); ++ //Finish setting up request ++ request.addRequestHeader("User-Agent", userAgent); ++ request.setTitle(fileName); ++ request.setDescription(downloadMessage); ++ request.allowScanningByMediaScanner(); ++ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); ++ request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); ++ module.setDownloadRequest(request); ++ if (module.grantFileDownloaderPermissions()) { ++ module.downloadFile(); ++ } + } -+ } -+ }); -+ builder.setNegativeButton("Cancel", (DialogInterface.OnClickListener) (dialog, which) -> { -+ return; -+ }); -+ AlertDialog alertDialog = builder.create(); -+ alertDialog.show(); ++ }); ++ builder.setNegativeButton("Cancel", (DialogInterface.OnClickListener) (dialog, which) -> { ++ return; ++ }); ++ AlertDialog alertDialog = builder.create(); ++ alertDialog.show(); + } + } + }); @@ -417,7 +424,7 @@ index f743bbc..a612d0f 100644 @ReactProp(name = "javaScriptEnabled") public void setJavaScriptEnabled(WebView view, boolean enabled) { view.getSettings().setJavaScriptEnabled(enabled); -@@ -285,13 +448,10 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -285,13 +456,10 @@ public class RNCWebViewManager extends SimpleViewManager { if (enabled) { Context ctx = view.getContext(); if (ctx != null) { @@ -431,7 +438,7 @@ index f743bbc..a612d0f 100644 } } -@@ -327,12 +487,12 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -327,12 +495,12 @@ public class RNCWebViewManager extends SimpleViewManager { public void setLayerType(WebView view, String layerTypeString) { int layerType = View.LAYER_TYPE_NONE; switch (layerTypeString) { @@ -450,7 +457,7 @@ index f743bbc..a612d0f 100644 } view.setLayerType(layerType, null); } -@@ -387,9 +547,9 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -387,9 +555,9 @@ public class RNCWebViewManager extends SimpleViewManager { @ReactProp(name = "userAgent") public void setUserAgent(WebView view, @Nullable String userAgent) { if (userAgent != null) { @@ -462,7 +469,7 @@ index f743bbc..a612d0f 100644 } this.setUserAgentString(view); } -@@ -399,19 +559,19 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -399,19 +567,19 @@ public class RNCWebViewManager extends SimpleViewManager { if(applicationName != null) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { String defaultUserAgent = WebSettings.getDefaultUserAgent(view.getContext()); @@ -488,7 +495,7 @@ index f743bbc..a612d0f 100644 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // handle unsets of `userAgent` prop as long as device is >= API 17 view.getSettings().setUserAgentString(WebSettings.getDefaultUserAgent(view.getContext())); -@@ -490,7 +650,6 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -490,7 +658,6 @@ public class RNCWebViewManager extends SimpleViewManager { // Disable caching view.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); @@ -496,7 +503,7 @@ index f743bbc..a612d0f 100644 view.clearHistory(); view.clearCache(true); -@@ -842,13 +1001,116 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -842,13 +1009,116 @@ public class RNCWebViewManager extends SimpleViewManager { } } @@ -614,7 +621,7 @@ index f743bbc..a612d0f 100644 public void setIgnoreErrFailedForThisURL(@Nullable String url) { ignoreErrFailedForThisURL = url; -@@ -857,24 +1119,26 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -857,24 +1127,26 @@ public class RNCWebViewManager extends SimpleViewManager { @Override public void onPageFinished(WebView webView, String url) { super.onPageFinished(webView, url); @@ -646,7 +653,7 @@ index f743bbc..a612d0f 100644 ((RNCWebView) webView).dispatchEvent( webView, new TopLoadingStartEvent( -@@ -882,6 +1146,20 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -882,6 +1154,20 @@ public class RNCWebViewManager extends SimpleViewManager { createWebViewEvent(webView, url))); } @@ -667,7 +674,7 @@ index f743bbc..a612d0f 100644 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { final RNCWebView rncWebView = (RNCWebView) view; -@@ -891,7 +1169,6 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -891,7 +1177,6 @@ public class RNCWebViewManager extends SimpleViewManager { final Pair> lock = RNCWebViewModule.shouldOverrideUrlLoadingLock.getNewLock(); final int lockIdentifier = lock.first; final AtomicReference lockObject = lock.second; @@ -675,7 +682,7 @@ index f743bbc..a612d0f 100644 final WritableMap event = createWebViewEvent(view, url); event.putInt("lockIdentifier", lockIdentifier); rncWebView.sendDirectMessage("onShouldStartLoadWithRequest", event); -@@ -919,6 +1196,17 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -919,6 +1204,17 @@ public class RNCWebViewManager extends SimpleViewManager { RNCWebViewModule.shouldOverrideUrlLoadingLock.removeLock(lockIdentifier); return shouldOverride; @@ -693,7 +700,7 @@ index f743bbc..a612d0f 100644 } else { FLog.w(TAG, "Couldn't use blocking synchronous call for onShouldStartLoadWithRequest due to debugging or missing Catalyst instance, falling back to old event-and-load."); progressChangedFilter.setWaitingForCommandLoadUrl(true); -@@ -934,67 +1222,86 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -934,67 +1230,86 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { @@ -832,7 +839,7 @@ index f743bbc..a612d0f 100644 } @Override -@@ -1005,9 +1312,9 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1005,9 +1320,9 @@ public class RNCWebViewManager extends SimpleViewManager { String failingUrl) { if (ignoreErrFailedForThisURL != null @@ -845,7 +852,7 @@ index f743bbc..a612d0f 100644 // This is a workaround for a bug in the WebView. // See these chromium issues for more context: -@@ -1056,36 +1363,36 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1056,36 +1371,36 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.O) @Override public boolean onRenderProcessGone(WebView webView, RenderProcessGoneDetail detail) { @@ -906,7 +913,7 @@ index f743bbc..a612d0f 100644 } protected void emitFinishEvent(WebView webView, String url) { -@@ -1138,6 +1445,7 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1138,6 +1453,7 @@ public class RNCWebViewManager extends SimpleViewManager { protected View mVideoView; protected WebChromeClient.CustomViewCallback mCustomViewCallback; @@ -914,7 +921,7 @@ index f743bbc..a612d0f 100644 /* * - Permissions - -@@ -1217,19 +1525,44 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1217,19 +1533,44 @@ public class RNCWebViewManager extends SimpleViewManager { ArrayList requestedAndroidPermissions = new ArrayList<>(); for (String requestedResource : request.getResources()) { String androidPermission = null; @@ -960,7 +967,7 @@ index f743bbc..a612d0f 100644 } else { requestedAndroidPermissions.add(androidPermission); } -@@ -1238,8 +1571,11 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1238,8 +1579,11 @@ public class RNCWebViewManager extends SimpleViewManager { // If all the permissions are already granted, send the response to the WebView synchronously if (requestedAndroidPermissions.isEmpty()) { @@ -974,7 +981,7 @@ index f743bbc..a612d0f 100644 return; } -@@ -1250,6 +1586,10 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1250,6 +1594,10 @@ public class RNCWebViewManager extends SimpleViewManager { requestPermissions(requestedAndroidPermissions); } @@ -985,7 +992,7 @@ index f743bbc..a612d0f 100644 @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { -@@ -1402,6 +1742,15 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1402,6 +1750,15 @@ public class RNCWebViewManager extends SimpleViewManager { } } @@ -1001,7 +1008,7 @@ index f743bbc..a612d0f 100644 @Override public void onHostPause() { } -@@ -1447,6 +1796,13 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1447,6 +1804,13 @@ public class RNCWebViewManager extends SimpleViewManager { protected boolean nestedScrollEnabled = false; protected ProgressChangedFilter progressChangedFilter; @@ -1015,7 +1022,7 @@ index f743bbc..a612d0f 100644 /** * WebView must be created with an context of the current activity *

-@@ -1475,6 +1831,42 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1475,6 +1839,42 @@ public class RNCWebViewManager extends SimpleViewManager { this.nestedScrollEnabled = nestedScrollEnabled; } @@ -1058,7 +1065,7 @@ index f743bbc..a612d0f 100644 @Override public void onHostResume() { // do nothing -@@ -1533,6 +1925,8 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1533,6 +1933,8 @@ public class RNCWebViewManager extends SimpleViewManager { } } @@ -1067,7 +1074,7 @@ index f743bbc..a612d0f 100644 public @Nullable RNCWebViewClient getRNCWebViewClient() { return mRNCWebViewClient; -@@ -1609,8 +2003,8 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1609,8 +2011,8 @@ public class RNCWebViewManager extends SimpleViewManager { public void callInjectedJavaScriptBeforeContentLoaded() { if (getSettings().getJavaScriptEnabled() && @@ -1078,7 +1085,7 @@ index f743bbc..a612d0f 100644 evaluateJavascriptWithFallback("(function() {\n" + injectedJSBeforeContentLoaded + ";\n})();"); } } -@@ -1672,16 +2066,16 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1672,16 +2074,16 @@ public class RNCWebViewManager extends SimpleViewManager { if (mOnScrollDispatchHelper.onScrollChanged(x, y)) { ScrollEvent event = ScrollEvent.obtain( From 1f2c4242d0d7c8b73520edeb1f905aee836ace1f Mon Sep 17 00:00:00 2001 From: OGPoyraz Date: Tue, 25 Jul 2023 18:54:31 +0200 Subject: [PATCH 07/20] refactor: accept SignController approval request from frontend (#6600) --- .../SignatureApproval/SignatureApproval.tsx | 9 +- .../SignatureApproval.test.tsx.snap | 10 +- app/components/UI/MessageSign/MessageSign.tsx | 198 +++++ .../__snapshots__/index.test.tsx.snap | 12 +- app/components/UI/MessageSign/index.js | 251 ------ app/components/UI/MessageSign/index.test.tsx | 58 +- app/components/UI/MessageSign/index.ts | 1 + .../UI/PersonalSign/PersonalSign.tsx | 63 +- .../__snapshots__/index.test.tsx.snap | 4 +- app/components/UI/PersonalSign/index.test.tsx | 48 +- app/components/UI/PersonalSign/types.ts | 2 +- .../UI/SignatureRequest/Root/Root.test.tsx | 5 + .../UI/SignatureRequest/Root/Root.tsx | 30 +- .../Root/__snapshots__/Root.test.tsx.snap | 2 - app/components/UI/SignatureRequest/index.js | 12 +- .../__snapshots__/index.test.tsx.snap | 4 +- app/components/UI/TypedSign/index.js | 130 +-- app/components/UI/TypedSign/index.test.tsx | 64 +- .../hooks/useApprovalRequest.test.ts | 1 + app/components/hooks/useApprovalRequest.ts | 22 +- app/core/Engine.ts | 26 +- .../RPCMethods/RPCMethodMiddleware.test.ts | 22 +- app/core/RPCMethods/RPCMethodMiddleware.ts | 139 +-- app/util/confirmation/signatureUtils.js | 86 ++ package.json | 4 +- ...ler++@metamask+message-manager+5.0.0.patch | 42 - ...ler++@metamask+message-manager+7.0.1.patch | 66 ++ ...@metamask+signature-controller+2.0.0.patch | 68 -- ...@metamask+signature-controller+4.0.1.patch | 226 +++++ yarn.lock | 801 ++++++------------ 30 files changed, 1181 insertions(+), 1225 deletions(-) create mode 100644 app/components/UI/MessageSign/MessageSign.tsx delete mode 100644 app/components/UI/MessageSign/index.js create mode 100644 app/components/UI/MessageSign/index.ts create mode 100644 app/util/confirmation/signatureUtils.js delete mode 100644 patches/@metamask+signature-controller++@metamask+message-manager+5.0.0.patch create mode 100644 patches/@metamask+signature-controller++@metamask+message-manager+7.0.1.patch delete mode 100644 patches/@metamask+signature-controller+2.0.0.patch create mode 100644 patches/@metamask+signature-controller+4.0.1.patch diff --git a/app/components/Approvals/SignatureApproval/SignatureApproval.tsx b/app/components/Approvals/SignatureApproval/SignatureApproval.tsx index a72537869df..318cb08e432 100644 --- a/app/components/Approvals/SignatureApproval/SignatureApproval.tsx +++ b/app/components/Approvals/SignatureApproval/SignatureApproval.tsx @@ -4,9 +4,11 @@ import { ApprovalTypes } from '../../../core/RPCMethods/RPCMethodMiddleware'; import SignatureRequestRoot from '../../UI/SignatureRequest/Root'; const SignatureApproval = () => { - const { approvalRequest } = useApprovalRequest(); + const { approvalRequest, onReject, onConfirm } = useApprovalRequest(); - const onSign = useCallback(() => undefined, []); + const onSignConfirm = useCallback(() => { + onConfirm({ waitForResult: true }); + }, [onConfirm]); const messageParams = approvalRequest && @@ -22,7 +24,8 @@ const SignatureApproval = () => { ); }; diff --git a/app/components/Approvals/SignatureApproval/__snapshots__/SignatureApproval.test.tsx.snap b/app/components/Approvals/SignatureApproval/__snapshots__/SignatureApproval.test.tsx.snap index 56958cba6b6..78b955c6b01 100644 --- a/app/components/Approvals/SignatureApproval/__snapshots__/SignatureApproval.test.tsx.snap +++ b/app/components/Approvals/SignatureApproval/__snapshots__/SignatureApproval.test.tsx.snap @@ -8,7 +8,7 @@ exports[`SignatureApproval populates message params if approval type is eth_sign "test": "value", } } - onSign={[Function]} + onSignConfirm={[Function]} /> `; @@ -20,7 +20,7 @@ exports[`SignatureApproval populates message params if approval type is eth_sign "test": "value", } } - onSign={[Function]} + onSignConfirm={[Function]} /> `; @@ -32,19 +32,19 @@ exports[`SignatureApproval populates message params if approval type is personal "test": "value", } } - onSign={[Function]} + onSignConfirm={[Function]} /> `; exports[`SignatureApproval provides no message params if incorrect approval request type 1`] = ` `; exports[`SignatureApproval provides no message params if no approval request 1`] = ` `; diff --git a/app/components/UI/MessageSign/MessageSign.tsx b/app/components/UI/MessageSign/MessageSign.tsx new file mode 100644 index 00000000000..7ba7ad8e22f --- /dev/null +++ b/app/components/UI/MessageSign/MessageSign.tsx @@ -0,0 +1,198 @@ +import React, { PureComponent } from 'react'; +import { StyleSheet, View, Text } from 'react-native'; +import { fontStyles } from '../../../styles/common'; +import SignatureRequest from '../SignatureRequest'; +import ExpandedMessage from '../SignatureRequest/ExpandedMessage'; +import { KEYSTONE_TX_CANCELED } from '../../../constants/error'; +import { MetaMetricsEvents } from '../../../core/Analytics'; +import AnalyticsV2 from '../../../util/analyticsV2'; +import { ThemeContext, mockTheme } from '../../../util/theme'; +import { + addSignatureErrorListener, + getAnalyticsParams, + handleSignatureAction, + removeSignatureErrorListener, +} from '../../../util/confirmation/signatureUtils'; +import { MessageParams, PageMeta } from '../SignatureRequest/types'; +import { Colors } from '../../../util/theme/models'; + +interface MessageSignProps { + /** + * react-navigation object used for switching between screens + */ + navigation: any; + /** + * Callback triggered when this message signature is rejected + */ + onReject: () => void; + /** + * Callback triggered when this message signature is approved + */ + onConfirm: () => void; + /** + * Message to be displayed to the user + */ + messageParams: MessageParams; + /** + * Object containing current page title and url + */ + currentPageInformation: PageMeta; + /** + * Hides or shows the expanded signing message + */ + toggleExpandedMessage: () => void; + /** + * Indicated whether or not the expanded message is shown + */ + showExpandedMessage: boolean; +} + +interface MessageSignState { + truncateMessage: boolean; +} + +const createStyles = (colors: Colors) => + StyleSheet.create({ + expandedMessage: { + textAlign: 'center', + ...fontStyles.normal, + fontSize: 14, + color: colors.text.default, + }, + messageText: { + color: colors.text.default, + }, + messageWrapper: { + marginBottom: 4, + }, + }); + +/** + * Component that supports eth_sign + */ +class MessageSign extends PureComponent { + static contextType = ThemeContext; + + state: MessageSignState = { + truncateMessage: false, + }; + + componentDidMount = () => { + const { + messageParams: { metamaskId }, + } = this.props; + AnalyticsV2.trackEvent( + MetaMetricsEvents.SIGN_REQUEST_STARTED, + getAnalyticsParams(), + ); + addSignatureErrorListener(metamaskId, this.onSignatureError); + }; + + componentWillUnmount = () => { + const { + messageParams: { metamaskId }, + } = this.props; + removeSignatureErrorListener(metamaskId, this.onSignatureError); + }; + + onSignatureError = ({ error }: any) => { + if (error?.message.startsWith(KEYSTONE_TX_CANCELED)) { + AnalyticsV2.trackEvent( + MetaMetricsEvents.QR_HARDWARE_TRANSACTION_CANCELED, + getAnalyticsParams(), + ); + } + }; + + rejectSignature = async () => { + const { messageParams, onReject } = this.props; + await handleSignatureAction(onReject, messageParams, 'eth', false); + }; + + confirmSignature = async () => { + const { messageParams, onConfirm } = this.props; + await handleSignatureAction(onConfirm, messageParams, 'eth', true); + }; + + getStyles = () => { + const colors = this.context.colors || mockTheme.colors; + return createStyles(colors); + }; + + renderMessageText = () => { + const { messageParams, showExpandedMessage } = this.props; + const { truncateMessage } = this.state; + const styles = this.getStyles(); + + let messageText; + if (showExpandedMessage) { + messageText = ( + {messageParams.data} + ); + } else { + messageText = truncateMessage ? ( + + {messageParams.data} + + ) : ( + + {messageParams.data} + + ); + } + return messageText; + }; + + shouldTruncateMessage = (e: any) => { + if (e.nativeEvent.lines.length > 5) { + this.setState({ truncateMessage: true }); + return; + } + this.setState({ truncateMessage: false }); + }; + + render() { + const { + currentPageInformation, + navigation, + showExpandedMessage, + toggleExpandedMessage, + messageParams: { from }, + } = this.props; + const styles = this.getStyles(); + + const rootView = showExpandedMessage ? ( + + ) : ( + + {this.renderMessageText()} + + ); + return rootView; + } +} + +export default MessageSign; diff --git a/app/components/UI/MessageSign/__snapshots__/index.test.tsx.snap b/app/components/UI/MessageSign/__snapshots__/index.test.tsx.snap index 067efe71f2c..88e3afd42e9 100644 --- a/app/components/UI/MessageSign/__snapshots__/index.test.tsx.snap +++ b/app/components/UI/MessageSign/__snapshots__/index.test.tsx.snap @@ -11,11 +11,19 @@ exports[`MessageSign should render correctly 1`] = ` messageParams={ Object { "data": "message", + "from": "0x0", "metamaskId": "TestMessageId", "origin": "example.com", } } - onCancel={[Function]} - onConfirm={[Function]} + navigation={ + Object { + "navigate": [MockFunction], + } + } + onConfirm={[MockFunction]} + onReject={[MockFunction]} + showExpandedMessage={false} + toggleExpandedMessage={[MockFunction]} /> `; diff --git a/app/components/UI/MessageSign/index.js b/app/components/UI/MessageSign/index.js deleted file mode 100644 index 2f36d2ea993..00000000000 --- a/app/components/UI/MessageSign/index.js +++ /dev/null @@ -1,251 +0,0 @@ -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import { StyleSheet, View, Text, InteractionManager } from 'react-native'; -import { fontStyles } from '../../../styles/common'; -import Engine from '../../../core/Engine'; -import SignatureRequest from '../SignatureRequest'; -import ExpandedMessage from '../SignatureRequest/ExpandedMessage'; -import { KEYSTONE_TX_CANCELED } from '../../../constants/error'; -import NotificationManager from '../../../core/NotificationManager'; -import { strings } from '../../../../locales/i18n'; -import { WALLET_CONNECT_ORIGIN } from '../../../util/walletconnect'; -import URL from 'url-parse'; -import { MetaMetricsEvents } from '../../../core/Analytics'; -import AnalyticsV2 from '../../../util/analyticsV2'; - -import { getAddressAccountType } from '../../../util/address'; -import { ThemeContext, mockTheme } from '../../../util/theme'; -import AppConstants from '../../../core/AppConstants'; - -const createStyles = (colors) => - StyleSheet.create({ - expandedMessage: { - textAlign: 'center', - ...fontStyles.normal, - fontSize: 14, - color: colors.text.default, - }, - messageText: { - color: colors.text.default, - }, - messageWrapper: { - marginBottom: 4, - }, - }); - -/** - * Component that supports eth_sign - */ -class MessageSign extends PureComponent { - static propTypes = { - /** - * react-navigation object used for switching between screens - */ - navigation: PropTypes.object, - /** - * Callback triggered when this message signature is rejected - */ - onCancel: PropTypes.func, - /** - * Callback triggered when this message signature is approved - */ - onConfirm: PropTypes.func, - /** - * Personal message to be displayed to the user - */ - messageParams: PropTypes.object, - /** - * Object containing current page title and url - */ - currentPageInformation: PropTypes.object, - /** - * Hides or shows the expanded signing message - */ - toggleExpandedMessage: PropTypes.func, - /** - * Indicated whether or not the expanded message is shown - */ - showExpandedMessage: PropTypes.bool, - }; - - state = { - truncateMessage: false, - }; - - getAnalyticsParams = () => { - try { - const { - currentPageInformation, - messageParams: { from }, - } = this.props; - const { NetworkController } = Engine.context; - const { chainId } = NetworkController?.state?.providerConfig || {}; - const url = new URL(currentPageInformation?.url); - return { - account_type: getAddressAccountType(from), - dapp_host_name: url?.host, - dapp_url: currentPageInformation?.url, - chain_id: chainId, - sign_type: 'eth', - ...currentPageInformation?.analytics, - }; - } catch (error) { - return {}; - } - }; - - componentDidMount = () => { - AnalyticsV2.trackEvent( - MetaMetricsEvents.SIGN_REQUEST_STARTED, - this.getAnalyticsParams(), - ); - }; - - showWalletConnectNotification = ( - messageParams = {}, - confirmation = false, - ) => { - InteractionManager.runAfterInteractions(() => { - messageParams.origin && - (messageParams.origin.startsWith(WALLET_CONNECT_ORIGIN) || - messageParams.origin.startsWith( - AppConstants.MM_SDK.SDK_REMOTE_ORIGIN, - )) && - NotificationManager.showSimpleNotification({ - status: `simple_notification${!confirmation ? '_rejected' : ''}`, - duration: 5000, - title: confirmation - ? strings('notifications.wc_signed_title') - : strings('notifications.wc_signed_rejected_title'), - description: strings('notifications.wc_description'), - }); - }); - }; - - signMessage = async () => { - const { messageParams } = this.props; - const { SignatureController } = Engine.context; - await SignatureController.signMessage(messageParams); - this.showWalletConnectNotification(messageParams, true); - }; - - rejectMessage = async () => { - const { messageParams } = this.props; - const { SignatureController } = Engine.context; - const messageId = messageParams.metamaskId; - await SignatureController.cancelMessage(messageId); - this.showWalletConnectNotification(messageParams); - }; - - cancelSignature = () => { - this.rejectMessage(); - AnalyticsV2.trackEvent( - MetaMetricsEvents.SIGN_REQUEST_CANCELLED, - this.getAnalyticsParams(), - ); - this.props.onCancel(); - }; - - confirmSignature = async () => { - try { - await this.signMessage(); - AnalyticsV2.trackEvent( - MetaMetricsEvents.SIGN_REQUEST_COMPLETED, - this.getAnalyticsParams(), - ); - this.props.onConfirm(); - } catch (e) { - if (e?.message.startsWith(KEYSTONE_TX_CANCELED)) { - AnalyticsV2.trackEvent( - MetaMetricsEvents.QR_HARDWARE_TRANSACTION_CANCELED, - this.getAnalyticsParams(), - ); - this.props.onCancel(); - } - } - }; - - getStyles = () => { - const colors = this.context.colors || mockTheme.colors; - return createStyles(colors); - }; - - renderMessageText = () => { - const { messageParams, showExpandedMessage } = this.props; - const { truncateMessage } = this.state; - const styles = this.getStyles(); - - let messageText; - if (showExpandedMessage) { - messageText = ( - {messageParams.data} - ); - } else { - messageText = truncateMessage ? ( - - {messageParams.data} - - ) : ( - - {messageParams.data} - - ); - } - return messageText; - }; - - shouldTruncateMessage = (e) => { - if (e.nativeEvent.lines.length > 5) { - this.setState({ truncateMessage: true }); - return; - } - this.setState({ truncateMessage: false }); - }; - - render() { - const { - currentPageInformation, - navigation, - showExpandedMessage, - toggleExpandedMessage, - messageParams: { from }, - } = this.props; - const styles = this.getStyles(); - - const rootView = showExpandedMessage ? ( - - ) : ( - - {this.renderMessageText()} - - ); - return rootView; - } -} - -MessageSign.contextType = ThemeContext; - -export default MessageSign; diff --git a/app/components/UI/MessageSign/index.test.tsx b/app/components/UI/MessageSign/index.test.tsx index 324b6f011a3..8d1e55576dc 100644 --- a/app/components/UI/MessageSign/index.test.tsx +++ b/app/components/UI/MessageSign/index.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { shallow } from 'enzyme'; -import MessageSign from './'; +import MessageSign from './index'; import configureMockStore from 'redux-mock-store'; import { Provider } from 'react-redux'; import { WALLET_CONNECT_ORIGIN } from '../../../util/walletconnect'; @@ -13,10 +13,13 @@ import { strings } from '../../../../locales/i18n'; import initialBackgroundState from '../../../util/test/initial-background-state.json'; jest.mock('../../../core/Engine', () => ({ + acceptPendingApproval: jest.fn(), + rejectPendingApproval: jest.fn(), context: { SignatureController: { - signMessage: jest.fn(), - cancelMessage: jest.fn(), + hub: { + on: jest.fn(), + }, }, }, })); @@ -31,6 +34,11 @@ const messageParamsMock = { data: 'message', origin: 'example.com', metamaskId: 'TestMessageId', + from: '0x0', +}; + +const navigation = { + navigate: jest.fn(), }; const mockStore = configureMockStore(); @@ -43,14 +51,21 @@ const initialState = { const store = mockStore(initialState); -function createWrapper({ origin = messageParamsMock.origin } = {}) { +function createWrapper({ + origin = messageParamsMock.origin, + mockConfirm = jest.fn(), + mockReject = jest.fn(), +} = {}) { return shallow( undefined} - onCancel={() => undefined} + onConfirm={mockConfirm} + onReject={mockReject} + toggleExpandedMessage={jest.fn()} + showExpandedMessage={false} + navigation={navigation} /> , ).find(MessageSign); @@ -64,15 +79,11 @@ describe('MessageSign', () => { describe('onConfirm', () => { it('signs message', async () => { - const wrapper = createWrapper().dive(); + const onConfirmMock = jest.fn(); + const wrapper = createWrapper({ mockConfirm: onConfirmMock }).dive(); await (wrapper.find(SignatureRequest).props() as any).onConfirm(); - expect( - Engine.context.SignatureController.signMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.signMessage, - ).toHaveBeenCalledWith(messageParamsMock); + expect(onConfirmMock).toHaveBeenCalledTimes(1); }); it.each([ @@ -100,17 +111,13 @@ describe('MessageSign', () => { }); }); - describe('onCancel', () => { - it('cancels message', async () => { - const wrapper = createWrapper().dive(); - await (wrapper.find(SignatureRequest).props() as any).onCancel(); - - expect( - Engine.context.SignatureController.cancelMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.cancelMessage, - ).toHaveBeenCalledWith(messageParamsMock.metamaskId); + describe('onReject', () => { + it('rejects message', async () => { + const onRejectMock = jest.fn(); + const wrapper = createWrapper({ mockReject: onRejectMock }).dive(); + await (wrapper.find(SignatureRequest).props() as any).onReject(); + + expect(onRejectMock).toHaveBeenCalledTimes(1); }); it.each([ @@ -122,9 +129,10 @@ describe('MessageSign', () => { .mockImplementation((callback: any) => callback()); (NotificationManager.showSimpleNotification as any).mockReset(); + (Engine.context.SignatureController.hub.on as any).mockReset(); const wrapper = createWrapper({ origin }).dive(); - await (wrapper.find(SignatureRequest).props() as any).onCancel(); + await (wrapper.find(SignatureRequest).props() as any).onReject(); expect(NotificationManager.showSimpleNotification).toHaveBeenCalledTimes( 1, diff --git a/app/components/UI/MessageSign/index.ts b/app/components/UI/MessageSign/index.ts new file mode 100644 index 00000000000..55b429b0574 --- /dev/null +++ b/app/components/UI/MessageSign/index.ts @@ -0,0 +1 @@ +export { default } from './MessageSign'; diff --git a/app/components/UI/PersonalSign/PersonalSign.tsx b/app/components/UI/PersonalSign/PersonalSign.tsx index 3b2ae7b15fe..a06dc29a79b 100644 --- a/app/components/UI/PersonalSign/PersonalSign.tsx +++ b/app/components/UI/PersonalSign/PersonalSign.tsx @@ -22,8 +22,8 @@ import AppConstants from '../../../core/AppConstants'; * Component that supports personal_sign */ const PersonalSign = ({ - onCancel, onConfirm, + onReject, messageParams, currentPageInformation, toggleExpandedMessage, @@ -70,6 +70,27 @@ const PersonalSign = ({ ); }, [getAnalyticsParams]); + useEffect(() => { + const onSignatureError = ({ error }) => { + if (error?.message.startsWith(KEYSTONE_TX_CANCELED)) { + AnalyticsV2.trackEvent( + MetaMetricsEvents.QR_HARDWARE_TRANSACTION_CANCELED, + getAnalyticsParams(), + ); + } + }; + Engine.context.SignatureController.hub.on( + `${messageParams.metamaskId}:signError`, + onSignatureError, + ); + return () => { + Engine.context.SignatureController.hub.removeListener( + `${messageParams.metamaskId}:signError`, + onSignatureError, + ); + }; + }, [getAnalyticsParams, messageParams.metamaskId]); + const showWalletConnectNotification = (confirmation = false) => { InteractionManager.runAfterInteractions(() => { messageParams.origin && @@ -88,44 +109,22 @@ const PersonalSign = ({ }); }; - const signMessage = async () => { - const { SignatureController }: any = Engine.context; - await SignatureController.signPersonalMessage(messageParams); - showWalletConnectNotification(true); - }; - - const rejectMessage = async () => { - const { SignatureController }: any = Engine.context; - await SignatureController.cancelPersonalMessage(messageParams.metamaskId); + const rejectSignature = async () => { + await onReject(); showWalletConnectNotification(false); - }; - - const cancelSignature = async () => { - await rejectMessage(); AnalyticsV2.trackEvent( MetaMetricsEvents.SIGN_REQUEST_CANCELLED, getAnalyticsParams(), ); - onCancel(); }; const confirmSignature = async () => { - try { - await signMessage(); - AnalyticsV2.trackEvent( - MetaMetricsEvents.SIGN_REQUEST_COMPLETED, - getAnalyticsParams(), - ); - onConfirm(); - } catch (e: any) { - if (e?.message.startsWith(KEYSTONE_TX_CANCELED)) { - AnalyticsV2.trackEvent( - MetaMetricsEvents.QR_HARDWARE_TRANSACTION_CANCELED, - getAnalyticsParams(), - ); - onCancel(); - } - } + await onConfirm(); + showWalletConnectNotification(true); + AnalyticsV2.trackEvent( + MetaMetricsEvents.SIGN_REQUEST_COMPLETED, + getAnalyticsParams(), + ); }; const shouldTruncateMessage = (e: any) => { @@ -184,7 +183,7 @@ const PersonalSign = ({ ) : ( `; diff --git a/app/components/UI/PersonalSign/index.test.tsx b/app/components/UI/PersonalSign/index.test.tsx index 2ef6066b1df..a28ff5d1d36 100644 --- a/app/components/UI/PersonalSign/index.test.tsx +++ b/app/components/UI/PersonalSign/index.test.tsx @@ -13,10 +13,13 @@ import { strings } from '../../../../locales/i18n'; import initialBackgroundState from '../../../util/test/initial-background-state.json'; jest.mock('../../../core/Engine', () => ({ + acceptPendingApproval: jest.fn(), + rejectPendingApproval: jest.fn(), context: { SignatureController: { - signPersonalMessage: jest.fn(), - cancelPersonalMessage: jest.fn(), + hub: { + on: jest.fn(), + }, }, }, })); @@ -44,7 +47,11 @@ const initialState = { const store = mockStore(initialState); -function createWrapper({ origin = messageParamsMock.origin } = {}) { +function createWrapper({ + origin = messageParamsMock.origin, + mockConfirm = jest.fn(), + mockReject = jest.fn(), +} = {}) { return shallow( ({})} - onCancel={() => ({})} + onConfirm={mockConfirm} + onReject={mockReject} selectedAddress="0x0" /> , @@ -69,15 +76,11 @@ describe('PersonalSign', () => { describe('onConfirm', () => { it('signs message', async () => { - const wrapper = createWrapper().dive(); + const onConfirmMock = jest.fn(); + const wrapper = createWrapper({ mockConfirm: onConfirmMock }).dive(); await (wrapper.find(SignatureRequest).props() as any).onConfirm(); - expect( - Engine.context.SignatureController.signPersonalMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.signPersonalMessage, - ).toHaveBeenCalledWith(messageParamsMock); + expect(onConfirmMock).toHaveBeenCalledTimes(1); }); it.each([ @@ -105,17 +108,13 @@ describe('PersonalSign', () => { }); }); - describe('onCancel', () => { - it('cancels message', async () => { - const wrapper = createWrapper().dive(); - await (wrapper.find(SignatureRequest).props() as any).onCancel(); - - expect( - Engine.context.SignatureController.cancelPersonalMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.cancelPersonalMessage, - ).toHaveBeenCalledWith(messageParamsMock.metamaskId); + describe('onReject', () => { + it('rejects message', async () => { + const onRejectMock = jest.fn(); + const wrapper = createWrapper({ mockReject: onRejectMock }).dive(); + await (wrapper.find(SignatureRequest).props() as any).onReject(); + + expect(onRejectMock).toHaveBeenCalledTimes(1); }); it.each([ @@ -127,9 +126,10 @@ describe('PersonalSign', () => { .mockImplementation((callback: any) => callback()); (NotificationManager.showSimpleNotification as any).mockReset(); + (Engine.context.SignatureController.hub.on as any).mockReset(); const wrapper = createWrapper({ origin }).dive(); - await (wrapper.find(SignatureRequest).props() as any).onCancel(); + await (wrapper.find(SignatureRequest).props() as any).onReject(); expect(NotificationManager.showSimpleNotification).toHaveBeenCalledTimes( 1, diff --git a/app/components/UI/PersonalSign/types.ts b/app/components/UI/PersonalSign/types.ts index de9f55897af..476d62d6fab 100644 --- a/app/components/UI/PersonalSign/types.ts +++ b/app/components/UI/PersonalSign/types.ts @@ -4,7 +4,7 @@ export interface PersonalSignProps { /** * Callback triggered when this message signature is rejected */ - onCancel: () => void; + onReject: () => void; /** * Callback triggered when this message signature is approved */ diff --git a/app/components/UI/SignatureRequest/Root/Root.test.tsx b/app/components/UI/SignatureRequest/Root/Root.test.tsx index b011b58b867..6d0f50b5ae7 100644 --- a/app/components/UI/SignatureRequest/Root/Root.test.tsx +++ b/app/components/UI/SignatureRequest/Root/Root.test.tsx @@ -29,6 +29,11 @@ jest.mock('../../../../core/Engine', () => ({ Promise.resolve({ subscribe: jest.fn(), unsubscribe: jest.fn() }), ), }, + SignatureController: { + hub: { + on: jest.fn(), + }, + }, }, })); diff --git a/app/components/UI/SignatureRequest/Root/Root.tsx b/app/components/UI/SignatureRequest/Root/Root.tsx index a9833ea2851..8e617c08d26 100644 --- a/app/components/UI/SignatureRequest/Root/Root.tsx +++ b/app/components/UI/SignatureRequest/Root/Root.tsx @@ -12,7 +12,8 @@ import { ApprovalTypes } from '../../../../core/RPCMethods/RPCMethodMiddleware'; interface RootProps { messageParams?: MessageParams; approvalType?: string; - onSign: () => void; + onSignConfirm: () => void; + onSignReject: () => void; } const styles = StyleSheet.create({ @@ -22,7 +23,12 @@ const styles = StyleSheet.create({ }, }); -const Root = ({ messageParams, approvalType, onSign }: RootProps) => { +const Root = ({ + messageParams, + approvalType, + onSignConfirm, + onSignReject, +}: RootProps) => { const navigation = useNavigation(); const { colors } = useTheme(); const [showExpandedMessage, setShowExpandedMessage] = useState(false); @@ -46,17 +52,19 @@ const Root = ({ messageParams, approvalType, onSign }: RootProps) => { backdropOpacity={1} animationInTiming={600} animationOutTiming={600} - onBackdropPress={onSign} - onBackButtonPress={showExpandedMessage ? toggleExpandedMessage : onSign} - onSwipeComplete={onSign} + onBackdropPress={onSignReject} + onBackButtonPress={ + showExpandedMessage ? toggleExpandedMessage : onSignReject + } + onSwipeComplete={onSignReject} swipeDirection={'down'} propagateSwipe > {approvalType === ApprovalTypes.PERSONAL_SIGN && ( { { { - this.props.onCancel(); + onReject = () => { + this.props.onReject(); Analytics.trackEventWithParameters( MetaMetricsEvents.TRANSACTIONS_CANCEL_SIGNATURE, this.getTrackingParams(), @@ -194,7 +194,7 @@ class SignatureRequest extends PureComponent { }; goToWarning = () => { - this.props.onCancel(); + this.props.onReject(); this.props.navigation.navigate('Webview', { screen: 'SimpleWebview', params: { @@ -298,7 +298,7 @@ class SignatureRequest extends PureComponent { confirmTestID={'request-signature-confirm-button'} cancelText={strings('signature_request.cancel')} confirmText={strings('signature_request.sign')} - onCancelPress={this.onCancel} + onCancelPress={this.onReject} onConfirmPress={this.onConfirm} confirmButtonMode="sign" > diff --git a/app/components/UI/TypedSign/__snapshots__/index.test.tsx.snap b/app/components/UI/TypedSign/__snapshots__/index.test.tsx.snap index 8371a2a133a..3c10d26ae46 100644 --- a/app/components/UI/TypedSign/__snapshots__/index.test.tsx.snap +++ b/app/components/UI/TypedSign/__snapshots__/index.test.tsx.snap @@ -19,7 +19,7 @@ exports[`TypedSign should render correctly 1`] = ` "origin": "example.com", } } - onCancel={[Function]} - onConfirm={[Function]} + onConfirm={[MockFunction]} + onReject={[MockFunction]} /> `; diff --git a/app/components/UI/TypedSign/index.js b/app/components/UI/TypedSign/index.js index 12327041475..daf5543362d 100644 --- a/app/components/UI/TypedSign/index.js +++ b/app/components/UI/TypedSign/index.js @@ -1,23 +1,24 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; -import { StyleSheet, View, Text, InteractionManager } from 'react-native'; +import { StyleSheet, View, Text } from 'react-native'; import { fontStyles } from '../../../styles/common'; -import Engine from '../../../core/Engine'; import SignatureRequest from '../SignatureRequest'; import ExpandedMessage from '../SignatureRequest/ExpandedMessage'; import Device from '../../../util/device'; -import NotificationManager from '../../../core/NotificationManager'; -import { strings } from '../../../../locales/i18n'; -import { WALLET_CONNECT_ORIGIN } from '../../../util/walletconnect'; import { MetaMetricsEvents } from '../../../core/Analytics'; import AnalyticsV2 from '../../../util/analyticsV2'; -import URL from 'url-parse'; -import { getAddressAccountType } from '../../../util/address'; import { KEYSTONE_TX_CANCELED } from '../../../constants/error'; import { ThemeContext, mockTheme } from '../../../util/theme'; import sanitizeString from '../../../util/string'; -import AppConstants from '../../../core/AppConstants'; + +import { + addSignatureErrorListener, + getAnalyticsParams, + handleSignatureAction, + removeSignatureErrorListener, + showWalletConnectNotification, +} from '../../../util/confirmation/signatureUtils'; const createStyles = (colors) => StyleSheet.create({ @@ -56,7 +57,7 @@ class TypedSign extends PureComponent { /** * Callback triggered when this message signature is rejected */ - onCancel: PropTypes.func, + onReject: PropTypes.func, /** * Callback triggered when this message signature is approved */ @@ -83,107 +84,42 @@ class TypedSign extends PureComponent { truncateMessage: false, }; - getAnalyticsParams = () => { - try { - const { currentPageInformation, messageParams } = this.props; - const { NetworkController } = Engine.context; - const { chainId } = NetworkController?.state?.providerConfig || {}; - const url = new URL(currentPageInformation?.url); - return { - account_type: getAddressAccountType(messageParams.from), - dapp_host_name: url?.host, - dapp_url: currentPageInformation?.url, - chain_id: chainId, - sign_type: 'typed', - version: messageParams?.version, - ...currentPageInformation?.analytics, - }; - } catch (error) { - return {}; - } - }; - componentDidMount = () => { + const { + messageParams: { metamaskId }, + } = this.props; AnalyticsV2.trackEvent( MetaMetricsEvents.SIGN_REQUEST_STARTED, - this.getAnalyticsParams(), + getAnalyticsParams(), ); + addSignatureErrorListener(metamaskId, this.onSignatureError); }; - walletConnectNotificationTitle = (confirmation, isError) => { - if (isError) return strings('notifications.wc_signed_failed_title'); - return confirmation - ? strings('notifications.wc_signed_title') - : strings('notifications.wc_signed_rejected_title'); - }; - - showWalletConnectNotification = ( - messageParams = {}, - confirmation = false, - isError = false, - ) => { - InteractionManager.runAfterInteractions(() => { - messageParams.origin && - (messageParams.origin.startsWith(WALLET_CONNECT_ORIGIN) || - messageParams.origin.startsWith( - AppConstants.MM_SDK.SDK_REMOTE_ORIGIN, - )) && - NotificationManager.showSimpleNotification({ - status: `simple_notification${!confirmation ? '_rejected' : ''}`, - duration: 5000, - title: this.walletConnectNotificationTitle(confirmation, isError), - description: strings('notifications.wc_description'), - }); - }); + componentWillUnmount = () => { + const { + messageParams: { metamaskId }, + } = this.props; + removeSignatureErrorListener(metamaskId, this.onSignatureError); }; - signMessage = async () => { - const { messageParams } = this.props; - const { SignatureController } = Engine.context; - try { - await SignatureController.signTypedMessage(messageParams, { - parseJsonData: false, - }); - this.showWalletConnectNotification(messageParams, true); - } catch (error) { - this.showWalletConnectNotification(messageParams, false, true); + onSignatureError = ({ error }) => { + if (error?.message.startsWith(KEYSTONE_TX_CANCELED)) { + AnalyticsV2.trackEvent( + MetaMetricsEvents.QR_HARDWARE_TRANSACTION_CANCELED, + getAnalyticsParams(), + ); } + showWalletConnectNotification(this.props.messageParams, false, true); }; - rejectMessage = async () => { - const { messageParams } = this.props; - const { SignatureController } = Engine.context; - const messageId = messageParams.metamaskId; - await SignatureController.cancelTypedMessage(messageId); - this.showWalletConnectNotification(messageParams); - }; - - cancelSignature = async () => { - await this.rejectMessage(); - AnalyticsV2.trackEvent( - MetaMetricsEvents.SIGN_REQUEST_CANCELLED, - this.getAnalyticsParams(), - ); - this.props.onCancel(); + rejectSignature = async () => { + const { messageParams, onReject } = this.props; + await handleSignatureAction(onReject, messageParams, 'typed', false); }; confirmSignature = async () => { - try { - await this.signMessage(); - AnalyticsV2.trackEvent( - MetaMetricsEvents.SIGN_REQUEST_COMPLETED, - this.getAnalyticsParams(), - ); - this.props.onConfirm(); - } catch (e) { - if (e?.message.startsWith(KEYSTONE_TX_CANCELED)) { - AnalyticsV2.trackEvent( - MetaMetricsEvents.QR_HARDWARE_TRANSACTION_CANCELED, - this.getAnalyticsParams(), - ); - this.props.onCancel(); - } - } + const { messageParams, onConfirm } = this.props; + await handleSignatureAction(onConfirm, messageParams, 'typed', true); }; shouldTruncateMessage = (e) => { @@ -284,7 +220,7 @@ class TypedSign extends PureComponent { ) : ( ({ + acceptPendingApproval: jest.fn(), + rejectPendingApproval: jest.fn(), context: { SignatureController: { - signTypedMessage: jest.fn(), - cancelTypedMessage: jest.fn(), + hub: { + on: jest.fn(), + }, }, }, })); @@ -41,14 +44,18 @@ const initialState = { const store = mockStore(initialState); -function createWrapper({ origin = messageParamsMock.origin } = {}) { +function createWrapper({ + origin = messageParamsMock.origin, + mockConfirm = jest.fn(), + mockReject = jest.fn(), +} = {}) { return shallow( undefined} - onCancel={() => undefined} + onConfirm={mockConfirm} + onReject={mockReject} /> , ).find(TypedSign); @@ -62,15 +69,11 @@ describe('TypedSign', () => { describe('onConfirm', () => { it('signs message', async () => { - const wrapper = createWrapper().dive(); + const onConfirmMock = jest.fn(); + const wrapper = createWrapper({ mockConfirm: onConfirmMock }).dive(); await (wrapper.find(SignatureRequest).props() as any).onConfirm(); - expect( - Engine.context.SignatureController.signTypedMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.signTypedMessage, - ).toHaveBeenCalledWith(messageParamsMock, { parseJsonData: false }); + expect(onConfirmMock).toHaveBeenCalledTimes(1); }); it.each([ @@ -108,18 +111,22 @@ describe('TypedSign', () => { ])( 'shows notification on error if origin is %s', async (_title, origin) => { + const onConfirmMock = jest.fn().mockResolvedValueOnce(); jest .spyOn(InteractionManager, 'runAfterInteractions') .mockImplementation((callback: any) => callback()); (NotificationManager.showSimpleNotification as any).mockReset(); + (Engine.context.SignatureController.hub.on as any).mockImplementation( + (_eventName, callback) => { + callback({ error: new Error('error') }); + }, + ); - ( - Engine.context.SignatureController.signTypedMessage as any - ).mockRejectedValue(new Error('Test Error')); - - const wrapper = createWrapper({ origin }).dive(); - await (wrapper.find(SignatureRequest).props() as any).onConfirm(); + createWrapper({ + origin, + mockConfirm: onConfirmMock, + }).dive(); expect( NotificationManager.showSimpleNotification, @@ -136,17 +143,13 @@ describe('TypedSign', () => { ); }); - describe('onCancel', () => { - it('cancels message', async () => { - const wrapper = createWrapper().dive(); - await (wrapper.find(SignatureRequest).props() as any).onCancel(); - - expect( - Engine.context.SignatureController.cancelTypedMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.cancelTypedMessage, - ).toHaveBeenCalledWith(messageParamsMock.metamaskId); + describe('onReject', () => { + it('rejects message', async () => { + const onRejectMock = jest.fn(); + const wrapper = createWrapper({ mockReject: onRejectMock }).dive(); + await (wrapper.find(SignatureRequest).props() as any).onReject(); + + expect(onRejectMock).toHaveBeenCalledTimes(1); }); it.each([ @@ -158,9 +161,10 @@ describe('TypedSign', () => { .mockImplementation((callback: any) => callback()); (NotificationManager.showSimpleNotification as any).mockReset(); + (Engine.context.SignatureController.hub.on as any).mockReset(); const wrapper = createWrapper({ origin }).dive(); - await (wrapper.find(SignatureRequest).props() as any).onCancel(); + await (wrapper.find(SignatureRequest).props() as any).onReject(); expect(NotificationManager.showSimpleNotification).toHaveBeenCalledTimes( 1, diff --git a/app/components/hooks/useApprovalRequest.test.ts b/app/components/hooks/useApprovalRequest.test.ts index ea87278a5e5..263235cf6cf 100644 --- a/app/components/hooks/useApprovalRequest.test.ts +++ b/app/components/hooks/useApprovalRequest.test.ts @@ -122,6 +122,7 @@ describe('useApprovalRequest', () => { expect(Engine.acceptPendingApproval).toHaveBeenCalledWith( APPROVAL_REQUEST.id, APPROVAL_REQUEST.requestData, + undefined, ); }); diff --git a/app/components/hooks/useApprovalRequest.ts b/app/components/hooks/useApprovalRequest.ts index f81839d9025..5a6fe5925e3 100644 --- a/app/components/hooks/useApprovalRequest.ts +++ b/app/components/hooks/useApprovalRequest.ts @@ -4,7 +4,7 @@ import { ethErrors } from 'eth-rpc-errors'; import { useSelector } from 'react-redux'; import { selectPendingApprovals } from '../../selectors/approvalController'; import { cloneDeep, isEqual } from 'lodash'; -import { ApprovalRequest } from '@metamask/approval-controller'; +import { AcceptOptions, ApprovalRequest } from '@metamask/approval-controller'; const useApprovalRequest = () => { const pendingApprovals = useSelector(selectPendingApprovals, isEqual); @@ -15,14 +15,18 @@ const useApprovalRequest = () => { const pageMeta = approvalRequest?.requestData?.pageMeta ?? {}; - const onConfirm = useCallback(() => { - if (!approvalRequest) return; - - Engine.acceptPendingApproval( - approvalRequest.id, - approvalRequest.requestData, - ); - }, [approvalRequest]); + const onConfirm = useCallback( + (opts?: AcceptOptions) => { + if (!approvalRequest) return; + + Engine.acceptPendingApproval( + approvalRequest.id, + approvalRequest.requestData, + opts, + ); + }, + [approvalRequest], + ); const onReject = useCallback(() => { if (!approvalRequest) return; diff --git a/app/core/Engine.ts b/app/core/Engine.ts index a64f33d1990..b3c83a1b1fb 100644 --- a/app/core/Engine.ts +++ b/app/core/Engine.ts @@ -23,7 +23,10 @@ import { PhishingController } from '@metamask/phishing-controller'; import { PreferencesController } from '@metamask/preferences-controller'; import { TransactionController } from '@metamask/transaction-controller'; import { GasFeeController } from '@metamask/gas-fee-controller'; -import { ApprovalController } from '@metamask/approval-controller'; +import { + AcceptOptions, + ApprovalController, +} from '@metamask/approval-controller'; import { PermissionController } from '@metamask/permission-controller'; import SwapsController, { swapsUtils } from '@metamask/swaps-controller'; import AsyncStorage from '@react-native-async-storage/async-storage'; @@ -431,11 +434,7 @@ class Engine { new SignatureController({ messenger: this.controllerMessenger.getRestricted({ name: 'SignatureController', - allowedActions: [ - `${approvalController.name}:addRequest`, - `${approvalController.name}:acceptRequest`, - `${approvalController.name}:rejectRequest`, - ], + allowedActions: [`${approvalController.name}:addRequest`], }), isEthSignEnabled: () => Boolean( @@ -799,10 +798,14 @@ class Engine { } } - acceptPendingApproval(id: string, requestData?: Record) { + acceptPendingApproval( + id: string, + requestData?: Record, + opts: AcceptOptions = { waitForResult: false }, + ) { const { ApprovalController } = this.context; try { - ApprovalController.accept(id, requestData); + ApprovalController.accept(id, requestData, opts); } catch (err) { // Ignore err if request already approved or doesn't exists. } @@ -899,8 +902,11 @@ export default { Object.freeze(instance); return instance; }, - acceptPendingApproval: (id: string, requestData?: Record) => - instance?.acceptPendingApproval(id, requestData), + acceptPendingApproval: ( + id: string, + requestData?: Record, + opts?: AcceptOptions, + ) => instance?.acceptPendingApproval(id, requestData, opts), rejectPendingApproval: (id: string, reason: Error) => instance?.rejectPendingApproval(id, reason), }; diff --git a/app/core/RPCMethods/RPCMethodMiddleware.test.ts b/app/core/RPCMethods/RPCMethodMiddleware.test.ts index c4aba33937a..8b6607cce3d 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.test.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.test.ts @@ -1091,12 +1091,7 @@ describe('getRpcMethodMiddleware', () => { it('creates unsigned message', async () => { await sendRequest(); - expect( - Engine.context.SignatureController.newUnsignedTypedMessage, - ).toHaveBeenCalledTimes(1); - expect( - Engine.context.SignatureController.newUnsignedTypedMessage, - ).toHaveBeenCalledWith( + const expectedParams = [ { data: dataJsonMock, from: addressMock, @@ -1105,7 +1100,20 @@ describe('getRpcMethodMiddleware', () => { }, expect.any(Object), version, - ); + ]; + + if (version !== 'V1') { + expectedParams.push({ + parseJsonData: false, + }); + } + + expect( + Engine.context.SignatureController.newUnsignedTypedMessage, + ).toHaveBeenCalledTimes(1); + expect( + Engine.context.SignatureController.newUnsignedTypedMessage, + ).toHaveBeenCalledWith(...expectedParams); }); it('returns resolved value from message promise', async () => { diff --git a/app/core/RPCMethods/RPCMethodMiddleware.ts b/app/core/RPCMethods/RPCMethodMiddleware.ts index ddfe9550bd1..29b16255a9a 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.ts @@ -145,6 +145,59 @@ export const checkActiveAccountAndChainId = async ({ } }; +const generateRawSignature = async ({ + version, + req, + hostname, + url, + title, + icon, + analytics, + isMMSDK, + isWalletConnect, + chainId, + getSource, + checkTabActive, +}: any) => { + const { SignatureController } = Engine.context; + + const pageMeta = { + meta: { + url: url.current, + title: title.current, + icon: icon.current, + analytics: { + request_source: getSource(), + request_platform: analytics?.platform, + }, + }, + }; + + checkTabActive(); + await checkActiveAccountAndChainId({ + hostname, + address: req.params[0], + chainId, + checkSelectedAddress: isMMSDK || isWalletConnect, + }); + + const rawSig = await SignatureController.newUnsignedTypedMessage( + { + data: req.params[1], + from: req.params[0], + ...pageMeta, + origin: hostname, + }, + req, + version, + { + parseJsonData: false, + }, + ); + + return rawSig; +}; + /** * Handle RPC methods called by dapps */ @@ -576,86 +629,44 @@ export const getRpcMethodMiddleware = ({ }, eth_signTypedData_v3: async () => { - const { SignatureController } = Engine.context; - const data = typeof req.params[1] === 'string' ? JSON.parse(req.params[1]) : req.params[1]; const chainId = data.domain.chainId; - - const pageMeta = { - meta: { - url: url.current, - title: title.current, - icon: icon.current, - analytics: { - request_source: getSource(), - request_platform: analytics?.platform, - }, - }, - }; - - checkTabActive(); - await checkActiveAccountAndChainId({ + res.result = await generateRawSignature({ + version: 'V3', + req, hostname, - address: req.params[0], + url, + title, + icon, + analytics, + isMMSDK, + isWalletConnect, chainId, - checkSelectedAddress: isMMSDK || isWalletConnect, + getSource, + checkTabActive, }); - - const rawSig = await SignatureController.newUnsignedTypedMessage( - { - data: req.params[1], - from: req.params[0], - ...pageMeta, - origin: hostname, - }, - req, - 'V3', - ); - - res.result = rawSig; }, eth_signTypedData_v4: async () => { - const { SignatureController } = Engine.context; - const data = JSON.parse(req.params[1]); const chainId = data.domain.chainId; - - const pageMeta = { - meta: { - url: url.current, - title: title.current, - icon: icon.current, - analytics: { - request_source: getSource(), - request_platform: analytics?.platform, - }, - }, - }; - - checkTabActive(); - await checkActiveAccountAndChainId({ + res.result = await generateRawSignature({ + version: 'V4', + req, hostname, - address: req.params[0], + url, + title, + icon, + analytics, + isMMSDK, + isWalletConnect, chainId, - checkSelectedAddress: isMMSDK || isWalletConnect, + getSource, + checkTabActive, }); - - const rawSig = await SignatureController.newUnsignedTypedMessage( - { - data: req.params[1], - from: req.params[0], - ...pageMeta, - origin: hostname, - }, - req, - 'V4', - ); - - res.result = rawSig; }, web3_clientVersion: async () => { diff --git a/app/util/confirmation/signatureUtils.js b/app/util/confirmation/signatureUtils.js new file mode 100644 index 00000000000..d406eb7f2c4 --- /dev/null +++ b/app/util/confirmation/signatureUtils.js @@ -0,0 +1,86 @@ +import Engine from '../../core/Engine'; +import { MetaMetricsEvents } from '../../core/Analytics'; +import AnalyticsV2 from '../analyticsV2'; +import { getAddressAccountType } from '../address'; +import NotificationManager from '../../core/NotificationManager'; +import { WALLET_CONNECT_ORIGIN } from '../walletconnect'; +import AppConstants from '../../core/AppConstants'; +import { InteractionManager } from 'react-native'; +import { strings } from '../../../locales/i18n'; + +export const getAnalyticsParams = (messageParams, signType) => { + try { + const { currentPageInformation } = messageParams; + const { NetworkController } = Engine.context; + const { chainId } = NetworkController?.state?.providerConfig || {}; + const url = new URL(currentPageInformation?.url); + return { + account_type: getAddressAccountType(messageParams.from), + dapp_host_name: url?.host, + dapp_url: currentPageInformation?.url, + chain_id: chainId, + sign_type: signType, + version: messageParams?.version, + ...currentPageInformation?.analytics, + }; + } catch (error) { + return {}; + } +}; + +export const walletConnectNotificationTitle = (confirmation, isError) => { + if (isError) return strings('notifications.wc_signed_failed_title'); + return confirmation + ? strings('notifications.wc_signed_title') + : strings('notifications.wc_signed_rejected_title'); +}; + +export const showWalletConnectNotification = ( + messageParams = {}, + confirmation = false, + isError = false, +) => { + InteractionManager.runAfterInteractions(() => { + messageParams.origin && + (messageParams.origin.startsWith(WALLET_CONNECT_ORIGIN) || + messageParams.origin.startsWith( + AppConstants.MM_SDK.SDK_REMOTE_ORIGIN, + )) && + NotificationManager.showSimpleNotification({ + status: `simple_notification${!confirmation ? '_rejected' : ''}`, + duration: 5000, + title: this.walletConnectNotificationTitle(confirmation, isError), + description: strings('notifications.wc_description'), + }); + }); +}; + +export const handleSignatureAction = async ( + onAction, + messageParams, + signType, + confirmation, +) => { + await onAction(); + showWalletConnectNotification(messageParams, confirmation); + AnalyticsV2.trackEvent( + confirmation + ? MetaMetricsEvents.SIGN_REQUEST_COMPLETED + : MetaMetricsEvents.SIGN_REQUEST_CANCELLED, + getAnalyticsParams(messageParams, signType), + ); +}; + +export const addSignatureErrorListener = (metamaskId, onSignatureError) => { + Engine.context.SignatureController.hub.on( + `${metamaskId}:signError`, + onSignatureError, + ); +}; + +export const removeSignatureErrorListener = (metamaskId, onSignatureError) => { + Engine.context.SignatureController.hub.removeListener( + `${metamaskId}:signError`, + onSignatureError, + ); +}; diff --git a/package.json b/package.json index 6776ec3f384..ad2013314ff 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "@metamask/phishing-controller": "^3.0.0", "@metamask/preferences-controller": "^2.1.0", "@metamask/sdk-communication-layer": "^0.5.0", - "@metamask/signature-controller": "^2.0.0", + "@metamask/signature-controller": "4.0.1", "@metamask/swaps-controller": "^6.8.0", "@metamask/transaction-controller": "4.0.0", "@ngraveio/bc-ur": "^1.1.6", @@ -511,4 +511,4 @@ "puppeteer": false } } -} +} \ No newline at end of file diff --git a/patches/@metamask+signature-controller++@metamask+message-manager+5.0.0.patch b/patches/@metamask+signature-controller++@metamask+message-manager+5.0.0.patch deleted file mode 100644 index e06440d7874..00000000000 --- a/patches/@metamask+signature-controller++@metamask+message-manager+5.0.0.patch +++ /dev/null @@ -1,42 +0,0 @@ -diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts -index 5d25b78..adb55e2 100644 ---- a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts -+++ b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts -@@ -1,4 +1,3 @@ --import { SIWEMessage } from '@metamask/controller-utils'; - import { AbstractMessageManager, AbstractMessage, AbstractMessageParams, AbstractMessageParamsMetamask, OriginalRequest } from './AbstractMessageManager'; - /** - * @type Message -@@ -24,7 +23,7 @@ export interface PersonalMessage extends AbstractMessage { - */ - export interface PersonalMessageParams extends AbstractMessageParams { - data: string; -- siwe?: SIWEMessage; -+ siwe?: any; - } - /** - * @type MessageParamsMetamask -diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js -index ecb609b..dd0fa9d 100644 ---- a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js -+++ b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js -@@ -11,7 +11,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge - Object.defineProperty(exports, "__esModule", { value: true }); - exports.PersonalMessageManager = void 0; - const uuid_1 = require("uuid"); --const controller_utils_1 = require("@metamask/controller-utils"); - const utils_1 = require("./utils"); - const AbstractMessageManager_1 = require("./AbstractMessageManager"); - /** -@@ -67,7 +66,10 @@ class PersonalMessageManager extends AbstractMessageManager_1.AbstractMessageMan - messageParams.origin = req.origin; - } - messageParams.data = (0, utils_1.normalizeMessageData)(messageParams.data); -- const ethereumSignInData = (0, controller_utils_1.detectSIWE)(messageParams); -+ const ethereumSignInData = { -+ isSIWEMessage: false, -+ parsedMessage: null, -+ }; - const finalMsgParams = Object.assign(Object.assign({}, messageParams), { siwe: ethereumSignInData }); - const messageId = (0, uuid_1.v1)(); - const messageData = { diff --git a/patches/@metamask+signature-controller++@metamask+message-manager+7.0.1.patch b/patches/@metamask+signature-controller++@metamask+message-manager+7.0.1.patch new file mode 100644 index 00000000000..ea97e5de935 --- /dev/null +++ b/patches/@metamask+signature-controller++@metamask+message-manager+7.0.1.patch @@ -0,0 +1,66 @@ +diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/.DS_Store b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/.DS_Store +new file mode 100644 +index 0000000..e69de29 +diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts +index 078af88..0675794 100644 +--- a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts ++++ b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts +@@ -1,4 +1,3 @@ +-import { SIWEMessage } from '@metamask/controller-utils'; + import { AbstractMessageManager, AbstractMessage, AbstractMessageParams, AbstractMessageParamsMetamask, OriginalRequest } from './AbstractMessageManager'; + /** + * @type Message +@@ -24,7 +23,10 @@ export interface PersonalMessage extends AbstractMessage { + */ + export interface PersonalMessageParams extends AbstractMessageParams { + data: string; +- siwe?: SIWEMessage; ++ siwe?: { ++ isSIWEMessage: boolean; ++ parsedMessage: null; ++ }; + } + /** + * @type MessageParamsMetamask +diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts.map b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts.map +index ab04adc..52e6b44 100644 +--- a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts.map ++++ b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.d.ts.map +@@ -1 +1 @@ +-{"version":3,"file":"PersonalMessageManager.d.ts","sourceRoot":"","sources":["../src/PersonalMessageManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,6BAA6B,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,aAAa,EAAE,qBAAqB,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,6BACf,SAAQ,6BAA6B;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,sBAAsB,CAChE,eAAe,EACf,qBAAqB,EACrB,6BAA6B,CAC9B;IACC;;OAEG;IACM,IAAI,SAA4B;IAEzC;;;;;;;;;OASG;IACG,oBAAoB,CACxB,aAAa,EAAE,qBAAqB,EACpC,GAAG,CAAC,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC;IA0BlB;;;;;;OAMG;IACH,qBAAqB,CACnB,aAAa,EAAE,6BAA6B,GAC3C,OAAO,CAAC,qBAAqB,CAAC;CAIlC;AAED,eAAe,sBAAsB,CAAC"} +\ No newline at end of file ++{"version":3,"file":"PersonalMessageManager.d.ts","sourceRoot":"","sources":["../src/PersonalMessageManager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,6BAA6B,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,aAAa,EAAE,qBAAqB,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QACL,aAAa,EAAE,OAAO,CAAC;QACvB,aAAa,EAAE,IAAI,CAAC;KACrB,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,6BACf,SAAQ,6BAA6B;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,sBAAsB,CAChE,eAAe,EACf,qBAAqB,EACrB,6BAA6B,CAC9B;IACC;;OAEG;IACM,IAAI,SAA4B;IAEzC;;;;;;;;;OASG;IACG,oBAAoB,CACxB,aAAa,EAAE,qBAAqB,EACpC,GAAG,CAAC,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC;IA6BlB;;;;;;OAMG;IACH,qBAAqB,CACnB,aAAa,EAAE,6BAA6B,GAC3C,OAAO,CAAC,qBAAqB,CAAC;CAIlC;AAED,eAAe,sBAAsB,CAAC"} +\ No newline at end of file +diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js +index 92e9b3d..0321f2e 100644 +--- a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js ++++ b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js +@@ -11,7 +11,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge + Object.defineProperty(exports, "__esModule", { value: true }); + exports.PersonalMessageManager = void 0; + const uuid_1 = require("uuid"); +-const controller_utils_1 = require("@metamask/controller-utils"); + const utils_1 = require("./utils"); + const AbstractMessageManager_1 = require("./AbstractMessageManager"); + /** +@@ -42,7 +41,10 @@ class PersonalMessageManager extends AbstractMessageManager_1.AbstractMessageMan + messageParams.origin = req.origin; + } + messageParams.data = (0, utils_1.normalizeMessageData)(messageParams.data); +- const ethereumSignInData = (0, controller_utils_1.detectSIWE)(messageParams); ++ const ethereumSignInData = { ++ isSIWEMessage: false, ++ parsedMessage: null, ++ }; + const finalMsgParams = Object.assign(Object.assign({}, messageParams), { siwe: ethereumSignInData }); + const messageId = (0, uuid_1.v1)(); + const messageData = { +diff --git a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js.map b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js.map +index b23be96..00b1e54 100644 +--- a/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js.map ++++ b/node_modules/@metamask/signature-controller/node_modules/@metamask/message-manager/dist/PersonalMessageManager.js.map +@@ -1 +1 @@ +-{"version":3,"file":"PersonalMessageManager.js","sourceRoot":"","sources":["../src/PersonalMessageManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+BAAoC;AACpC,iEAAqE;AACrE,mCAAwE;AACxE,qEAMkC;AA6ClC;;GAEG;AACH,MAAa,sBAAuB,SAAQ,+CAI3C;IAJD;;QAKE;;WAEG;QACM,SAAI,GAAG,wBAAwB,CAAC;IAsD3C,CAAC;IApDC;;;;;;;;;OASG;IACG,oBAAoB,CACxB,aAAoC,EACpC,GAAqB;;YAErB,IAAA,+BAAuB,EAAC,aAAa,CAAC,CAAC;YACvC,IAAI,GAAG,EAAE;gBACP,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;aACnC;YACD,aAAa,CAAC,IAAI,GAAG,IAAA,4BAAoB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE9D,MAAM,kBAAkB,GAAG,IAAA,6BAAU,EAAC,aAAa,CAAC,CAAC;YACrD,MAAM,cAAc,mCAAQ,aAAa,KAAE,IAAI,EAAE,kBAAkB,GAAE,CAAC;YAEtE,MAAM,SAAS,GAAG,IAAA,SAAM,GAAE,CAAC;YAC3B,MAAM,WAAW,GAAoB;gBACnC,EAAE,EAAE,SAAS;gBACb,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;gBAChB,IAAI,EAAE,eAAe;aACtB,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,kCAC5B,cAAc,GACd,EAAE,UAAU,EAAE,SAAS,EAAE,EAC5B,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAED;;;;;;OAMG;IACH,qBAAqB,CACnB,aAA4C;QAE5C,OAAO,aAAa,CAAC,UAAU,CAAC;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;CACF;AA9DD,wDA8DC;AAED,kBAAe,sBAAsB,CAAC","sourcesContent":["import { v1 as random } from 'uuid';\nimport { detectSIWE, SIWEMessage } from '@metamask/controller-utils';\nimport { normalizeMessageData, validateSignMessageData } from './utils';\nimport {\n AbstractMessageManager,\n AbstractMessage,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n OriginalRequest,\n} from './AbstractMessageManager';\n\n/**\n * @type Message\n *\n * Represents and contains data about a 'personal_sign' type signature request.\n * These are created when a signature for a personal_sign call is requested.\n * @property id - An id to track and identify the message object\n * @property messageParams - The parameters to pass to the personal_sign method once the signature request is approved\n * @property type - The json-prc signing method for which a signature request has been made.\n * A 'Message' which always has a 'personal_sign' type\n * @property rawSig - Raw data of the signature request\n */\nexport interface PersonalMessage extends AbstractMessage {\n messageParams: PersonalMessageParams;\n}\n\n/**\n * @type PersonalMessageParams\n *\n * Represents the parameters to pass to the personal_sign method once the signature request is approved.\n * @property data - A hex string conversion of the raw buffer data of the signature request\n * @property from - Address to sign this message from\n * @property origin? - Added for request origin identification\n */\nexport interface PersonalMessageParams extends AbstractMessageParams {\n data: string;\n siwe?: SIWEMessage;\n}\n\n/**\n * @type MessageParamsMetamask\n *\n * Represents the parameters to pass to the personal_sign method once the signature request is approved\n * plus data added by MetaMask.\n * @property metamaskId - Added for tracking and identification within MetaMask\n * @property data - A hex string conversion of the raw buffer data of the signature request\n * @property from - Address to sign this message from\n * @property origin? - Added for request origin identification\n */\nexport interface PersonalMessageParamsMetamask\n extends AbstractMessageParamsMetamask {\n data: string;\n}\n\n/**\n * Controller in charge of managing - storing, adding, removing, updating - Messages.\n */\nexport class PersonalMessageManager extends AbstractMessageManager<\n PersonalMessage,\n PersonalMessageParams,\n PersonalMessageParamsMetamask\n> {\n /**\n * Name of this controller used during composition\n */\n override name = 'PersonalMessageManager';\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the\n * unapproved Messages.\n *\n * @param messageParams - The params for the personal_sign call to be made after the message\n * is approved.\n * @param req - The original request object possibly containing the origin.\n * @returns The id of the newly created message.\n */\n async addUnapprovedMessage(\n messageParams: PersonalMessageParams,\n req?: OriginalRequest,\n ): Promise {\n validateSignMessageData(messageParams);\n if (req) {\n messageParams.origin = req.origin;\n }\n messageParams.data = normalizeMessageData(messageParams.data);\n\n const ethereumSignInData = detectSIWE(messageParams);\n const finalMsgParams = { ...messageParams, siwe: ethereumSignInData };\n\n const messageId = random();\n const messageData: PersonalMessage = {\n id: messageId,\n messageParams: finalMsgParams,\n status: 'unapproved',\n time: Date.now(),\n type: 'personal_sign',\n };\n await this.addMessage(messageData);\n this.hub.emit(`unapprovedMessage`, {\n ...finalMsgParams,\n ...{ metamaskId: messageId },\n });\n return messageId;\n }\n\n /**\n * Removes the metamaskId property from passed messageParams and returns a promise which\n * resolves the updated messageParams.\n *\n * @param messageParams - The messageParams to modify.\n * @returns Promise resolving to the messageParams with the metamaskId property removed.\n */\n prepMessageForSigning(\n messageParams: PersonalMessageParamsMetamask,\n ): Promise {\n delete messageParams.metamaskId;\n return Promise.resolve(messageParams);\n }\n}\n\nexport default PersonalMessageManager;\n"]} +\ No newline at end of file ++{"version":3,"file":"PersonalMessageManager.js","sourceRoot":"","sources":["../src/PersonalMessageManager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+BAAoC;AACpC,mCAAwE;AACxE,qEAMkC;AAgDlC;;GAEG;AACH,MAAa,sBAAuB,SAAQ,+CAI3C;IAJD;;QAKE;;WAEG;QACM,SAAI,GAAG,wBAAwB,CAAC;IAyD3C,CAAC;IAvDC;;;;;;;;;OASG;IACG,oBAAoB,CACxB,aAAoC,EACpC,GAAqB;;YAErB,IAAA,+BAAuB,EAAC,aAAa,CAAC,CAAC;YACvC,IAAI,GAAG,EAAE;gBACP,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;aACnC;YACD,aAAa,CAAC,IAAI,GAAG,IAAA,4BAAoB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE9D,MAAM,kBAAkB,GAAG;gBACzB,aAAa,EAAE,KAAK;gBACpB,aAAa,EAAE,IAAI;aACpB,CAAA;YACD,MAAM,cAAc,mCAAQ,aAAa,KAAE,IAAI,EAAE,kBAAkB,GAAE,CAAC;YAEtE,MAAM,SAAS,GAAG,IAAA,SAAM,GAAE,CAAC;YAC3B,MAAM,WAAW,GAAoB;gBACnC,EAAE,EAAE,SAAS;gBACb,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;gBAChB,IAAI,EAAE,eAAe;aACtB,CAAC;YACF,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,kCAC5B,cAAc,GACd,EAAE,UAAU,EAAE,SAAS,EAAE,EAC5B,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAED;;;;;;OAMG;IACH,qBAAqB,CACnB,aAA4C;QAE5C,OAAO,aAAa,CAAC,UAAU,CAAC;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;CACF;AAjED,wDAiEC;AAED,kBAAe,sBAAsB,CAAC","sourcesContent":["import { v1 as random } from 'uuid';\nimport { normalizeMessageData, validateSignMessageData } from './utils';\nimport {\n AbstractMessageManager,\n AbstractMessage,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n OriginalRequest,\n} from './AbstractMessageManager';\n\n/**\n * @type Message\n *\n * Represents and contains data about a 'personal_sign' type signature request.\n * These are created when a signature for a personal_sign call is requested.\n * @property id - An id to track and identify the message object\n * @property messageParams - The parameters to pass to the personal_sign method once the signature request is approved\n * @property type - The json-prc signing method for which a signature request has been made.\n * A 'Message' which always has a 'personal_sign' type\n * @property rawSig - Raw data of the signature request\n */\nexport interface PersonalMessage extends AbstractMessage {\n messageParams: PersonalMessageParams;\n}\n\n/**\n * @type PersonalMessageParams\n *\n * Represents the parameters to pass to the personal_sign method once the signature request is approved.\n * @property data - A hex string conversion of the raw buffer data of the signature request\n * @property from - Address to sign this message from\n * @property origin? - Added for request origin identification\n */\nexport interface PersonalMessageParams extends AbstractMessageParams {\n data: string;\n siwe?: {\n isSIWEMessage: boolean,\n parsedMessage: null,\n };\n}\n\n/**\n * @type MessageParamsMetamask\n *\n * Represents the parameters to pass to the personal_sign method once the signature request is approved\n * plus data added by MetaMask.\n * @property metamaskId - Added for tracking and identification within MetaMask\n * @property data - A hex string conversion of the raw buffer data of the signature request\n * @property from - Address to sign this message from\n * @property origin? - Added for request origin identification\n */\nexport interface PersonalMessageParamsMetamask\n extends AbstractMessageParamsMetamask {\n data: string;\n}\n\n/**\n * Controller in charge of managing - storing, adding, removing, updating - Messages.\n */\nexport class PersonalMessageManager extends AbstractMessageManager<\n PersonalMessage,\n PersonalMessageParams,\n PersonalMessageParamsMetamask\n> {\n /**\n * Name of this controller used during composition\n */\n override name = 'PersonalMessageManager';\n\n /**\n * Creates a new Message with an 'unapproved' status using the passed messageParams.\n * this.addMessage is called to add the new Message to this.messages, and to save the\n * unapproved Messages.\n *\n * @param messageParams - The params for the personal_sign call to be made after the message\n * is approved.\n * @param req - The original request object possibly containing the origin.\n * @returns The id of the newly created message.\n */\n async addUnapprovedMessage(\n messageParams: PersonalMessageParams,\n req?: OriginalRequest,\n ): Promise {\n validateSignMessageData(messageParams);\n if (req) {\n messageParams.origin = req.origin;\n }\n messageParams.data = normalizeMessageData(messageParams.data);\n\n const ethereumSignInData = {\n isSIWEMessage: false,\n parsedMessage: null,\n }\n const finalMsgParams = { ...messageParams, siwe: ethereumSignInData };\n\n const messageId = random();\n const messageData: PersonalMessage = {\n id: messageId,\n messageParams: finalMsgParams,\n status: 'unapproved',\n time: Date.now(),\n type: 'personal_sign',\n };\n await this.addMessage(messageData);\n this.hub.emit(`unapprovedMessage`, {\n ...finalMsgParams,\n ...{ metamaskId: messageId },\n });\n return messageId;\n }\n\n /**\n * Removes the metamaskId property from passed messageParams and returns a promise which\n * resolves the updated messageParams.\n *\n * @param messageParams - The messageParams to modify.\n * @returns Promise resolving to the messageParams with the metamaskId property removed.\n */\n prepMessageForSigning(\n messageParams: PersonalMessageParamsMetamask,\n ): Promise {\n delete messageParams.metamaskId;\n return Promise.resolve(messageParams);\n }\n}\n\nexport default PersonalMessageManager;\n"]} +\ No newline at end of file diff --git a/patches/@metamask+signature-controller+2.0.0.patch b/patches/@metamask+signature-controller+2.0.0.patch deleted file mode 100644 index ef2a6dc12b8..00000000000 --- a/patches/@metamask+signature-controller+2.0.0.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff --git a/node_modules/@metamask/signature-controller/dist/SignatureController.js b/node_modules/@metamask/signature-controller/dist/SignatureController.js -index 59dc597..cea94ca 100644 ---- a/node_modules/@metamask/signature-controller/dist/SignatureController.js -+++ b/node_modules/@metamask/signature-controller/dist/SignatureController.js -@@ -41,7 +41,13 @@ const message_manager_1 = require("@metamask/message-manager"); - const eth_rpc_errors_1 = require("eth-rpc-errors"); - const ethereumjs_util_1 = require("ethereumjs-util"); - const base_controller_1 = require("@metamask/base-controller"); --const controller_utils_1 = require("@metamask/controller-utils"); -+const ORIGIN_METAMASK = 'metamask'; -+var ApprovalType; -+(function (ApprovalType) { -+ ApprovalType["EthSign"] = "eth_sign"; -+ ApprovalType["EthSignTypedData"] = "eth_signTypedData"; -+ ApprovalType["PersonalSign"] = "personal_sign"; -+})(ApprovalType || (ApprovalType = {})); - const controllerName = 'SignatureController'; - const stateMetadata = { - unapprovedMsgs: { persist: false, anonymous: false }, -@@ -95,9 +101,9 @@ class SignatureController extends base_controller_1.BaseControllerV2 { - __classPrivateFieldSet(this, _SignatureController_messageManager, new message_manager_1.MessageManager(undefined, undefined, securityProviderRequest), "f"); - __classPrivateFieldSet(this, _SignatureController_personalMessageManager, new message_manager_1.PersonalMessageManager(undefined, undefined, securityProviderRequest), "f"); - __classPrivateFieldSet(this, _SignatureController_typedMessageManager, new message_manager_1.TypedMessageManager(undefined, undefined, securityProviderRequest, undefined, getCurrentChainId), "f"); -- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), controller_utils_1.ApprovalType.EthSign, 'unapprovedMessage'); -- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, 'unapprovedPersonalMessage'); -- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, 'unapprovedTypedMessage'); -+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), ApprovalType.EthSign, 'unapprovedMessage'); -+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), ApprovalType.PersonalSign, 'unapprovedPersonalMessage'); -+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_handleMessageManagerEvents).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), ApprovalType.EthSignTypedData, 'unapprovedTypedMessage'); - __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_subscribeToMessageState).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), (state, newMessages, messageCount) => { - state.unapprovedMsgs = newMessages; - state.unapprovedMsgCount = messageCount; -@@ -203,7 +209,7 @@ class SignatureController extends base_controller_1.BaseControllerV2 { - */ - signMessage(msgParams) { - return __awaiter(this, void 0, void 0, function* () { -- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), controller_utils_1.ApprovalType.EthSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signMessage(cleanMsgParams); })); -+ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), ApprovalType.EthSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signMessage(cleanMsgParams); })); - }); - } - /** -@@ -215,7 +221,7 @@ class SignatureController extends base_controller_1.BaseControllerV2 { - */ - signPersonalMessage(msgParams) { - return __awaiter(this, void 0, void 0, function* () { -- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); })); -+ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); })); - }); - } - /** -@@ -230,7 +236,7 @@ class SignatureController extends base_controller_1.BaseControllerV2 { - signTypedMessage(msgParams, opts = { parseJsonData: true }) { - return __awaiter(this, void 0, void 0, function* () { - const { version } = msgParams; -- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { -+ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), ApprovalType.EthSignTypedData, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { - const finalMessageParams = opts.parseJsonData - ? __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_removeJsonData).call(this, cleanMsgParams, version) - : cleanMsgParams; -@@ -370,7 +376,7 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE - return Object.assign(Object.assign(Object.assign({}, this.state.unapprovedMsgs), this.state.unapprovedPersonalMsgs), this.state.unapprovedTypedMessages)[messageId]; - }, _SignatureController_requestApproval = function _SignatureController_requestApproval(msgParams, type) { - const id = msgParams.metamaskId; -- const origin = msgParams.origin || controller_utils_1.ORIGIN_METAMASK; -+ const origin = msgParams.origin || ORIGIN_METAMASK; - this.messagingSystem - .call('ApprovalController:addRequest', { - id, diff --git a/patches/@metamask+signature-controller+4.0.1.patch b/patches/@metamask+signature-controller+4.0.1.patch new file mode 100644 index 00000000000..bfffcb0af47 --- /dev/null +++ b/patches/@metamask+signature-controller+4.0.1.patch @@ -0,0 +1,226 @@ +diff --git a/node_modules/@metamask/signature-controller/dist/.DS_Store b/node_modules/@metamask/signature-controller/dist/.DS_Store +new file mode 100644 +index 0000000..5008ddf +Binary files /dev/null and b/node_modules/@metamask/signature-controller/dist/.DS_Store differ +diff --git a/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts b/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts +index 818daf6..c310ed9 100644 +--- a/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts ++++ b/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts +@@ -18,6 +18,9 @@ declare type SignatureControllerState = { + unapprovedTypedMessagesCount: number; + }; + declare type AllowedActions = AddApprovalRequest; ++declare type TypedMessageSigningOptions = { ++ parseJsonData: boolean; ++}; + export declare type GetSignatureState = { + type: `${typeof controllerName}:getState`; + handler: () => SignatureControllerState; +@@ -123,9 +126,11 @@ export declare class SignatureController extends BaseControllerV2; ++ newUnsignedTypedMessage(messageParams: TypedMessageParams, req: OriginalRequest, version: string, signingOpts: TypedMessageSigningOptions): Promise; + setTypedMessageInProgress(messageId: string): void; + setPersonalMessageInProgress(messageId: string): void; + } +diff --git a/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts.map b/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts.map +index 7a9cec5..8a753a7 100644 +--- a/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts.map ++++ b/node_modules/@metamask/signature-controller/dist/SignatureController.d.ts.map +@@ -1 +1 @@ +-{"version":3,"file":"SignatureController.d.ts","sourceRoot":"","sources":["../src/SignatureController.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"SignatureController.d.ts","sourceRoot":"","sources":["../src/SignatureController.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/node_modules/@metamask/signature-controller/dist/SignatureController.js b/node_modules/@metamask/signature-controller/dist/SignatureController.js +index b58b27e..24bbe8c 100644 +--- a/node_modules/@metamask/signature-controller/dist/SignatureController.js ++++ b/node_modules/@metamask/signature-controller/dist/SignatureController.js +@@ -42,7 +42,28 @@ const message_manager_1 = require("@metamask/message-manager"); + const eth_rpc_errors_1 = require("eth-rpc-errors"); + const ethereumjs_util_1 = require("ethereumjs-util"); + const base_controller_1 = require("@metamask/base-controller"); +-const controller_utils_1 = require("@metamask/controller-utils"); ++const ORIGIN_METAMASK = 'metamask'; ++var ApprovalType; ++(function (ApprovalType) { ++ ApprovalType["AddEthereumChain"] = "wallet_addEthereumChain"; ++ ApprovalType["ConnectAccounts"] = "connect_accounts"; ++ ApprovalType["EthDecrypt"] = "eth_decrypt"; ++ ApprovalType["EthGetEncryptionPublicKey"] = "eth_getEncryptionPublicKey"; ++ ApprovalType["EthSign"] = "eth_sign"; ++ ApprovalType["EthSignTypedData"] = "eth_signTypedData"; ++ ApprovalType["PersonalSign"] = "personal_sign"; ++ ApprovalType["ResultError"] = "result_error"; ++ ApprovalType["ResultSuccess"] = "result_success"; ++ ApprovalType["SnapDialogAlert"] = "snap_dialog:alert"; ++ ApprovalType["SnapDialogConfirmation"] = "snap_dialog:confirmation"; ++ ApprovalType["SnapDialogPrompt"] = "snap_dialog:prompt"; ++ ApprovalType["SwitchEthereumChain"] = "wallet_switchEthereumChain"; ++ ApprovalType["Transaction"] = "transaction"; ++ ApprovalType["Unlock"] = "unlock"; ++ ApprovalType["WalletConnect"] = "wallet_connect"; ++ ApprovalType["WalletRequestPermissions"] = "wallet_requestPermissions"; ++ ApprovalType["WatchAsset"] = "wallet_watchAsset"; ++})(ApprovalType || (ApprovalType = {})); + const controllerName = 'SignatureController'; + const stateMetadata = { + unapprovedMsgs: { persist: false, anonymous: false }, +@@ -172,7 +193,7 @@ class SignatureController extends base_controller_1.BaseControllerV2 { + */ + newUnsignedMessage(messageParams, req) { + return __awaiter(this, void 0, void 0, function* () { +- return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), controller_utils_1.ApprovalType.EthSign, 'Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signMessage).bind(this), messageParams, req, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_validateUnsignedMessage).bind(this)); ++ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), ApprovalType.EthSign, 'Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signMessage).bind(this), messageParams, req, __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_validateUnsignedMessage).bind(this)); + }); + } + /** +@@ -188,7 +209,7 @@ class SignatureController extends base_controller_1.BaseControllerV2 { + */ + newUnsignedPersonalMessage(messageParams, req) { + return __awaiter(this, void 0, void 0, function* () { +- return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, 'Personal Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signPersonalMessage).bind(this), messageParams, req); ++ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), ApprovalType.PersonalSign, 'Personal Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signPersonalMessage).bind(this), messageParams, req); + }); + } + /** +@@ -197,13 +218,13 @@ class SignatureController extends base_controller_1.BaseControllerV2 { + * @param messageParams - The params passed to eth_signTypedData. + * @param req - The original request, containing the origin. + * @param version - The version indicating the format of the typed data. ++ * @param signingOpts - An options bag for signing. ++ * @param signingOpts.parseJsonData - Whether to parse the JSON before signing. + * @returns Promise resolving to the raw data of the signature request. + */ +- newUnsignedTypedMessage(messageParams, req, version) { ++ newUnsignedTypedMessage(messageParams, req, version, signingOpts) { + return __awaiter(this, void 0, void 0, function* () { +- return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, 'Typed Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signTypedMessage).bind(this), messageParams, req, undefined, version, { +- parseJsonData: true, +- }); ++ return __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_newUnsignedAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), ApprovalType.EthSignTypedData, 'Typed Message', __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signTypedMessage).bind(this), messageParams, req, undefined, version, signingOpts); + }); + } + setTypedMessageInProgress(messageId) { +@@ -230,34 +251,45 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE + if (validateMessage) { + validateMessage(messageParams); + } +- const messageId = yield messageManager.addUnapprovedMessage(messageParams, req, version); +- const messageParamsWithId = Object.assign(Object.assign({}, messageParams), { metamaskId: messageId }); +- const signaturePromise = messageManager.waitForFinishStatus(messageParamsWithId, messageName); ++ let resultCallbacks; + try { +- yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_requestApproval).call(this, messageParamsWithId, approvalType); ++ const messageId = yield messageManager.addUnapprovedMessage(messageParams, req, version); ++ const messageParamsWithId = Object.assign(Object.assign(Object.assign({}, messageParams), { metamaskId: messageId }), (version && { version })); ++ const signaturePromise = messageManager.waitForFinishStatus(messageParamsWithId, messageName); ++ try { ++ const acceptResult = yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_requestApproval).call(this, messageParamsWithId, approvalType); ++ resultCallbacks = acceptResult.resultCallbacks; ++ } ++ catch (_a) { ++ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId); ++ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.'); ++ } ++ yield signMessage(messageParamsWithId, signingOpts); ++ const signatureResult = yield signaturePromise; ++ /* istanbul ignore next */ ++ resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.success(signatureResult); ++ return signatureResult; + } + catch (error) { +- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId); +- throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.'); ++ resultCallbacks === null || resultCallbacks === void 0 ? void 0 : resultCallbacks.error(error); ++ throw error; + } +- yield signMessage(messageParamsWithId, version, signingOpts); +- return signaturePromise; + }); + }, _SignatureController_signMessage = function _SignatureController_signMessage(msgParams) { + return __awaiter(this, void 0, void 0, function* () { +- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), controller_utils_1.ApprovalType.EthSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signMessage(cleanMsgParams); })); ++ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_messageManager, "f"), ApprovalType.EthSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signMessage(cleanMsgParams); })); + }); + }, _SignatureController_signPersonalMessage = function _SignatureController_signPersonalMessage(msgParams) { + return __awaiter(this, void 0, void 0, function* () { +- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); })); ++ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); })); + }); +-}, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams, version, opts) { ++}, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams, ++/* istanbul ignore next */ ++opts = { parseJsonData: true }) { + return __awaiter(this, void 0, void 0, function* () { +- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), controller_utils_1.ApprovalType.EthSignTypedData, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { +- // Options will allways be defined, but we want to satisfy the TS +- // hence we ignore the branch here +- /* istanbul ignore next */ +- const finalMessageParams = (opts === null || opts === void 0 ? void 0 : opts.parseJsonData) ++ const { version } = msgParams; ++ return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_typedMessageManager, "f"), ApprovalType.EthSignTypedData, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { ++ const finalMessageParams = opts.parseJsonData + ? __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_removeJsonData).call(this, cleanMsgParams, version) + : cleanMsgParams; + return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signTypedMessage(finalMessageParams, { +@@ -280,12 +312,18 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE + const messageId = msgParams.metamaskId; + try { + const cleanMessageParams = yield messageManager.approveMessage(msgParams); +- const signature = yield getSignature(cleanMessageParams); +- this.hub.emit(`${methodName}:signed`, { signature, messageId }); +- if (!cleanMessageParams.deferSetAsSigned) { +- messageManager.setMessageStatusSigned(messageId, signature); ++ try { ++ const signature = yield getSignature(cleanMessageParams); ++ this.hub.emit(`${methodName}:signed`, { signature, messageId }); ++ if (!cleanMessageParams.deferSetAsSigned) { ++ messageManager.setMessageStatusSigned(messageId, signature); ++ } ++ return signature; ++ } ++ catch (error) { ++ this.hub.emit(`${messageId}:signError`, { error }); ++ throw error; + } +- return signature; + } + catch (error) { + console.info(`MetaMaskController - ${methodName} failed.`, error); +@@ -347,16 +385,17 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE + }, _SignatureController_requestApproval = function _SignatureController_requestApproval(msgParams, type) { + return __awaiter(this, void 0, void 0, function* () { + const id = msgParams.metamaskId; +- const origin = msgParams.origin || controller_utils_1.ORIGIN_METAMASK; ++ const origin = msgParams.origin || ORIGIN_METAMASK; + // We are explicitly cloning the message params here to prevent the mutation errors on development mode + // Because sending it through the messaging system will make the object read only + const clonedMsgParams = (0, lodash_1.cloneDeep)(msgParams); +- return this.messagingSystem.call('ApprovalController:addRequest', { ++ return (yield this.messagingSystem.call('ApprovalController:addRequest', { + id, + origin, + type, + requestData: clonedMsgParams, +- }, true); ++ expectsResult: true, ++ }, true)); + }); + }, _SignatureController_removeJsonData = function _SignatureController_removeJsonData(messageParams, version) { + if (version === 'V1' || typeof messageParams.data !== 'string') { +diff --git a/node_modules/@metamask/signature-controller/dist/SignatureController.js.map b/node_modules/@metamask/signature-controller/dist/SignatureController.js.map +index a0773f6..d21d25a 100644 +--- a/node_modules/@metamask/signature-controller/dist/SignatureController.js.map ++++ b/node_modules/@metamask/signature-controller/dist/SignatureController.js.map +@@ -1 +1 @@ +-{"version":3,"file":"SignatureController.js","sourceRoot":"","sources":["../src/SignatureController.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events';\nimport type { Hex } from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\nimport {\n MessageManager,\n MessageParams,\n MessageParamsMetamask,\n PersonalMessageManager,\n PersonalMessageParams,\n PersonalMessageParamsMetamask,\n TypedMessageManager,\n TypedMessageParams,\n TypedMessageParamsMetamask,\n AbstractMessageManager,\n AbstractMessage,\n MessageManagerState,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n OriginalRequest,\n} from '@metamask/message-manager';\nimport { ethErrors } from 'eth-rpc-errors';\nimport { bufferToHex } from 'ethereumjs-util';\n\nimport {\n BaseControllerV2,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { Patch } from 'immer';\nimport { AddApprovalRequest } from '@metamask/approval-controller';\nimport { ApprovalType, ORIGIN_METAMASK } from '@metamask/controller-utils';\n\nconst controllerName = 'SignatureController';\n\nconst stateMetadata = {\n unapprovedMsgs: { persist: false, anonymous: false },\n unapprovedPersonalMsgs: { persist: false, anonymous: false },\n unapprovedTypedMessages: { persist: false, anonymous: false },\n unapprovedMsgCount: { persist: false, anonymous: false },\n unapprovedPersonalMsgCount: { persist: false, anonymous: false },\n unapprovedTypedMessagesCount: { persist: false, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n unapprovedMsgs: {},\n unapprovedPersonalMsgs: {},\n unapprovedTypedMessages: {},\n unapprovedMsgCount: 0,\n unapprovedPersonalMsgCount: 0,\n unapprovedTypedMessagesCount: 0,\n});\n\ntype CoreMessage = AbstractMessage & {\n messageParams: AbstractMessageParams;\n};\n\ntype StateMessage = Required & {\n msgParams: Required;\n};\n\ntype SignatureControllerState = {\n unapprovedMsgs: Record;\n unapprovedPersonalMsgs: Record;\n unapprovedTypedMessages: Record;\n unapprovedMsgCount: number;\n unapprovedPersonalMsgCount: number;\n unapprovedTypedMessagesCount: number;\n};\n\ntype AllowedActions = AddApprovalRequest;\n\ntype TypedMessageSigningOptions = {\n parseJsonData: boolean;\n};\n\nexport type GetSignatureState = {\n type: `${typeof controllerName}:getState`;\n handler: () => SignatureControllerState;\n};\n\nexport type SignatureStateChange = {\n type: `${typeof controllerName}:stateChange`;\n payload: [SignatureControllerState, Patch[]];\n};\n\nexport type SignatureControllerActions = GetSignatureState;\n\nexport type SignatureControllerEvents = SignatureStateChange;\n\nexport type SignatureControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SignatureControllerActions | AllowedActions,\n SignatureControllerEvents,\n AllowedActions['type'],\n never\n>;\n\nexport interface KeyringController {\n signMessage: (messsageParams: MessageParams) => Promise;\n signPersonalMessage: (\n messsageParams: PersonalMessageParams,\n ) => Promise;\n signTypedMessage: (\n messsageParams: TypedMessageParams,\n options: { version: string | undefined },\n ) => Promise;\n}\n\nexport type SignatureControllerOptions = {\n messenger: SignatureControllerMessenger;\n keyringController: KeyringController;\n isEthSignEnabled: () => boolean;\n getAllState: () => unknown;\n securityProviderRequest?: (\n requestData: any,\n methodName: string,\n ) => Promise;\n getCurrentChainId: () => Hex;\n};\n\n/**\n * Controller for creating signing requests requiring user approval.\n */\nexport class SignatureController extends BaseControllerV2<\n typeof controllerName,\n SignatureControllerState,\n SignatureControllerMessenger\n> {\n hub: EventEmitter;\n\n #keyringController: KeyringController;\n\n #isEthSignEnabled: () => boolean;\n\n #getAllState: () => any;\n\n #messageManager: MessageManager;\n\n #personalMessageManager: PersonalMessageManager;\n\n #typedMessageManager: TypedMessageManager;\n\n /**\n * Construct a Sign controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the sign controller.\n * @param options.keyringController - An instance of a keyring controller used to perform the signing operations.\n * @param options.isEthSignEnabled - Callback to return true if eth_sign is enabled.\n * @param options.getAllState - Callback to retrieve all user state.\n * @param options.securityProviderRequest - A function for verifying a message, whether it is malicious or not.\n * @param options.getCurrentChainId - A function for retrieving the current chainId.\n */\n constructor({\n messenger,\n keyringController,\n isEthSignEnabled,\n getAllState,\n securityProviderRequest,\n getCurrentChainId,\n }: SignatureControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: getDefaultState(),\n });\n\n this.#keyringController = keyringController;\n this.#isEthSignEnabled = isEthSignEnabled;\n this.#getAllState = getAllState;\n\n this.hub = new EventEmitter();\n this.#messageManager = new MessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n );\n this.#personalMessageManager = new PersonalMessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n );\n this.#typedMessageManager = new TypedMessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n undefined,\n getCurrentChainId,\n );\n\n this.#handleMessageManagerEvents(this.#messageManager, 'unapprovedMessage');\n this.#handleMessageManagerEvents(\n this.#personalMessageManager,\n 'unapprovedPersonalMessage',\n );\n this.#handleMessageManagerEvents(\n this.#typedMessageManager,\n 'unapprovedTypedMessage',\n );\n\n this.#subscribeToMessageState(\n this.#messageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedMsgs = newMessages;\n state.unapprovedMsgCount = messageCount;\n },\n );\n\n this.#subscribeToMessageState(\n this.#personalMessageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedPersonalMsgs = newMessages;\n state.unapprovedPersonalMsgCount = messageCount;\n },\n );\n\n this.#subscribeToMessageState(\n this.#typedMessageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedTypedMessages = newMessages;\n state.unapprovedTypedMessagesCount = messageCount;\n },\n );\n }\n\n /**\n * A getter for the number of 'unapproved' Messages in this.messages.\n *\n * @returns The number of 'unapproved' Messages in this.messages\n */\n get unapprovedMsgCount(): number {\n return this.#messageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for the number of 'unapproved' PersonalMessages in this.messages.\n *\n * @returns The number of 'unapproved' PersonalMessages in this.messages\n */\n get unapprovedPersonalMessagesCount(): number {\n return this.#personalMessageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for the number of 'unapproved' TypedMessages in this.messages.\n *\n * @returns The number of 'unapproved' TypedMessages in this.messages\n */\n get unapprovedTypedMessagesCount(): number {\n return this.#typedMessageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * Reset the controller state to the initial state.\n */\n resetState() {\n this.update(() => getDefaultState());\n }\n\n /**\n * Reject all unapproved messages of any type.\n *\n * @param reason - A message to indicate why.\n */\n rejectUnapproved(reason?: string) {\n this.#rejectUnapproved(this.#messageManager, reason);\n this.#rejectUnapproved(this.#personalMessageManager, reason);\n this.#rejectUnapproved(this.#typedMessageManager, reason);\n }\n\n /**\n * Clears all unapproved messages from memory.\n */\n clearUnapproved() {\n this.#clearUnapproved(this.#messageManager);\n this.#clearUnapproved(this.#personalMessageManager);\n this.#clearUnapproved(this.#typedMessageManager);\n }\n\n /**\n * Called when a Dapp uses the eth_sign method, to request user approval.\n * eth_sign is a pure signature of arbitrary data. It is on a deprecation\n * path, since this data can be a transaction, or can leak private key\n * information.\n *\n * @param messageParams - The params passed to eth_sign.\n * @param [req] - The original request, containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedMessage(\n messageParams: MessageParams,\n req: OriginalRequest,\n ): Promise {\n return this.#newUnsignedAbstractMessage(\n this.#messageManager,\n ApprovalType.EthSign,\n 'Message',\n this.#signMessage.bind(this),\n messageParams,\n req,\n this.#validateUnsignedMessage.bind(this),\n );\n }\n\n /**\n * Called when a dapp uses the personal_sign method.\n * This is identical to the Geth eth_sign method, and may eventually replace\n * eth_sign.\n *\n * We currently define our eth_sign and personal_sign mostly for legacy Dapps.\n *\n * @param messageParams - The params of the message to sign & return to the Dapp.\n * @param req - The original request, containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedPersonalMessage(\n messageParams: PersonalMessageParams,\n req: OriginalRequest,\n ): Promise {\n return this.#newUnsignedAbstractMessage(\n this.#personalMessageManager,\n ApprovalType.PersonalSign,\n 'Personal Message',\n this.#signPersonalMessage.bind(this),\n messageParams,\n req,\n );\n }\n\n /**\n * Called when a dapp uses the eth_signTypedData method, per EIP 712.\n *\n * @param messageParams - The params passed to eth_signTypedData.\n * @param req - The original request, containing the origin.\n * @param version - The version indicating the format of the typed data.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedTypedMessage(\n messageParams: TypedMessageParams,\n req: OriginalRequest,\n version: string,\n ): Promise {\n return this.#newUnsignedAbstractMessage(\n this.#typedMessageManager,\n ApprovalType.EthSignTypedData,\n 'Typed Message',\n this.#signTypedMessage.bind(this),\n messageParams,\n req,\n undefined,\n version,\n {\n parseJsonData: true,\n },\n );\n }\n\n setTypedMessageInProgress(messageId: string) {\n this.#typedMessageManager.setMessageStatusInProgress(messageId);\n }\n\n setPersonalMessageInProgress(messageId: string) {\n this.#personalMessageManager.setMessageStatusInProgress(messageId);\n }\n\n #validateUnsignedMessage(messageParams: MessageParamsMetamask): void {\n if (!this.#isEthSignEnabled()) {\n throw ethErrors.rpc.methodNotFound(\n 'eth_sign has been disabled. You must enable it in the advanced settings',\n );\n }\n const data = this.#normalizeMsgData(messageParams.data);\n // 64 hex + \"0x\" at the beginning\n // This is needed because Ethereum's EcSign works only on 32 byte numbers\n // For 67 length see: https://github.com/MetaMask/metamask-extension/pull/12679/files#r749479607\n if (data.length !== 66 && data.length !== 67) {\n throw ethErrors.rpc.invalidParams(\n 'eth_sign requires 32 byte message hash',\n );\n }\n }\n\n async #newUnsignedAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n SO,\n >(\n messageManager: AbstractMessageManager,\n approvalType: ApprovalType,\n messageName: string,\n signMessage: (\n messageParams: PM,\n version?: string,\n signingOpts?: SO,\n ) => void,\n messageParams: PM,\n req: OriginalRequest,\n validateMessage?: (params: PM) => void,\n version?: string,\n signingOpts?: SO,\n ) {\n if (validateMessage) {\n validateMessage(messageParams);\n }\n\n const messageId = await messageManager.addUnapprovedMessage(\n messageParams,\n req,\n version,\n );\n\n const messageParamsWithId = {\n ...messageParams,\n metamaskId: messageId,\n };\n\n const signaturePromise = messageManager.waitForFinishStatus(\n messageParamsWithId,\n messageName,\n );\n\n try {\n await this.#requestApproval(messageParamsWithId, approvalType);\n } catch (error) {\n this.#cancelAbstractMessage(messageManager, messageId);\n throw ethErrors.provider.userRejectedRequest(\n 'User rejected the request.',\n );\n }\n await signMessage(messageParamsWithId, version, signingOpts);\n\n return signaturePromise;\n }\n\n /**\n * Signifies user intent to complete an eth_sign method.\n *\n * @param msgParams - The params passed to eth_call.\n * @returns Signature result from signing.\n */\n async #signMessage(msgParams: MessageParamsMetamask) {\n return await this.#signAbstractMessage(\n this.#messageManager,\n ApprovalType.EthSign,\n msgParams,\n async (cleanMsgParams) =>\n await this.#keyringController.signMessage(cleanMsgParams),\n );\n }\n\n /**\n * Signifies a user's approval to sign a personal_sign message in queue.\n * Triggers signing, and the callback function from newUnsignedPersonalMessage.\n *\n * @param msgParams - The params of the message to sign & return to the Dapp.\n * @returns Signature result from signing.\n */\n async #signPersonalMessage(msgParams: PersonalMessageParamsMetamask) {\n return await this.#signAbstractMessage(\n this.#personalMessageManager,\n ApprovalType.PersonalSign,\n msgParams,\n async (cleanMsgParams) =>\n await this.#keyringController.signPersonalMessage(cleanMsgParams),\n );\n }\n\n /**\n * The method for a user approving a call to eth_signTypedData, per EIP 712.\n * Triggers the callback in newUnsignedTypedMessage.\n *\n * @param msgParams - The params passed to eth_signTypedData.\n * @param version - The version indicating the format of the typed data.\n * @param opts - The options for the method.\n * @param opts.parseJsonData - Whether to parse JSON data before calling the KeyringController.\n * @returns Signature result from signing.\n */\n async #signTypedMessage(\n msgParams: TypedMessageParamsMetamask,\n version?: string,\n opts?: TypedMessageSigningOptions,\n ): Promise {\n return await this.#signAbstractMessage(\n this.#typedMessageManager,\n ApprovalType.EthSignTypedData,\n msgParams,\n async (cleanMsgParams) => {\n // Options will allways be defined, but we want to satisfy the TS\n // hence we ignore the branch here\n /* istanbul ignore next */\n const finalMessageParams = opts?.parseJsonData\n ? this.#removeJsonData(cleanMsgParams, version as string)\n : cleanMsgParams;\n\n return await this.#keyringController.signTypedMessage(\n finalMessageParams,\n {\n version,\n },\n );\n },\n );\n }\n\n #rejectUnapproved<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager, reason?: string) {\n Object.keys(messageManager.getUnapprovedMessages()).forEach((messageId) => {\n this.#cancelAbstractMessage(messageManager, messageId, reason);\n });\n }\n\n #clearUnapproved<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager) {\n messageManager.update({\n unapprovedMessages: {},\n unapprovedMessagesCount: 0,\n });\n }\n\n async #signAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n methodName: string,\n msgParams: PM,\n getSignature: (cleanMessageParams: P) => Promise,\n ) {\n console.info(`MetaMaskController - ${methodName}`);\n\n const messageId = msgParams.metamaskId as string;\n\n try {\n const cleanMessageParams = await messageManager.approveMessage(msgParams);\n const signature = await getSignature(cleanMessageParams);\n\n this.hub.emit(`${methodName}:signed`, { signature, messageId });\n\n if (!cleanMessageParams.deferSetAsSigned) {\n messageManager.setMessageStatusSigned(messageId, signature);\n }\n\n return signature;\n } catch (error: any) {\n console.info(`MetaMaskController - ${methodName} failed.`, error);\n this.#errorMessage(messageManager, messageId, error.message);\n throw error;\n }\n }\n\n #errorMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n messageId: string,\n error: string,\n ) {\n if (messageManager instanceof TypedMessageManager) {\n messageManager.setMessageStatusErrored(messageId, error);\n } else {\n this.#cancelAbstractMessage(messageManager, messageId);\n }\n }\n\n #cancelAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n messageId: string,\n reason?: string,\n ) {\n if (reason) {\n const message = this.#getMessage(messageId);\n this.hub.emit('cancelWithReason', { message, reason });\n }\n messageManager.rejectMessage(messageId);\n }\n\n #handleMessageManagerEvents<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager, eventName: string) {\n messageManager.hub.on('updateBadge', () => {\n this.hub.emit('updateBadge');\n });\n\n messageManager.hub.on(\n 'unapprovedMessage',\n (msgParams: AbstractMessageParamsMetamask) => {\n this.hub.emit(eventName, msgParams);\n },\n );\n }\n\n #subscribeToMessageState<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n updateState: (\n state: SignatureControllerState,\n newMessages: Record,\n messageCount: number,\n ) => void,\n ) {\n messageManager.subscribe((state: MessageManagerState) => {\n const newMessages = this.#migrateMessages(\n state.unapprovedMessages as any,\n );\n\n this.update(() => {\n const newState = { ...this.state };\n updateState(newState, newMessages, state.unapprovedMessagesCount);\n return newState;\n });\n });\n }\n\n #migrateMessages(\n coreMessages: Record,\n ): Record {\n const stateMessages: Record = {};\n\n for (const messageId of Object.keys(coreMessages)) {\n const coreMessage = coreMessages[messageId];\n const stateMessage = this.#migrateMessage(coreMessage);\n\n stateMessages[messageId] = stateMessage;\n }\n\n return stateMessages;\n }\n\n #migrateMessage(coreMessage: CoreMessage): StateMessage {\n const { messageParams, ...coreMessageData } = coreMessage;\n\n // Core message managers use messageParams but frontend uses msgParams with lots of references\n const stateMessage = {\n ...coreMessageData,\n msgParams: messageParams,\n };\n\n return stateMessage as StateMessage;\n }\n\n #normalizeMsgData(data: string) {\n if (data.slice(0, 2) === '0x') {\n // data is already hex\n return data;\n }\n // data is unicode, convert to hex\n return bufferToHex(Buffer.from(data, 'utf8'));\n }\n\n #getMessage(messageId: string): StateMessage {\n return {\n ...this.state.unapprovedMsgs,\n ...this.state.unapprovedPersonalMsgs,\n ...this.state.unapprovedTypedMessages,\n }[messageId];\n }\n\n async #requestApproval(\n msgParams: AbstractMessageParamsMetamask,\n type: ApprovalType,\n ) {\n const id = msgParams.metamaskId as string;\n const origin = msgParams.origin || ORIGIN_METAMASK;\n\n // We are explicitly cloning the message params here to prevent the mutation errors on development mode\n // Because sending it through the messaging system will make the object read only\n const clonedMsgParams = cloneDeep(msgParams);\n\n return this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData: clonedMsgParams as Required,\n },\n true,\n );\n }\n\n #removeJsonData(\n messageParams: TypedMessageParams,\n version: string,\n ): TypedMessageParams {\n if (version === 'V1' || typeof messageParams.data !== 'string') {\n return messageParams;\n }\n\n return {\n ...messageParams,\n data: JSON.parse(messageParams.data),\n };\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"SignatureController.js","sourceRoot":"","sources":["../src/SignatureController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAkC;AAElC,mCAAmC;AACnC,+DAgBmC;AACnC,mDAA2C;AAC3C,qDAA8C;AAE9C,+DAGmC;AAQnC,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,IAAK,YAmBJ;AAnBD,WAAK,YAAY;IACf,4DAA4C,CAAA;IAC5C,oDAAoC,CAAA;IACpC,0CAA0B,CAAA;IAC1B,wEAAwD,CAAA;IACxD,oCAAoB,CAAA;IACpB,sDAAsC,CAAA;IACtC,8CAA8B,CAAA;IAC9B,4CAA4B,CAAA;IAC5B,gDAAgC,CAAA;IAChC,qDAAqC,CAAA;IACrC,mEAAmD,CAAA;IACnD,uDAAuC,CAAA;IACvC,kEAAkD,CAAA;IAClD,2CAA2B,CAAA;IAC3B,iCAAiB,CAAA;IACjB,gDAAgC,CAAA;IAChC,sEAAsD,CAAA;IACtD,gDAAgC,CAAA;AAClC,CAAC,EAnBI,YAAY,KAAZ,YAAY,QAmBhB;AAED,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C,MAAM,aAAa,GAAG;IACpB,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACpD,sBAAsB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5D,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7D,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACxD,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAChE,4BAA4B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;CACnE,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,EAAE;IAClB,sBAAsB,EAAE,EAAE;IAC1B,uBAAuB,EAAE,EAAE;IAC3B,kBAAkB,EAAE,CAAC;IACrB,0BAA0B,EAAE,CAAC;IAC7B,4BAA4B,EAAE,CAAC;CAChC,CAAC,CAAC;AAsEH;;GAEG;AACH,MAAa,mBAAoB,SAAQ,kCAIxC;IAeC;;;;;;;;;;OAUG;IACH,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACvB,iBAAiB,GACU;QAC3B,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,eAAe,EAAE;SACzB,CAAC,CAAC;;QApCL,yDAAsC;QAEtC,wDAAiC;QAEjC,mDAAwB;QAExB,sDAAgC;QAEhC,8DAAgD;QAEhD,2DAA0C;QA4BxC,uBAAA,IAAI,0CAAsB,iBAAiB,MAAA,CAAC;QAC5C,uBAAA,IAAI,yCAAqB,gBAAgB,MAAA,CAAC;QAC1C,uBAAA,IAAI,oCAAgB,WAAW,MAAA,CAAC;QAEhC,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAE,CAAC;QAC9B,uBAAA,IAAI,uCAAmB,IAAI,gCAAc,CACvC,SAAS,EACT,SAAS,EACT,uBAAuB,CACxB,MAAA,CAAC;QACF,uBAAA,IAAI,+CAA2B,IAAI,wCAAsB,CACvD,SAAS,EACT,SAAS,EACT,uBAAuB,CACxB,MAAA,CAAC;QACF,uBAAA,IAAI,4CAAwB,IAAI,qCAAmB,CACjD,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,SAAS,EACT,iBAAiB,CAClB,MAAA,CAAC;QAEF,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EAA6B,uBAAA,IAAI,2CAAgB,EAAE,mBAAmB,CAAC,CAAC;QAC5E,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACF,uBAAA,IAAI,mDAAwB,EAC5B,2BAA2B,CAC5B,CAAC;QACF,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACF,uBAAA,IAAI,gDAAqB,EACzB,wBAAwB,CACzB,CAAC;QAEF,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,EACF,uBAAA,IAAI,2CAAgB,EACpB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;YACnC,KAAK,CAAC,cAAc,GAAG,WAAW,CAAC;YACnC,KAAK,CAAC,kBAAkB,GAAG,YAAY,CAAC;QAC1C,CAAC,CACF,CAAC;QAEF,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,EACF,uBAAA,IAAI,mDAAwB,EAC5B,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;YACnC,KAAK,CAAC,sBAAsB,GAAG,WAAW,CAAC;YAC3C,KAAK,CAAC,0BAA0B,GAAG,YAAY,CAAC;QAClD,CAAC,CACF,CAAC;QAEF,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,EACF,uBAAA,IAAI,gDAAqB,EACzB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;YACnC,KAAK,CAAC,uBAAuB,GAAG,WAAW,CAAC;YAC5C,KAAK,CAAC,4BAA4B,GAAG,YAAY,CAAC;QACpD,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,IAAI,kBAAkB;QACpB,OAAO,uBAAA,IAAI,2CAAgB,CAAC,0BAA0B,EAAE,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,IAAI,+BAA+B;QACjC,OAAO,uBAAA,IAAI,mDAAwB,CAAC,0BAA0B,EAAE,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,IAAI,4BAA4B;QAC9B,OAAO,uBAAA,IAAI,gDAAqB,CAAC,0BAA0B,EAAE,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,MAAe;QAC9B,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,uBAAA,IAAI,2CAAgB,EAAE,MAAM,CAAC,CAAC;QACrD,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,uBAAA,IAAI,mDAAwB,EAAE,MAAM,CAAC,CAAC;QAC7D,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,uBAAA,IAAI,gDAAqB,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,eAAe;QACb,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,uBAAA,IAAI,2CAAgB,CAAC,CAAC;QAC5C,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,uBAAA,IAAI,mDAAwB,CAAC,CAAC;QACpD,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAAkB,uBAAA,IAAI,gDAAqB,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;;;OASG;IACG,kBAAkB,CACtB,aAA4B,EAC5B,GAAoB;;YAEpB,OAAO,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACT,uBAAA,IAAI,2CAAgB,EACpB,YAAY,CAAC,OAAO,EACpB,SAAS,EACT,uBAAA,IAAI,wEAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,aAAa,EACb,GAAG,EACH,uBAAA,IAAI,oFAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CACzC,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;;;;OAUG;IACG,0BAA0B,CAC9B,aAAoC,EACpC,GAAoB;;YAEpB,OAAO,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACT,uBAAA,IAAI,mDAAwB,EAC5B,YAAY,CAAC,YAAY,EACzB,kBAAkB,EAClB,uBAAA,IAAI,gFAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,aAAa,EACb,GAAG,CACJ,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;;;OASG;IACG,uBAAuB,CAC3B,aAAiC,EACjC,GAAoB,EACpB,OAAe,EACf,WAAuC;;YAEvC,OAAO,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EACT,uBAAA,IAAI,gDAAqB,EACzB,YAAY,CAAC,gBAAgB,EAC7B,eAAe,EACf,uBAAA,IAAI,6EAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EACjC,aAAa,EACb,GAAG,EACH,SAAS,EACT,OAAO,EACP,WAAW,CACZ,CAAC;QACJ,CAAC;KAAA;IAED,yBAAyB,CAAC,SAAiB;QACzC,uBAAA,IAAI,gDAAqB,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,4BAA4B,CAAC,SAAiB;QAC5C,uBAAA,IAAI,mDAAwB,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;CA8WF;AAhmBD,kDAgmBC;keA5W0B,aAAoC;IAC3D,IAAI,CAAC,uBAAA,IAAI,6CAAkB,MAAtB,IAAI,CAAoB,EAAE;QAC7B,MAAM,0BAAS,CAAC,GAAG,CAAC,cAAc,CAChC,yEAAyE,CAC1E,CAAC;KACH;IACD,MAAM,IAAI,GAAG,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,EAAmB,aAAa,CAAC,IAAI,CAAC,CAAC;IACxD,iCAAiC;IACjC,yEAAyE;IACzE,gGAAgG;IAChG,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE;QAC5C,MAAM,0BAAS,CAAC,GAAG,CAAC,aAAa,CAC/B,wCAAwC,CACzC,CAAC;KACH;AACH,CAAC,6GAQC,cAAgD,EAChD,YAA0B,EAC1B,WAAmB,EACnB,WAA0D,EAC1D,aAAiB,EACjB,GAAoB,EACpB,eAAsC,EACtC,OAAgB,EAChB,WAAgB;;QAEhB,IAAI,eAAe,EAAE;YACnB,eAAe,CAAC,aAAa,CAAC,CAAC;SAChC;QAED,IAAI,eAAkD,CAAC;QACvD,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,oBAAoB,CACzD,aAAa,EACb,GAAG,EACH,OAAO,CACR,CAAC;YAEF,MAAM,mBAAmB,iDACpB,aAAa,KAChB,UAAU,EAAE,SAAS,KAClB,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC,CAC5B,CAAC;YAEF,MAAM,gBAAgB,GAAG,cAAc,CAAC,mBAAmB,CACzD,mBAAmB,EACnB,WAAW,CACZ,CAAC;YAEF,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EAC7B,mBAAmB,EACnB,YAAY,CACb,CAAC;gBAEF,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC;aAChD;YAAC,WAAM;gBACN,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM,0BAAS,CAAC,QAAQ,CAAC,mBAAmB,CAC1C,4BAA4B,CAC7B,CAAC;aACH;YAED,MAAM,WAAW,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAEpD,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC;YAE/C,0BAA0B;YAC1B,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YAE1C,OAAO,eAAe,CAAC;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,CAAC,KAAc,CAAC,CAAC;YACvC,MAAM,KAAK,CAAC;SACb;IACH,CAAC;gFAQkB,SAAgC;;QACjD,OAAO,MAAM,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,EACf,uBAAA,IAAI,2CAAgB,EACpB,YAAY,CAAC,OAAO,EACpB,SAAS,EACT,CAAO,cAAc,EAAE,EAAE,gDACvB,OAAA,MAAM,uBAAA,IAAI,8CAAmB,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA,GAAA,CAC5D,CAAC;IACJ,CAAC;gGAS0B,SAAwC;;QACjE,OAAO,MAAM,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,EACf,uBAAA,IAAI,mDAAwB,EAC5B,YAAY,CAAC,YAAY,EACzB,SAAS,EACT,CAAO,cAAc,EAAE,EAAE,gDACvB,OAAA,MAAM,uBAAA,IAAI,8CAAmB,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAA,GAAA,CACpE,CAAC;IACJ,CAAC;0FAYC,SAAqC;AACrC,0BAA0B;AAC1B,IAAI,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE;;QAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QAC9B,OAAO,MAAM,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,EACf,uBAAA,IAAI,gDAAqB,EACzB,YAAY,CAAC,gBAAgB,EAC7B,SAAS,EACT,CAAO,cAAc,EAAE,EAAE;YACvB,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa;gBAC3C,CAAC,CAAC,uBAAA,IAAI,2EAAgB,MAApB,IAAI,EAAiB,cAAc,EAAE,OAAiB,CAAC;gBACzD,CAAC,CAAC,cAAc,CAAC;YAEnB,OAAO,MAAM,uBAAA,IAAI,8CAAmB,CAAC,gBAAgB,CACnD,kBAAkB,EAClB;gBACE,OAAO;aACR,CACF,CAAC;QACJ,CAAC,CAAA,CACF,CAAC;IACJ,CAAC;0FAMC,cAAgD,EAAE,MAAe;IACjE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACxE,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,uFAMC,cAAgD;IAChD,cAAc,CAAC,MAAM,CAAC;QACpB,kBAAkB,EAAE,EAAE;QACtB,uBAAuB,EAAE,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC,+FAOC,cAAgD,EAChD,UAAkB,EAClB,SAAa,EACb,YAAqD;;QAErD,OAAO,CAAC,IAAI,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAoB,CAAC;QAEjD,IAAI;YACF,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAE1E,IAAI;gBACF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,CAAC;gBAEzD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBAEhE,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;oBACxC,cAAc,CAAC,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBAC7D;gBAED,OAAO,SAAS,CAAC;aAClB;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnD,MAAM,KAAK,CAAC;aACb;SACF;QAAC,OAAO,KAAU,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,wBAAwB,UAAU,UAAU,EAAE,KAAK,CAAC,CAAC;YAClE,uBAAA,IAAI,yEAAc,MAAlB,IAAI,EAAe,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;SACb;IACH,CAAC;kFAOC,cAAgD,EAChD,SAAiB,EACjB,KAAa;IAEb,IAAI,cAAc,YAAY,qCAAmB,EAAE;QACjD,cAAc,CAAC,uBAAuB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAC1D;SAAM;QACL,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,EAAwB,cAAc,EAAE,SAAS,CAAC,CAAC;KACxD;AACH,CAAC,mGAOC,cAAgD,EAChD,SAAiB,EACjB,MAAe;IAEf,IAAI,MAAM,EAAE;QACV,MAAM,OAAO,GAAG,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;KACxD;IACD,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC,6GAMC,cAAgD,EAAE,SAAiB;IACnE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,GAAG,CAAC,EAAE,CACnB,mBAAmB,EACnB,CAAC,SAAwC,EAAE,EAAE;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC,uGAOC,cAAgD,EAChD,WAIS;IAET,cAAc,CAAC,SAAS,CAAC,CAAC,KAA2C,EAAE,EAAE;QACvE,MAAM,WAAW,GAAG,uBAAA,IAAI,4EAAiB,MAArB,IAAI,EACtB,KAAK,CAAC,kBAAyB,CAChC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,MAAM,QAAQ,qBAAQ,IAAI,CAAC,KAAK,CAAE,CAAC;YACnC,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAClE,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,uFAGC,YAAyC;IAEzC,MAAM,aAAa,GAAiC,EAAE,CAAC;IAEvD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;QACjD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,uBAAA,IAAI,2EAAgB,MAApB,IAAI,EAAiB,WAAW,CAAC,CAAC;QAEvD,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;KACzC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,qFAEe,WAAwB;IACtC,MAAM,EAAE,aAAa,KAAyB,WAAW,EAA/B,eAAe,UAAK,WAAW,EAAnD,iBAAqC,CAAc,CAAC;IAE1D,8FAA8F;IAC9F,MAAM,YAAY,mCACb,eAAe,KAClB,SAAS,EAAE,aAAa,GACzB,CAAC;IAEF,OAAO,YAA4B,CAAC;AACtC,CAAC,yFAEiB,IAAY;IAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QAC7B,sBAAsB;QACtB,OAAO,IAAI,CAAC;KACb;IACD,kCAAkC;IAClC,OAAO,IAAA,6BAAW,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC,6EAEW,SAAiB;IAC3B,OAAO,8CACF,IAAI,CAAC,KAAK,CAAC,cAAc,GACzB,IAAI,CAAC,KAAK,CAAC,sBAAsB,GACjC,IAAI,CAAC,KAAK,CAAC,uBAAuB,EACrC,SAAS,CAAC,CAAC;AACf,CAAC,uFAGC,SAAwC,EACxC,IAAkB;;QAElB,MAAM,EAAE,GAAG,SAAS,CAAC,UAAoB,CAAC;QAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC;QAEnD,uGAAuG;QACvG,iFAAiF;QACjF,MAAM,eAAe,GAAG,IAAA,kBAAS,EAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CACrC,+BAA+B,EAC/B;YACE,EAAE;YACF,MAAM;YACN,IAAI;YACJ,WAAW,EAAE,eAA0D;YACvE,aAAa,EAAE,IAAI;SACpB,EACD,IAAI,CACL,CAAuB,CAAC;IAC3B,CAAC;sFAGC,aAAiC,EACjC,OAAe;IAEf,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,aAAa,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC9D,OAAO,aAAa,CAAC;KACtB;IAED,uCACK,aAAa,KAChB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IACpC;AACJ,CAAC","sourcesContent":["import EventEmitter from 'events';\nimport type { Hex } from '@metamask/utils';\nimport { cloneDeep } from 'lodash';\nimport {\n MessageManager,\n MessageParams,\n MessageParamsMetamask,\n PersonalMessageManager,\n PersonalMessageParams,\n PersonalMessageParamsMetamask,\n TypedMessageManager,\n TypedMessageParams,\n TypedMessageParamsMetamask,\n AbstractMessageManager,\n AbstractMessage,\n MessageManagerState,\n AbstractMessageParams,\n AbstractMessageParamsMetamask,\n OriginalRequest,\n} from '@metamask/message-manager';\nimport { ethErrors } from 'eth-rpc-errors';\nimport { bufferToHex } from 'ethereumjs-util';\n\nimport {\n BaseControllerV2,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { Patch } from 'immer';\nimport {\n AddApprovalRequest,\n AcceptResultCallbacks,\n AddResult,\n} from '@metamask/approval-controller';\n\nconst ORIGIN_METAMASK = 'metamask';\nenum ApprovalType {\n AddEthereumChain = 'wallet_addEthereumChain',\n ConnectAccounts = 'connect_accounts',\n EthDecrypt = 'eth_decrypt',\n EthGetEncryptionPublicKey = 'eth_getEncryptionPublicKey',\n EthSign = 'eth_sign',\n EthSignTypedData = 'eth_signTypedData',\n PersonalSign = 'personal_sign',\n ResultError = 'result_error',\n ResultSuccess = 'result_success',\n SnapDialogAlert = 'snap_dialog:alert',\n SnapDialogConfirmation = 'snap_dialog:confirmation',\n SnapDialogPrompt = 'snap_dialog:prompt',\n SwitchEthereumChain = 'wallet_switchEthereumChain',\n Transaction = 'transaction',\n Unlock = 'unlock',\n WalletConnect = 'wallet_connect',\n WalletRequestPermissions = 'wallet_requestPermissions',\n WatchAsset = 'wallet_watchAsset',\n}\n\nconst controllerName = 'SignatureController';\n\nconst stateMetadata = {\n unapprovedMsgs: { persist: false, anonymous: false },\n unapprovedPersonalMsgs: { persist: false, anonymous: false },\n unapprovedTypedMessages: { persist: false, anonymous: false },\n unapprovedMsgCount: { persist: false, anonymous: false },\n unapprovedPersonalMsgCount: { persist: false, anonymous: false },\n unapprovedTypedMessagesCount: { persist: false, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n unapprovedMsgs: {},\n unapprovedPersonalMsgs: {},\n unapprovedTypedMessages: {},\n unapprovedMsgCount: 0,\n unapprovedPersonalMsgCount: 0,\n unapprovedTypedMessagesCount: 0,\n});\n\ntype CoreMessage = AbstractMessage & {\n messageParams: AbstractMessageParams;\n};\n\ntype StateMessage = Required & {\n msgParams: Required;\n};\n\ntype SignatureControllerState = {\n unapprovedMsgs: Record;\n unapprovedPersonalMsgs: Record;\n unapprovedTypedMessages: Record;\n unapprovedMsgCount: number;\n unapprovedPersonalMsgCount: number;\n unapprovedTypedMessagesCount: number;\n};\n\ntype AllowedActions = AddApprovalRequest;\n\ntype TypedMessageSigningOptions = {\n parseJsonData: boolean;\n};\n\nexport type GetSignatureState = {\n type: `${typeof controllerName}:getState`;\n handler: () => SignatureControllerState;\n};\n\nexport type SignatureStateChange = {\n type: `${typeof controllerName}:stateChange`;\n payload: [SignatureControllerState, Patch[]];\n};\n\nexport type SignatureControllerActions = GetSignatureState;\n\nexport type SignatureControllerEvents = SignatureStateChange;\n\nexport type SignatureControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SignatureControllerActions | AllowedActions,\n SignatureControllerEvents,\n AllowedActions['type'],\n never\n>;\n\nexport interface KeyringController {\n signMessage: (messsageParams: MessageParams) => Promise;\n signPersonalMessage: (\n messsageParams: PersonalMessageParams,\n ) => Promise;\n signTypedMessage: (\n messsageParams: TypedMessageParams,\n options: { version: string | undefined },\n ) => Promise;\n}\n\nexport type SignatureControllerOptions = {\n messenger: SignatureControllerMessenger;\n keyringController: KeyringController;\n isEthSignEnabled: () => boolean;\n getAllState: () => unknown;\n securityProviderRequest?: (\n requestData: any,\n methodName: string,\n ) => Promise;\n getCurrentChainId: () => Hex;\n};\n\n/**\n * Controller for creating signing requests requiring user approval.\n */\nexport class SignatureController extends BaseControllerV2<\n typeof controllerName,\n SignatureControllerState,\n SignatureControllerMessenger\n> {\n hub: EventEmitter;\n\n #keyringController: KeyringController;\n\n #isEthSignEnabled: () => boolean;\n\n #getAllState: () => any;\n\n #messageManager: MessageManager;\n\n #personalMessageManager: PersonalMessageManager;\n\n #typedMessageManager: TypedMessageManager;\n\n /**\n * Construct a Sign controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the sign controller.\n * @param options.keyringController - An instance of a keyring controller used to perform the signing operations.\n * @param options.isEthSignEnabled - Callback to return true if eth_sign is enabled.\n * @param options.getAllState - Callback to retrieve all user state.\n * @param options.securityProviderRequest - A function for verifying a message, whether it is malicious or not.\n * @param options.getCurrentChainId - A function for retrieving the current chainId.\n */\n constructor({\n messenger,\n keyringController,\n isEthSignEnabled,\n getAllState,\n securityProviderRequest,\n getCurrentChainId,\n }: SignatureControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: getDefaultState(),\n });\n\n this.#keyringController = keyringController;\n this.#isEthSignEnabled = isEthSignEnabled;\n this.#getAllState = getAllState;\n\n this.hub = new EventEmitter();\n this.#messageManager = new MessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n );\n this.#personalMessageManager = new PersonalMessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n );\n this.#typedMessageManager = new TypedMessageManager(\n undefined,\n undefined,\n securityProviderRequest,\n undefined,\n getCurrentChainId,\n );\n\n this.#handleMessageManagerEvents(this.#messageManager, 'unapprovedMessage');\n this.#handleMessageManagerEvents(\n this.#personalMessageManager,\n 'unapprovedPersonalMessage',\n );\n this.#handleMessageManagerEvents(\n this.#typedMessageManager,\n 'unapprovedTypedMessage',\n );\n\n this.#subscribeToMessageState(\n this.#messageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedMsgs = newMessages;\n state.unapprovedMsgCount = messageCount;\n },\n );\n\n this.#subscribeToMessageState(\n this.#personalMessageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedPersonalMsgs = newMessages;\n state.unapprovedPersonalMsgCount = messageCount;\n },\n );\n\n this.#subscribeToMessageState(\n this.#typedMessageManager,\n (state, newMessages, messageCount) => {\n state.unapprovedTypedMessages = newMessages;\n state.unapprovedTypedMessagesCount = messageCount;\n },\n );\n }\n\n /**\n * A getter for the number of 'unapproved' Messages in this.messages.\n *\n * @returns The number of 'unapproved' Messages in this.messages\n */\n get unapprovedMsgCount(): number {\n return this.#messageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for the number of 'unapproved' PersonalMessages in this.messages.\n *\n * @returns The number of 'unapproved' PersonalMessages in this.messages\n */\n get unapprovedPersonalMessagesCount(): number {\n return this.#personalMessageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * A getter for the number of 'unapproved' TypedMessages in this.messages.\n *\n * @returns The number of 'unapproved' TypedMessages in this.messages\n */\n get unapprovedTypedMessagesCount(): number {\n return this.#typedMessageManager.getUnapprovedMessagesCount();\n }\n\n /**\n * Reset the controller state to the initial state.\n */\n resetState() {\n this.update(() => getDefaultState());\n }\n\n /**\n * Reject all unapproved messages of any type.\n *\n * @param reason - A message to indicate why.\n */\n rejectUnapproved(reason?: string) {\n this.#rejectUnapproved(this.#messageManager, reason);\n this.#rejectUnapproved(this.#personalMessageManager, reason);\n this.#rejectUnapproved(this.#typedMessageManager, reason);\n }\n\n /**\n * Clears all unapproved messages from memory.\n */\n clearUnapproved() {\n this.#clearUnapproved(this.#messageManager);\n this.#clearUnapproved(this.#personalMessageManager);\n this.#clearUnapproved(this.#typedMessageManager);\n }\n\n /**\n * Called when a Dapp uses the eth_sign method, to request user approval.\n * eth_sign is a pure signature of arbitrary data. It is on a deprecation\n * path, since this data can be a transaction, or can leak private key\n * information.\n *\n * @param messageParams - The params passed to eth_sign.\n * @param [req] - The original request, containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedMessage(\n messageParams: MessageParams,\n req: OriginalRequest,\n ): Promise {\n return this.#newUnsignedAbstractMessage(\n this.#messageManager,\n ApprovalType.EthSign,\n 'Message',\n this.#signMessage.bind(this),\n messageParams,\n req,\n this.#validateUnsignedMessage.bind(this),\n );\n }\n\n /**\n * Called when a dapp uses the personal_sign method.\n * This is identical to the Geth eth_sign method, and may eventually replace\n * eth_sign.\n *\n * We currently define our eth_sign and personal_sign mostly for legacy Dapps.\n *\n * @param messageParams - The params of the message to sign & return to the Dapp.\n * @param req - The original request, containing the origin.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedPersonalMessage(\n messageParams: PersonalMessageParams,\n req: OriginalRequest,\n ): Promise {\n return this.#newUnsignedAbstractMessage(\n this.#personalMessageManager,\n ApprovalType.PersonalSign,\n 'Personal Message',\n this.#signPersonalMessage.bind(this),\n messageParams,\n req,\n );\n }\n\n /**\n * Called when a dapp uses the eth_signTypedData method, per EIP 712.\n *\n * @param messageParams - The params passed to eth_signTypedData.\n * @param req - The original request, containing the origin.\n * @param version - The version indicating the format of the typed data.\n * @param signingOpts - An options bag for signing.\n * @param signingOpts.parseJsonData - Whether to parse the JSON before signing.\n * @returns Promise resolving to the raw data of the signature request.\n */\n async newUnsignedTypedMessage(\n messageParams: TypedMessageParams,\n req: OriginalRequest,\n version: string,\n signingOpts: TypedMessageSigningOptions,\n ): Promise {\n return this.#newUnsignedAbstractMessage(\n this.#typedMessageManager,\n ApprovalType.EthSignTypedData,\n 'Typed Message',\n this.#signTypedMessage.bind(this),\n messageParams,\n req,\n undefined,\n version,\n signingOpts,\n );\n }\n\n setTypedMessageInProgress(messageId: string) {\n this.#typedMessageManager.setMessageStatusInProgress(messageId);\n }\n\n setPersonalMessageInProgress(messageId: string) {\n this.#personalMessageManager.setMessageStatusInProgress(messageId);\n }\n\n #validateUnsignedMessage(messageParams: MessageParamsMetamask): void {\n if (!this.#isEthSignEnabled()) {\n throw ethErrors.rpc.methodNotFound(\n 'eth_sign has been disabled. You must enable it in the advanced settings',\n );\n }\n const data = this.#normalizeMsgData(messageParams.data);\n // 64 hex + \"0x\" at the beginning\n // This is needed because Ethereum's EcSign works only on 32 byte numbers\n // For 67 length see: https://github.com/MetaMask/metamask-extension/pull/12679/files#r749479607\n if (data.length !== 66 && data.length !== 67) {\n throw ethErrors.rpc.invalidParams(\n 'eth_sign requires 32 byte message hash',\n );\n }\n }\n\n async #newUnsignedAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n SO,\n >(\n messageManager: AbstractMessageManager,\n approvalType: ApprovalType,\n messageName: string,\n signMessage: (messageParams: PM, signingOpts?: SO) => void,\n messageParams: PM,\n req: OriginalRequest,\n validateMessage?: (params: PM) => void,\n version?: string,\n signingOpts?: SO,\n ) {\n if (validateMessage) {\n validateMessage(messageParams);\n }\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\n try {\n const messageId = await messageManager.addUnapprovedMessage(\n messageParams,\n req,\n version,\n );\n\n const messageParamsWithId = {\n ...messageParams,\n metamaskId: messageId,\n ...(version && { version }),\n };\n\n const signaturePromise = messageManager.waitForFinishStatus(\n messageParamsWithId,\n messageName,\n );\n\n try {\n const acceptResult = await this.#requestApproval(\n messageParamsWithId,\n approvalType,\n );\n\n resultCallbacks = acceptResult.resultCallbacks;\n } catch {\n this.#cancelAbstractMessage(messageManager, messageId);\n throw ethErrors.provider.userRejectedRequest(\n 'User rejected the request.',\n );\n }\n\n await signMessage(messageParamsWithId, signingOpts);\n\n const signatureResult = await signaturePromise;\n\n /* istanbul ignore next */\n resultCallbacks?.success(signatureResult);\n\n return signatureResult;\n } catch (error) {\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n /**\n * Signifies user intent to complete an eth_sign method.\n *\n * @param msgParams - The params passed to eth_call.\n * @returns Signature result from signing.\n */\n async #signMessage(msgParams: MessageParamsMetamask) {\n return await this.#signAbstractMessage(\n this.#messageManager,\n ApprovalType.EthSign,\n msgParams,\n async (cleanMsgParams) =>\n await this.#keyringController.signMessage(cleanMsgParams),\n );\n }\n\n /**\n * Signifies a user's approval to sign a personal_sign message in queue.\n * Triggers signing, and the callback function from newUnsignedPersonalMessage.\n *\n * @param msgParams - The params of the message to sign & return to the Dapp.\n * @returns Signature result from signing.\n */\n async #signPersonalMessage(msgParams: PersonalMessageParamsMetamask) {\n return await this.#signAbstractMessage(\n this.#personalMessageManager,\n ApprovalType.PersonalSign,\n msgParams,\n async (cleanMsgParams) =>\n await this.#keyringController.signPersonalMessage(cleanMsgParams),\n );\n }\n\n /**\n * The method for a user approving a call to eth_signTypedData, per EIP 712.\n * Triggers the callback in newUnsignedTypedMessage.\n *\n * @param msgParams - The params passed to eth_signTypedData.\n * @param opts - The options for the method.\n * @param opts.parseJsonData - Whether to parse JSON data before calling the KeyringController.\n * @returns Signature result from signing.\n */\n async #signTypedMessage(\n msgParams: TypedMessageParamsMetamask,\n /* istanbul ignore next */\n opts = { parseJsonData: true },\n ): Promise {\n const { version } = msgParams;\n return await this.#signAbstractMessage(\n this.#typedMessageManager,\n ApprovalType.EthSignTypedData,\n msgParams,\n async (cleanMsgParams) => {\n const finalMessageParams = opts.parseJsonData\n ? this.#removeJsonData(cleanMsgParams, version as string)\n : cleanMsgParams;\n\n return await this.#keyringController.signTypedMessage(\n finalMessageParams,\n {\n version,\n },\n );\n },\n );\n }\n\n #rejectUnapproved<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager, reason?: string) {\n Object.keys(messageManager.getUnapprovedMessages()).forEach((messageId) => {\n this.#cancelAbstractMessage(messageManager, messageId, reason);\n });\n }\n\n #clearUnapproved<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager) {\n messageManager.update({\n unapprovedMessages: {},\n unapprovedMessagesCount: 0,\n });\n }\n\n async #signAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n methodName: string,\n msgParams: PM,\n getSignature: (cleanMessageParams: P) => Promise,\n ) {\n console.info(`MetaMaskController - ${methodName}`);\n\n const messageId = msgParams.metamaskId as string;\n\n try {\n const cleanMessageParams = await messageManager.approveMessage(msgParams);\n\n try {\n const signature = await getSignature(cleanMessageParams);\n\n this.hub.emit(`${methodName}:signed`, { signature, messageId });\n\n if (!cleanMessageParams.deferSetAsSigned) {\n messageManager.setMessageStatusSigned(messageId, signature);\n }\n\n return signature;\n } catch (error) {\n this.hub.emit(`${messageId}:signError`, { error });\n throw error;\n }\n } catch (error: any) {\n console.info(`MetaMaskController - ${methodName} failed.`, error);\n this.#errorMessage(messageManager, messageId, error.message);\n throw error;\n }\n }\n\n #errorMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n messageId: string,\n error: string,\n ) {\n if (messageManager instanceof TypedMessageManager) {\n messageManager.setMessageStatusErrored(messageId, error);\n } else {\n this.#cancelAbstractMessage(messageManager, messageId);\n }\n }\n\n #cancelAbstractMessage<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n messageId: string,\n reason?: string,\n ) {\n if (reason) {\n const message = this.#getMessage(messageId);\n this.hub.emit('cancelWithReason', { message, reason });\n }\n messageManager.rejectMessage(messageId);\n }\n\n #handleMessageManagerEvents<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(messageManager: AbstractMessageManager, eventName: string) {\n messageManager.hub.on('updateBadge', () => {\n this.hub.emit('updateBadge');\n });\n\n messageManager.hub.on(\n 'unapprovedMessage',\n (msgParams: AbstractMessageParamsMetamask) => {\n this.hub.emit(eventName, msgParams);\n },\n );\n }\n\n #subscribeToMessageState<\n M extends AbstractMessage,\n P extends AbstractMessageParams,\n PM extends AbstractMessageParamsMetamask,\n >(\n messageManager: AbstractMessageManager,\n updateState: (\n state: SignatureControllerState,\n newMessages: Record,\n messageCount: number,\n ) => void,\n ) {\n messageManager.subscribe((state: MessageManagerState) => {\n const newMessages = this.#migrateMessages(\n state.unapprovedMessages as any,\n );\n\n this.update(() => {\n const newState = { ...this.state };\n updateState(newState, newMessages, state.unapprovedMessagesCount);\n return newState;\n });\n });\n }\n\n #migrateMessages(\n coreMessages: Record,\n ): Record {\n const stateMessages: Record = {};\n\n for (const messageId of Object.keys(coreMessages)) {\n const coreMessage = coreMessages[messageId];\n const stateMessage = this.#migrateMessage(coreMessage);\n\n stateMessages[messageId] = stateMessage;\n }\n\n return stateMessages;\n }\n\n #migrateMessage(coreMessage: CoreMessage): StateMessage {\n const { messageParams, ...coreMessageData } = coreMessage;\n\n // Core message managers use messageParams but frontend uses msgParams with lots of references\n const stateMessage = {\n ...coreMessageData,\n msgParams: messageParams,\n };\n\n return stateMessage as StateMessage;\n }\n\n #normalizeMsgData(data: string) {\n if (data.slice(0, 2) === '0x') {\n // data is already hex\n return data;\n }\n // data is unicode, convert to hex\n return bufferToHex(Buffer.from(data, 'utf8'));\n }\n\n #getMessage(messageId: string): StateMessage {\n return {\n ...this.state.unapprovedMsgs,\n ...this.state.unapprovedPersonalMsgs,\n ...this.state.unapprovedTypedMessages,\n }[messageId];\n }\n\n async #requestApproval(\n msgParams: AbstractMessageParamsMetamask,\n type: ApprovalType,\n ): Promise {\n const id = msgParams.metamaskId as string;\n const origin = msgParams.origin || ORIGIN_METAMASK;\n\n // We are explicitly cloning the message params here to prevent the mutation errors on development mode\n // Because sending it through the messaging system will make the object read only\n const clonedMsgParams = cloneDeep(msgParams);\n return (await this.messagingSystem.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData: clonedMsgParams as Required,\n expectsResult: true,\n },\n true,\n )) as Promise;\n }\n\n #removeJsonData(\n messageParams: TypedMessageParams,\n version: string,\n ): TypedMessageParams {\n if (version === 'V1' || typeof messageParams.data !== 'string') {\n return messageParams;\n }\n\n return {\n ...messageParams,\n data: JSON.parse(messageParams.data),\n };\n }\n}\n"]} +\ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 974ed49f5e4..b6131bf404e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -177,27 +177,17 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== -"@babel/compat-data@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa" - integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew== - "@babel/compat-data@^7.17.10": version "7.18.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== - "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/compat-data@^7.22.9": +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== @@ -223,7 +213,7 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.11.6": +"@babel/core@^7.11.6", "@babel/core@^7.13.16", "@babel/core@^7.20.0": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== @@ -265,27 +255,6 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.13.16", "@babel/core@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - "@babel/core@^7.15.5": version "7.18.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" @@ -343,10 +312,10 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.20.0", "@babel/generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== +"@babel/generator@^7.20.0", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" @@ -363,22 +332,12 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" - integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" - integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== - dependencies: - "@babel/types" "^7.14.5" "@babel/helper-annotate-as-pure@^7.16.0": version "7.16.0" @@ -401,13 +360,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" @@ -433,26 +385,16 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" - integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== +"@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== dependencies: - "@babel/compat-data" "^7.22.5" + "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" + semver "^6.3.1" "@babel/helper-compilation-targets@^7.18.2": version "7.18.2" @@ -475,17 +417,6 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" - integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" @@ -498,20 +429,20 @@ "@babel/helper-replace-supers" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz#2192a1970ece4685fbff85b48da2c32fcb130b7c" - integrity sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== 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.5" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - semver "^6.3.0" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.19.0": version "7.19.0" @@ -543,13 +474,13 @@ regexpu-core "^5.0.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz#bb2bf0debfe39b831986a4efbf4066586819c6e4" - integrity sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" - semver "^6.3.0" + semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.2.2": version "0.2.3" @@ -565,17 +496,16 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" "@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": version "7.18.2" @@ -633,15 +563,7 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-function-name@^7.22.5": +"@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== @@ -670,13 +592,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" @@ -698,12 +613,12 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== +"@babel/helper-member-expression-to-functions@^7.16.0", "@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== dependencies: - "@babel/types" "^7.16.0" + "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.18.9": version "7.18.9" @@ -712,13 +627,6 @@ dependencies: "@babel/types" "^7.18.9" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" @@ -740,14 +648,7 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-module-imports@^7.18.6": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-imports@^7.22.5": +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== @@ -810,21 +711,7 @@ "@babel/traverse" "^7.21.2" "@babel/types" "^7.21.2" -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.9": +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== @@ -868,11 +755,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-plugin-utils@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" @@ -888,6 +770,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz#d5aa3b086e13a5fe05238ff40c3a5a0c2dab3ead" @@ -907,14 +794,13 @@ "@babel/types" "^7.16.8" "@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" - integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" "@babel/helper-replace-supers@^7.14.5": version "7.14.5" @@ -947,17 +833,14 @@ "@babel/traverse" "^7.19.1" "@babel/types" "^7.19.0" -"@babel/helper-replace-supers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" - integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-member-expression-to-functions" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" "@babel/helper-simple-access@^7.14.5": version "7.14.5" @@ -1036,13 +919,6 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" @@ -1135,14 +1011,13 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helper-wrap-function@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" - integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== +"@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" "@babel/types" "^7.22.5" "@babel/helpers@^7.16.0": @@ -1172,15 +1047,6 @@ "@babel/traverse" "^7.21.0" "@babel/types" "^7.21.0" -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - "@babel/helpers@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" @@ -1231,12 +1097,12 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== -"@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== +"@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== -"@babel/parser@^7.14.0", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3": +"@babel/parser@^7.14.0", "@babel/parser@^7.16.0": version "7.16.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.3.tgz#271bafcb811080905a119222edbc17909c82261d" integrity sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw== @@ -1261,11 +1127,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/parser@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -1592,10 +1453,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz#7336356d23380eda9a56314974f053a020dab0c3" - integrity sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg== +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" @@ -1678,19 +1539,19 @@ "@babel/helper-split-export-declaration" "^7.14.5" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz#635d4e98da741fad814984639f4c0149eb0135e1" - integrity sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ== +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.0.0": @@ -1986,10 +1847,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz#1003762b9c14295501beb41be72426736bedd1e0" - integrity sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ== +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -2175,12 +2036,12 @@ "@babel/plugin-syntax-typescript" "^7.18.6" "@babel/plugin-transform-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d" - integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234" + integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" @@ -2241,12 +2102,12 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.5.tgz#3da66078b181f3d62512c51cf7014392c511504e" - integrity sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A== + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" @@ -2271,13 +2132,13 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" "@babel/plugin-transform-async-to-generator" "^7.22.5" "@babel/plugin-transform-block-scoped-functions" "^7.22.5" "@babel/plugin-transform-block-scoping" "^7.22.5" "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-class-static-block" "^7.22.5" - "@babel/plugin-transform-classes" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" "@babel/plugin-transform-computed-properties" "^7.22.5" "@babel/plugin-transform-destructuring" "^7.22.5" "@babel/plugin-transform-dotall-regex" "^7.22.5" @@ -2302,7 +2163,7 @@ "@babel/plugin-transform-object-rest-spread" "^7.22.5" "@babel/plugin-transform-object-super" "^7.22.5" "@babel/plugin-transform-optional-catch-binding" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" "@babel/plugin-transform-parameters" "^7.22.5" "@babel/plugin-transform-private-methods" "^7.22.5" "@babel/plugin-transform-private-property-in-object" "^7.22.5" @@ -2320,11 +2181,11 @@ "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" "@babel/types" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" "@babel/preset-flow@^7.13.13": version "7.22.5" @@ -2432,9 +2293,9 @@ regenerator-runtime "^0.13.4" "@babel/runtime@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" - integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== dependencies: regenerator-runtime "^0.13.11" @@ -2514,18 +2375,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.20.0", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" @@ -2561,22 +2423,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.20.0", "@babel/traverse@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.7.2": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" @@ -2593,22 +2439,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" - integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.7" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - "@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.7.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" @@ -4095,11 +3925,11 @@ strip-ansi "^6.0.0" "@jest/create-cache-key-function@^29.2.1": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.5.0.tgz#24e019d03e634be4affe8bcee787d75a36ae57a2" - integrity sha512-LIDZyZgnZss7uikvBKBB/USWwG+GO8+GnwRWT+YkCGDGsqLQlhm9BC3z6+7+eMs1kUlvXQIWEzBR8Q2Pnvx6lg== + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.6.1.tgz#eb69da959e78e8457757451166b4b0f7b64fe679" + integrity sha512-d77/1BbNLbJDBV6tH7ctYpau+3tnU5YMhg36uGabW4VDrl1Arp6E0jDRioHFoFqIbm+BXMVbyQc9MpfKo6OIQQ== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.1" "@jest/environment@^28.1.3": version "28.1.3" @@ -4111,15 +3941,15 @@ "@types/node" "*" jest-mock "^28.1.3" -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== +"@jest/environment@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.1.tgz#ee358fff2f68168394b4a50f18c68278a21fe82f" + integrity sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A== dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" + "@jest/fake-timers" "^29.6.1" + "@jest/types" "^29.6.1" "@types/node" "*" - jest-mock "^29.5.0" + jest-mock "^29.6.1" "@jest/expect-utils@^28.1.3": version "28.1.3" @@ -4148,17 +3978,17 @@ jest-mock "^28.1.3" jest-util "^28.1.3" -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== +"@jest/fake-timers@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.1.tgz#c773efddbc61e1d2efcccac008139f621de57c69" + integrity sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.1" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" + jest-message-util "^29.6.1" + jest-mock "^29.6.1" + jest-util "^29.6.1" "@jest/globals@^28.1.3": version "28.1.3" @@ -4214,12 +4044,12 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" "@jest/source-map@^28.1.2": version "28.1.2" @@ -4305,12 +4135,12 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -4906,9 +4736,9 @@ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" @@ -5214,7 +5044,7 @@ "@metamask/base-controller" "^2.0.0" "@metamask/controller-utils" "^3.0.0" -"@metamask/approval-controller@3.4.0", "@metamask/approval-controller@^2.1.1", "@metamask/approval-controller@^3.3.0", "@metamask/approval-controller@^3.4.0": +"@metamask/approval-controller@3.4.0", "@metamask/approval-controller@^3.3.0", "@metamask/approval-controller@^3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@metamask/approval-controller/-/approval-controller-3.4.0.tgz#282900361d42f785578728b45014ff8cb5e557ea" integrity sha512-DjqrhiX9+W/Fh6Crr7FPJ87Y/uhPWzBvfXGtekv1LHZNmEtUxkrA7aelddUM0fpTdURIGT4aNGBoQudFidc+Lw== @@ -5335,7 +5165,7 @@ ethjs-unit "^0.1.6" fast-deep-equal "^3.1.3" -"@metamask/controller-utils@^4.0.1": +"@metamask/controller-utils@^4.0.0", "@metamask/controller-utils@^4.0.1": version "4.3.0" resolved "https://registry.yarnpkg.com/@metamask/controller-utils/-/controller-utils-4.3.0.tgz#63d6fef8ddbdf42ed0b94a0cf929d1898832004c" integrity sha512-WVbapIpjEJtKxZz/1w5DctnZ0h7V3OWu0X46MHEmV8Brna/nN8x6UZ4zySLD9tZGFaO7p3vxJpl7/EK8nSvf9A== @@ -5476,13 +5306,14 @@ jsonschema "^1.2.4" uuid "^8.3.2" -"@metamask/message-manager@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@metamask/message-manager/-/message-manager-5.0.0.tgz#1f419ad5b24c8f5ae8b07f0772376d96a939ac5e" - integrity sha512-p/7Q6n/g3dsSDowjDWJjrONOmQHkx99sK62He6FUxVvkS45RzB1SZuz4Lvg4uCgbVdl9HzBjb+BlTsfYD9wHvQ== +"@metamask/message-manager@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@metamask/message-manager/-/message-manager-7.0.1.tgz#27c3ed83cdb4752ef478436218280f97500539c7" + integrity sha512-M4GAkLW2phgPOk03yqrvOv+trJEoCUIdGc95Tlbs9mkT7ixQVXelLDTyRTeQAsprb8+uANW4dm9Vwp1EGqNB7g== dependencies: - "@metamask/base-controller" "^2.0.0" - "@metamask/controller-utils" "^3.4.0" + "@metamask/base-controller" "^3.0.0" + "@metamask/controller-utils" "^4.0.1" + "@metamask/utils" "^5.0.2" "@types/uuid" "^8.3.0" eth-sig-util "^3.0.0" ethereumjs-util "^7.0.10" @@ -5570,9 +5401,9 @@ integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== "@metamask/sdk-communication-layer@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.5.0.tgz#a2333ab1f0d96c52aed9f749e7539e9e927f53db" - integrity sha512-lcA9KpOM332oPhFZVsdeJYF1OJAQP7LmHCSrCOyBOLrvgaRhNxCSsgMid9shGuN1PVozDPEQXljRvJQOyfRpsg== + version "0.5.2" + resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.5.2.tgz#fd94d457569b7ee984ad40b1c965d509d569269b" + integrity sha512-k4v2L3E+4nROROT1/3RROSiDLUAKNkJeHsi3nN8l2ao4P0c3JuaREFwfc/u3FtXA3gALKRRGnitn2drG4Xw6rA== dependencies: cross-fetch "^3.1.5" date-fns "^2.29.3" @@ -5581,18 +5412,20 @@ socket.io-client "^4.5.1" uuid "^8.3.2" -"@metamask/signature-controller@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@metamask/signature-controller/-/signature-controller-2.0.0.tgz#d70c2c47afc95dc85d4c83e3c1c4dd411eb32d3d" - integrity sha512-Hm7/b7ob8IkAkZCEEXX4VOLlHZD12kesRE4lGyaw7z2k5RhZ4njsDFfMxvUCEmWIaPkJOjcV2AY7Bd0Yzi3y5g== +"@metamask/signature-controller@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/signature-controller/-/signature-controller-4.0.1.tgz#32f66fa240943d798aae1f4574529951d70ea69c" + integrity sha512-PKXzRbu8oT0lBnk7j/a6YP/p/fEYGuWQutzdyNzgxyehkAeO23Knpw38yHrglY/O7fTXjctE3OCj5mTsYGX20g== dependencies: - "@metamask/approval-controller" "^2.1.1" - "@metamask/base-controller" "^2.0.0" - "@metamask/controller-utils" "^3.4.0" - "@metamask/message-manager" "^5.0.0" + "@metamask/approval-controller" "^3.3.0" + "@metamask/base-controller" "^3.0.0" + "@metamask/controller-utils" "^4.0.0" + "@metamask/message-manager" "^7.0.0" + "@metamask/utils" "^5.0.2" eth-rpc-errors "^4.0.2" ethereumjs-util "^7.0.10" immer "^9.0.6" + lodash "^4.17.21" "@metamask/swaps-controller@^6.8.0": version "6.8.0" @@ -5682,6 +5515,11 @@ jsbi "^3.1.5" sha.js "^2.4.11" +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + "@noble/curves@1.0.0", "@noble/curves@~1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932" @@ -5705,9 +5543,9 @@ integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== "@noble/hashes@~1.1.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" - integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== + version "1.1.5" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" + integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== "@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": version "1.6.3" @@ -6395,10 +6233,10 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sindresorhus/is@^4.0.0": version "4.6.0" @@ -8973,21 +8811,16 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.4.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -acorn@^8.8.2: +acorn@^8.4.1, acorn@^8.7.0: version "8.9.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== +acorn@^8.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + adbkit-apkreader@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/adbkit-apkreader/-/adbkit-apkreader-3.2.0.tgz#8d0bb1f733969e959992095ed7f2a8d658ec97a5" @@ -10281,9 +10114,9 @@ aws4@^1.8.0: integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios-retry@^3.1.2: - version "3.5.0" - resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.5.0.tgz#32206b3e6555169488eded232527e36c8ce6e545" - integrity sha512-g48qNrLX30VU6ECWltpFCPegKK6dWzMDYv2o83W2zUL/Zh/SLXbT6ksGoKqYZHtghzqeeXhZBcSXJkO1fPbCcw== + version "3.2.5" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.2.5.tgz#64952992837c7d9a12eec156a2694a7945f60895" + integrity sha512-a8umkKbfIkTiYJQLx3v3TzKM85TGKB8ZQYz4zwykt2fpO64TsRlUhjaPaAb3fqMWCXFm2YhWcd8V5FHDKO9bSA== dependencies: "@babel/runtime" "^7.15.4" is-retry-allowed "^2.2.0" @@ -10421,14 +10254,14 @@ babel-plugin-polyfill-corejs2@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" babel-plugin-polyfill-corejs3@^0.2.2: version "0.2.3" @@ -10438,13 +10271,13 @@ babel-plugin-polyfill-corejs3@^0.2.2: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.14.0" -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" babel-plugin-polyfill-regenerator@^0.2.2: version "0.2.2" @@ -10453,12 +10286,12 @@ babel-plugin-polyfill-regenerator@^0.2.2: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" + "@babel/helper-define-polyfill-provider" "^0.4.1" babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" @@ -10946,27 +10779,15 @@ browserify-unibabel@^3.0.0: resolved "https://registry.yarnpkg.com/browserify-unibabel/-/browserify-unibabel-3.0.0.tgz#5a6b8f0f704ce388d3927df47337e25830f71dda" integrity sha1-WmuPD3BM44jTkn30czfiWDD3Hdo= -browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -browserslist@^4.17.5: - version "4.17.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" - integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw== +browserslist@^4.16.6, browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001274" - electron-to-chromium "^1.3.886" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" browserslist@^4.20.2: version "4.20.4" @@ -10989,16 +10810,6 @@ browserslist@^4.21.3: node-releases "^2.0.8" update-browserslist-db "^1.0.10" -browserslist@^4.21.5, browserslist@^4.21.9: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - browserstack-local@^1.4.5, browserstack-local@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/browserstack-local/-/browserstack-local-1.5.1.tgz#0d424474cc2b74a9d9a22d00a2282941ff636f34" @@ -11283,16 +11094,6 @@ can-use-dom@^0.1.0: resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= -caniuse-lite@^1.0.30001219: - version "1.0.30001243" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001243.tgz#d9250155c91e872186671c523f3ae50cfc94a3aa" - integrity sha512-vNxw9mkTBtkmLFnJRv/2rhs1yufpDfCkBZexG3Y0xdOH2Z/eE/85E4Dl5j1YUN34nZVsSp6vVRFQRrez9wJMRA== - -caniuse-lite@^1.0.30001274: - version "1.0.30001280" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz#066a506046ba4be34cde5f74a08db7a396718fb7" - integrity sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA== - caniuse-lite@^1.0.30001349: version "1.0.30001352" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz#cc6f5da3f983979ad1e2cdbae0505dccaa7c6a12" @@ -11304,9 +11105,9 @@ caniuse-lite@^1.0.30001449: integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== caniuse-lite@^1.0.30001503: - version "1.0.30001509" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" - integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== capital-case@^1.0.4: version "1.0.4" @@ -12091,12 +11892,12 @@ core-js-compat@^3.14.0: browserslist "^4.16.6" semver "7.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.31.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.0.tgz#4030847c0766cc0e803dcdfb30055d7ef2064bf1" - integrity sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw== +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== dependencies: - browserslist "^4.21.5" + browserslist "^4.21.9" core-js@^2.4.0, core-js@^2.5.7, core-js@^2.6.5: version "2.6.12" @@ -12651,14 +12452,14 @@ deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@^1.1.1: regexp.prototype.flags "^1.2.0" deep-equal@^2.0.5: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" - integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" es-get-iterator "^1.1.3" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" is-arguments "^1.1.1" is-array-buffer "^3.0.2" is-date-object "^1.0.5" @@ -13297,16 +13098,6 @@ ejs@^3.0.1: dependencies: jake "^10.8.5" -electron-to-chromium@^1.3.723: - version "1.3.788" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz#7a304c8ebb11d30916a1a1c1b4a9bad3983ef232" - integrity sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA== - -electron-to-chromium@^1.3.886: - version "1.3.895" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.895.tgz#9b0f8f2e32d8283bbb200156fd5d8dfd775f31ed" - integrity sha512-9Ww3fB8CWctjqHwkOt7DQbMZMpal2x2reod+/lU4b9axO1XJEDUpPMBxs7YnjLhhqpKXIIB5SRYN/B4K0QpvyQ== - electron-to-chromium@^1.4.147: version "1.4.152" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz#7dedbe8f3dc1c597088982a203f392e60f7ee90a" @@ -13318,9 +13109,9 @@ electron-to-chromium@^1.4.284: integrity sha512-EP/jdF15S+l3iSSzgUpUqeazvkbVFXNuVxwwLMVUSie3lUeH1HH70gKe0IS7TASB/0h5QPG2bLMzv2jelSztIQ== electron-to-chromium@^1.4.431: - version "1.4.445" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" - integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== + version "1.4.460" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz#f360a5059c039c4a5fb4dfa99680ad8129dd9f84" + integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -16049,7 +15840,7 @@ get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" -get-intrinsic@^1.2.0: +get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -17793,16 +17584,16 @@ jest-environment-node@^28.1.3: jest-util "^28.1.3" jest-environment-node@^29.2.1: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.1.tgz#08a122dece39e58bc388da815a2166c58b4abec6" + integrity sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ== dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" + "@jest/environment" "^29.6.1" + "@jest/fake-timers" "^29.6.1" + "@jest/types" "^29.6.1" "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" + jest-mock "^29.6.1" + jest-util "^29.6.1" jest-get-type@^26.3.0: version "26.3.0" @@ -17876,18 +17667,18 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== +jest-message-util@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.1.tgz#d0b21d87f117e1b9e165e24f245befd2ff34ff8d" + integrity sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.5.0" + pretty-format "^29.6.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -17899,14 +17690,14 @@ jest-mock@^28.1.3: "@jest/types" "^28.1.3" "@types/node" "*" -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== +jest-mock@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.1.tgz#049ee26aea8cbf54c764af649070910607316517" + integrity sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.1" "@types/node" "*" - jest-util "^29.5.0" + jest-util "^29.6.1" jest-pnp-resolver@^1.2.2: version "1.2.2" @@ -18062,12 +17853,12 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== +jest-util@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.1.tgz#c9e29a87a6edbf1e39e6dee2b4689b8a146679cb" + integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -19254,13 +19045,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -20943,20 +20727,10 @@ node-notifier@^8.0.1: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== node-releases@^2.0.5: version "2.0.5" @@ -22338,12 +22112,12 @@ pretty-format@^29.0.0: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== +pretty-format@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.1.tgz#ec838c288850b7c4f9090b867c2d4f4edbfb0f3e" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -25136,7 +24910,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -"source-map-support@0.3.2 - 1.0.0", source-map-support@0.5.21, source-map-support@^0.5.12, source-map-support@^0.5.19, source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.9, source-map-support@^0.x, source-map-support@~0.5.20: +"source-map-support@0.3.2 - 1.0.0", source-map-support@0.5.21, source-map-support@^0.5.12, source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.9, source-map-support@^0.x, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -25152,14 +24926,6 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.16: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" @@ -25953,9 +25719,9 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser@^5.15.0: - version "5.18.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948" - integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== + version "5.19.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.0.tgz#7b3137b01226bdd179978207b9c8148754a6da9c" + integrity sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -26068,7 +25834,7 @@ tmp@^0.2.1: dependencies: rimraf "^3.0.0" -tmpl@1.0.5, tmpl@1.0.x: +tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -26861,14 +26627,7 @@ vm2@>=3.9.17, vm2@^3.9.3: acorn "^8.7.0" acorn-walk "^8.2.0" -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -walker@^1.0.8: +walker@^1.0.7, walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -27212,9 +26971,9 @@ which-typed-array@^1.1.2: is-typed-array "^1.1.3" which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" @@ -27400,12 +27159,7 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.0.0: - version "7.5.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" - integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== - -ws@^7.2.3: +ws@^7, ws@^7.0.0, ws@^7.2.3: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -27676,20 +27430,7 @@ yargs@^16.1.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.0: - version "17.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" - integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yargs@^17.3.1, yargs@^17.5.1: +yargs@^17.0.0, yargs@^17.3.1, yargs@^17.5.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 19f84497c4fcbdbafe403a2360a1395504cb0804 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 25 Jul 2023 17:06:09 -0230 Subject: [PATCH 08/20] test: Refactor test initial background state (#6874) Additional unit tests have been updated to use the new initial background state test fixture. --- .../Navigation/TabBar/TabBar.test.tsx | 20 ++-- .../PermissionApproval.test.tsx | 2 + .../UI/AccountInfoCard/index.test.tsx | 12 ++- .../AccountSelector.test.tsx | 2 + .../AddToAddressBookWrapper.test.tsx | 2 + .../UI/AddressInputs/index.test.jsx | 3 +- .../ApproveTransactionHeader.test.tsx | 50 ++------- .../VerifyContractDetails.test.tsx | 7 +- .../Ramp/Views/GetStarted/GetStarted.test.tsx | 7 +- .../PaymentMethods/PaymentMethods.test.tsx | 8 +- .../UI/Ramp/Views/Quotes/Quotes.test.tsx | 11 +- .../UI/Ramp/Views/Regions/Regions.test.tsx | 7 +- app/components/UI/Tokens/index.test.tsx | 9 +- .../TransactionReviewEIP1559/index.test.tsx | 14 +-- .../index.test.tsx | 2 + .../UI/WalletAccount/WalletAccount.test.tsx | 22 ++-- .../AccountActions/AccountActions.test.tsx | 6 +- .../EditAccountName/EditAccountName.test.tsx | 14 +-- .../NetworkSelector/NetworkSelector.test.tsx | 102 +----------------- .../AddressElement/AddressElement.test.tsx | 7 +- .../SendFlow/AddressList/AddressList.test.tsx | 11 +- .../Views/SendFlow/Amount/index.test.tsx | 12 +-- .../Views/SendFlow/Confirm/index.test.tsx | 23 +--- .../WalletActions/WalletActions.test.tsx | 13 ++- .../hooks/useExistingAddress.test.ts | 48 ++------- .../useTokenBalancesController.test.tsx | 6 +- app/util/logs/index.test.ts | 8 +- 27 files changed, 102 insertions(+), 326 deletions(-) diff --git a/app/component-library/components/Navigation/TabBar/TabBar.test.tsx b/app/component-library/components/Navigation/TabBar/TabBar.test.tsx index 69749e9467d..86c0296057d 100644 --- a/app/component-library/components/Navigation/TabBar/TabBar.test.tsx +++ b/app/component-library/components/Navigation/TabBar/TabBar.test.tsx @@ -5,6 +5,7 @@ import { ParamListBase, TabNavigationState } from '@react-navigation/native'; // External dependencies import renderWithProvider from '../../../../util/test/renderWithProvider'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; // Internal dependencies import TabBar from './TabBar'; @@ -16,21 +17,12 @@ const navigation = { navigate: jest.fn(), }; -const initialState = { +const mockInitialState = { wizard: { step: 1, }, engine: { - backgroundState: { - NetworkController: { - providerConfig: { - type: 'mainnet', - nickname: 'Ethereum mainnet', - ticket: 'eth', - chainId: '1', - }, - }, - }, + backgroundState: initialBackgroundState, }, }; @@ -42,7 +34,7 @@ jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), useSelector: jest .fn() - .mockImplementation((callback) => callback(initialState)), + .mockImplementation((callback) => callback(mockInitialState)), })); // Define the test cases. @@ -97,7 +89,7 @@ describe('TabBar', () => { descriptors={descriptors as any} navigation={navigation as any} />, - { state: initialState }, + { state: mockInitialState }, ); expect(toJSON()).toMatchSnapshot(); }); @@ -109,7 +101,7 @@ describe('TabBar', () => { descriptors={descriptors as any} navigation={navigation as any} />, - { state: initialState }, + { state: mockInitialState }, ); fireEvent.press(getByTestId(`tab-bar-item-${TabBarIconKey.Wallet}`)); diff --git a/app/components/Approvals/PermissionApproval/PermissionApproval.test.tsx b/app/components/Approvals/PermissionApproval/PermissionApproval.test.tsx index 12a89631f1b..e217c36f813 100644 --- a/app/components/Approvals/PermissionApproval/PermissionApproval.test.tsx +++ b/app/components/Approvals/PermissionApproval/PermissionApproval.test.tsx @@ -8,6 +8,7 @@ import { createAccountConnectNavDetails } from '../../Views/AccountConnect'; import AnalyticsV2 from '../../../util/analyticsV2'; import { useSelector } from 'react-redux'; import { MetaMetricsEvents } from '../../../core/Analytics'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; jest.mock('../../hooks/useApprovalRequest'); jest.mock('../../../util/analyticsV2'); @@ -101,6 +102,7 @@ describe('PermissionApproval', () => { mockSelectorState({ engine: { backgroundState: { + ...initialBackgroundState, AccountTrackerController: { accounts: { 1: 'testAccount', diff --git a/app/components/UI/AccountInfoCard/index.test.tsx b/app/components/UI/AccountInfoCard/index.test.tsx index 5ce7c9aa040..5f3ca1ea231 100644 --- a/app/components/UI/AccountInfoCard/index.test.tsx +++ b/app/components/UI/AccountInfoCard/index.test.tsx @@ -1,6 +1,7 @@ import React from 'react'; import AccountInfoCard from './'; import renderWithProvider from '../../../util/test/renderWithProvider'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; jest.mock('../../../util/address', () => ({ ...jest.requireActual('../../../util/address'), @@ -18,12 +19,13 @@ jest.mock('../../../core/Engine', () => ({ }, })); -const initialState = { +const mockInitialState = { settings: { useBlockieIcon: false, }, engine: { backgroundState: { + ...initialBackgroundState, AccountTrackerController: { accounts: { '0x0': { @@ -63,14 +65,14 @@ jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), useSelector: jest .fn() - .mockImplementation((callback) => callback(initialState)), + .mockImplementation((callback) => callback(mockInitialState)), })); describe('AccountInfoCard', () => { it('should match snapshot', async () => { const container = renderWithProvider( , - { state: initialState }, + { state: mockInitialState }, ); expect(container).toMatchSnapshot(); }); @@ -78,7 +80,7 @@ describe('AccountInfoCard', () => { it('should show balance header in signing page', async () => { const { getByText } = renderWithProvider( , - { state: initialState }, + { state: mockInitialState }, ); expect(getByText('Balance')).toBeDefined(); }); @@ -86,7 +88,7 @@ describe('AccountInfoCard', () => { it('should show origin header in signing page', async () => { const { getByText } = renderWithProvider( , - { state: initialState }, + { state: mockInitialState }, ); expect(getByText('https://metamask.io')).toBeDefined(); diff --git a/app/components/UI/AccountSelectorList/AccountSelector.test.tsx b/app/components/UI/AccountSelectorList/AccountSelector.test.tsx index 7cabed0c9cc..7dcacfdb083 100644 --- a/app/components/UI/AccountSelectorList/AccountSelector.test.tsx +++ b/app/components/UI/AccountSelectorList/AccountSelector.test.tsx @@ -7,6 +7,7 @@ import AccountSelectorList from './AccountSelectorList'; import { useAccounts } from '../../../components/hooks/useAccounts'; import { View } from 'react-native'; import { ACCOUNT_BALANCE_BY_ADDRESS_TEST_ID } from '../../../../wdio/screen-objects/testIDs/Components/AccountListComponent.testIds'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; const mockEngine = Engine; @@ -33,6 +34,7 @@ jest.mock('../../../core/Engine', () => ({ const initialState = { engine: { backgroundState: { + ...initialBackgroundState, NetworkController: { network: '1', providerConfig: { diff --git a/app/components/UI/AddToAddressBookWrapper/AddToAddressBookWrapper.test.tsx b/app/components/UI/AddToAddressBookWrapper/AddToAddressBookWrapper.test.tsx index 2a8ab873200..2f81b7075f6 100644 --- a/app/components/UI/AddToAddressBookWrapper/AddToAddressBookWrapper.test.tsx +++ b/app/components/UI/AddToAddressBookWrapper/AddToAddressBookWrapper.test.tsx @@ -6,11 +6,13 @@ import AddToAddressBookWrapper, { ADD_TO_ADDRESS_BOOK_BUTTON_ID, } from './AddToAddressBookWrapper'; import renderWithProvider from '../../../util/test/renderWithProvider'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; const initialState = { settings: {}, engine: { backgroundState: { + ...initialBackgroundState, PreferencesController: { selectedAddress: '0x0', identities: { diff --git a/app/components/UI/AddressInputs/index.test.jsx b/app/components/UI/AddressInputs/index.test.jsx index 04765f4592f..d2e8427865b 100644 --- a/app/components/UI/AddressInputs/index.test.jsx +++ b/app/components/UI/AddressInputs/index.test.jsx @@ -1,9 +1,9 @@ import React from 'react'; import { fireEvent } from '@testing-library/react-native'; -import Engine from '../../../core/Engine'; import renderWithProvider from '../../../util/test/renderWithProvider'; import { AddressFrom, AddressTo } from './index'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; jest.mock('../../../util/address', () => ({ ...jest.requireActual('../../../util/address'), @@ -14,6 +14,7 @@ const initialState = { settings: {}, engine: { backgroundState: { + ...initialBackgroundState, PreferencesController: { selectedAddress: '0x0', identities: { diff --git a/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx b/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx index de0d8ce0c3d..d5533f03670 100644 --- a/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx +++ b/app/components/UI/ApproveTransactionHeader/ApproveTransactionHeader.test.tsx @@ -2,6 +2,7 @@ import React from 'react'; import renderWithProvider from '../../../util/test/renderWithProvider'; import ApproveTransactionHeader from './'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; jest.mock('../../../core/Engine', () => ({ context: { @@ -16,10 +17,11 @@ jest.mock('../../../util/address', () => ({ renderAccountName: () => 'ABC', })); -const initialState = { +const mockInitialState = { settings: {}, engine: { backgroundState: { + ...initialBackgroundState, AccountTrackerController: { accounts: { '0x0': { @@ -30,35 +32,6 @@ const initialState = { }, }, }, - TokensController: { - tokens: [], - }, - TokenListController: { - tokenList: {}, - }, - TokenBalancesController: { - contractBalances: { - '0x326836cc6cd09B5aa59B81A7F72F25FcC0136b95': '0x5', - }, - }, - PermissionController: { - subjects: { - 'http://metamask.github.io': { - origin: 'http://metamask.github.io', - permissions: { - eth_accounts: { - invoker: 'http://metamask.github.io', - caveats: [ - { - type: 'restrictReturnedAccounts', - value: [{ address: '0x0' }], - }, - ], - }, - }, - }, - }, - }, PreferencesController: { selectedAddress: '0x0', identities: { @@ -72,10 +45,6 @@ const initialState = { }, }, }, - CurrencyRateController: { - conversionRate: 10, - currentCurrency: 'usd', - }, NetworkController: { providerConfig: { chainId: '0xaa36a7', @@ -83,9 +52,6 @@ const initialState = { nickname: 'Sepolia', }, }, - AddressBookController: { - addressBook: {}, - }, }, }, }; @@ -94,7 +60,7 @@ jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), useSelector: jest .fn() - .mockImplementation((callback) => callback(initialState)), + .mockImplementation((callback) => callback(mockInitialState)), })); jest.mock('../../../util/address', () => ({ @@ -111,7 +77,7 @@ describe('ApproveTransactionHeader', () => { url="http://metamask.github.io" asset={{ address: '0x0', symbol: 'ERC', decimals: 4 }} />, - { state: initialState }, + { state: mockInitialState }, ); expect(wrapper).toMatchSnapshot(); }); @@ -124,7 +90,7 @@ describe('ApproveTransactionHeader', () => { url="http://metamask.github.io" asset={{ address: '0x0', symbol: 'ERC', decimals: 4 }} />, - { state: initialState }, + { state: mockInitialState }, ); expect(getByText('http://metamask.github.io')).toBeDefined(); }); @@ -136,7 +102,7 @@ describe('ApproveTransactionHeader', () => { origin="http://metamask.github.io" url="http://metamask.github.io" />, - { state: initialState }, + { state: mockInitialState }, ); expect(getByText('http://metamask.github.io')).toBeDefined(); }); @@ -148,7 +114,7 @@ describe('ApproveTransactionHeader', () => { origin={undefined} url="http://metamask.github.io" />, - { state: initialState }, + { state: mockInitialState }, ); expect(container).toMatchSnapshot(); }); diff --git a/app/components/UI/ApproveTransactionReview/VerifyContractDetails/VerifyContractDetails.test.tsx b/app/components/UI/ApproveTransactionReview/VerifyContractDetails/VerifyContractDetails.test.tsx index b4ea524b720..a511a66fd22 100644 --- a/app/components/UI/ApproveTransactionReview/VerifyContractDetails/VerifyContractDetails.test.tsx +++ b/app/components/UI/ApproveTransactionReview/VerifyContractDetails/VerifyContractDetails.test.tsx @@ -1,14 +1,11 @@ import React from 'react'; import renderWithProvider from '../../../../util/test/renderWithProvider'; import VerifyContractDetails from './VerifyContractDetails'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; const initialState = { engine: { - backgroundState: { - TokensController: { - tokens: [], - }, - }, + backgroundState: initialBackgroundState, }, settings: { primaryCurrency: 'ETH', diff --git a/app/components/UI/Ramp/Views/GetStarted/GetStarted.test.tsx b/app/components/UI/Ramp/Views/GetStarted/GetStarted.test.tsx index a5116506a9f..ce5fe85f536 100644 --- a/app/components/UI/Ramp/Views/GetStarted/GetStarted.test.tsx +++ b/app/components/UI/Ramp/Views/GetStarted/GetStarted.test.tsx @@ -7,6 +7,7 @@ import { Region } from '../../types'; import { OnRampSDK } from '../../sdk'; import Routes from '../../../../../constants/navigation/Routes'; import { createRegionsNavDetails } from '../Regions/Regions'; +import initialBackgroundState from '../../../../../util/test/initial-background-state.json'; function render(Component: React.ComponentType) { return renderScreen( @@ -17,11 +18,7 @@ function render(Component: React.ComponentType) { { state: { engine: { - backgroundState: { - NetworkController: { - providerConfig: { type: 'mainnet', chainId: 1 }, - }, - }, + backgroundState: initialBackgroundState, }, }, }, diff --git a/app/components/UI/Ramp/Views/PaymentMethods/PaymentMethods.test.tsx b/app/components/UI/Ramp/Views/PaymentMethods/PaymentMethods.test.tsx index 635ce6f23a5..5cc6d5531d7 100644 --- a/app/components/UI/Ramp/Views/PaymentMethods/PaymentMethods.test.tsx +++ b/app/components/UI/Ramp/Views/PaymentMethods/PaymentMethods.test.tsx @@ -12,6 +12,7 @@ import usePaymentMethods from '../../hooks/usePaymentMethods'; import { Region } from '../../types'; import { OnRampSDK } from '../../sdk'; import Routes from '../../../../../constants/navigation/Routes'; +import initialBackgroundState from '../../../../../util/test/initial-background-state.json'; function render(Component: React.ComponentType) { return renderScreen( @@ -22,12 +23,7 @@ function render(Component: React.ComponentType) { { state: { engine: { - backgroundState: { - PreferencesController: {}, - NetworkController: { - providerConfig: { type: 'mainnet', chainId: 1 }, - }, - }, + backgroundState: initialBackgroundState, }, }, }, diff --git a/app/components/UI/Ramp/Views/Quotes/Quotes.test.tsx b/app/components/UI/Ramp/Views/Quotes/Quotes.test.tsx index 2d3a39c42d3..27ee8167bb4 100644 --- a/app/components/UI/Ramp/Views/Quotes/Quotes.test.tsx +++ b/app/components/UI/Ramp/Views/Quotes/Quotes.test.tsx @@ -23,6 +23,7 @@ import { OnRampSDK } from '../../sdk'; import useQuotes from '../../hooks/useQuotes'; import Routes from '../../../../../constants/navigation/Routes'; +import initialBackgroundState from '../../../../../util/test/initial-background-state.json'; function render(Component: React.ComponentType) { return renderScreen( @@ -33,15 +34,7 @@ function render(Component: React.ComponentType) { { state: { engine: { - backgroundState: { - PreferencesController: {}, - NetworkController: { - providerConfig: { - type: 'mainnet', - chainId: 1, - }, - }, - }, + backgroundState: initialBackgroundState, }, }, }, diff --git a/app/components/UI/Ramp/Views/Regions/Regions.test.tsx b/app/components/UI/Ramp/Views/Regions/Regions.test.tsx index d514fa2314d..2da747785fe 100644 --- a/app/components/UI/Ramp/Views/Regions/Regions.test.tsx +++ b/app/components/UI/Ramp/Views/Regions/Regions.test.tsx @@ -9,6 +9,7 @@ import { OnRampSDK } from '../../sdk'; import { Region } from '../../types'; import { createPaymentMethodsNavDetails } from '../PaymentMethods/PaymentMethods'; import Routes from '../../../../../constants/navigation/Routes'; +import initialBackgroundState from '../../../../../util/test/initial-background-state.json'; function render(Component: React.ComponentType) { return renderScreen( @@ -19,11 +20,7 @@ function render(Component: React.ComponentType) { { state: { engine: { - backgroundState: { - NetworkController: { - providerConfig: { type: 'mainnet', chainId: 1 }, - }, - }, + backgroundState: initialBackgroundState, }, }, }, diff --git a/app/components/UI/Tokens/index.test.tsx b/app/components/UI/Tokens/index.test.tsx index 697ca5aa6dc..2d70858361a 100644 --- a/app/components/UI/Tokens/index.test.tsx +++ b/app/components/UI/Tokens/index.test.tsx @@ -15,6 +15,7 @@ import { PORTFOLIO_BUTTON, TOTAL_BALANCE_TEXT, } from '../../../../wdio/screen-objects/testIDs/Components/Tokens.testIds'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; const mockEngine = Engine; @@ -31,6 +32,7 @@ jest.mock('../../../core/Engine', () => ({ const initialState = { engine: { backgroundState: { + ...initialBackgroundState, TokensController: { tokens: [ { @@ -61,9 +63,6 @@ const initialState = { }, ], }, - TokenListController: { - tokenList: {}, - }, TokenRatesController: { contractExchangeRates: { '0x0': 0.005, @@ -82,10 +81,6 @@ const initialState = { '0x02': new BN(0), }, }, - NetworkController: { - providerConfig: { chainId: '1' }, - }, - PreferencesController: { useTokenDetection: true }, }, }, settings: { diff --git a/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.test.tsx b/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.test.tsx index 6b98c15766e..3fce7a9d1c0 100644 --- a/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.test.tsx +++ b/app/components/UI/TransactionReview/TransactionReviewEIP1559/index.test.tsx @@ -1,21 +1,11 @@ import React from 'react'; import TransactionReviewEIP1559 from './'; import renderWithProvider from '../../../..//util/test/renderWithProvider'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; const initialState = { engine: { - backgroundState: { - CurrencyRateController: { - currentCurrency: 'usd', - conversionRate: 0.1, - }, - NetworkController: { - providerConfig: { - ticker: 'ETH', - chainId: '1', - }, - }, - }, + backgroundState: initialBackgroundState, }, }; diff --git a/app/components/UI/TransactionReview/TransactionReviewEIP1559Update/index.test.tsx b/app/components/UI/TransactionReview/TransactionReviewEIP1559Update/index.test.tsx index 7f09bfdbcc7..8755b0a2e0f 100644 --- a/app/components/UI/TransactionReview/TransactionReviewEIP1559Update/index.test.tsx +++ b/app/components/UI/TransactionReview/TransactionReviewEIP1559Update/index.test.tsx @@ -4,11 +4,13 @@ import renderWithProvider, { renderHookWithProvider, } from '../../../../util/test/renderWithProvider'; import TransactionReviewEIP1559 from './'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; const initialState = { settings: {}, engine: { backgroundState: { + ...initialBackgroundState, AccountTrackerController: { accounts: { '0x0': { diff --git a/app/components/UI/WalletAccount/WalletAccount.test.tsx b/app/components/UI/WalletAccount/WalletAccount.test.tsx index 5b4eaf78aae..eac82fb209b 100644 --- a/app/components/UI/WalletAccount/WalletAccount.test.tsx +++ b/app/components/UI/WalletAccount/WalletAccount.test.tsx @@ -9,21 +9,15 @@ import { createAccountSelectorNavDetails } from '../../../components/Views/Accou // Internal dependencies import WalletAccount from './WalletAccount'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; -const initialState = { +const mockInitialState = { settings: { useBlockieIcon: false, }, engine: { backgroundState: { - NetworkController: { - providerConfig: { - type: 'mainnet', - nickname: 'Ethereum mainnet', - ticket: 'eth', - chainId: '1', - }, - }, + ...initialBackgroundState, PreferencesController: { selectedAddress: '0x', identities: { '0x': { name: 'Account 1' } }, @@ -54,27 +48,27 @@ jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), useSelector: jest .fn() - .mockImplementation((callback) => callback(initialState)), + .mockImplementation((callback) => callback(mockInitialState)), })); describe('WalletAccount', () => { it('renders correctly', () => { const { toJSON } = renderWithProvider(, { - state: initialState, + state: mockInitialState, }); expect(toJSON()).toMatchSnapshot(); }); it('shows the account address', () => { const { getByTestId } = renderWithProvider(, { - state: initialState, + state: mockInitialState, }); expect(getByTestId('wallet-account-address')).toBeDefined(); }); it('copies the account address to the clipboard when the copy button is pressed', async () => { const { getByTestId } = renderWithProvider(, { - state: initialState, + state: mockInitialState, }); fireEvent.press(getByTestId('wallet-account-copy-button')); @@ -83,7 +77,7 @@ describe('WalletAccount', () => { it('should navigate to the account selector screen on account press', () => { const { getByTestId } = renderWithProvider(, { - state: initialState, + state: mockInitialState, }); fireEvent.press(getByTestId('account-picker')); diff --git a/app/components/Views/AccountActions/AccountActions.test.tsx b/app/components/Views/AccountActions/AccountActions.test.tsx index 5d18ea71f51..9ed00606399 100644 --- a/app/components/Views/AccountActions/AccountActions.test.tsx +++ b/app/components/Views/AccountActions/AccountActions.test.tsx @@ -14,6 +14,7 @@ import { SHOW_PRIVATE_KEY, VIEW_ETHERSCAN, } from './AccountActions.constants'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; const mockEngine = Engine; @@ -21,15 +22,12 @@ const initialState = { swaps: { '1': { isLive: true }, hasOnboarded: false, isLive: true }, engine: { backgroundState: { + ...initialBackgroundState, PreferencesController: { selectedAddress: '0xe7E125654064EEa56229f273dA586F10DF96B0a1', identities: { '0xe7E125654064EEa56229f273dA586F10DF96B0a1': { name: 'Account 1' }, }, - frequentRpcList: [], - }, - NetworkController: { - providerConfig: { type: 'mainnet', chainId: '1', ticker: 'ETH' }, }, }, }, diff --git a/app/components/Views/EditAccountName/EditAccountName.test.tsx b/app/components/Views/EditAccountName/EditAccountName.test.tsx index 5fe08e88e97..cc7fe1c8158 100644 --- a/app/components/Views/EditAccountName/EditAccountName.test.tsx +++ b/app/components/Views/EditAccountName/EditAccountName.test.tsx @@ -5,6 +5,7 @@ import { fireEvent } from '@testing-library/react-native'; // Internal dependencies import EditAccountName from './EditAccountName'; import renderWithProvider from '../../../util/test/renderWithProvider'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; const mockSetAccountLabel = jest.fn(); @@ -16,7 +17,7 @@ jest.mock('../../../core/Engine', () => ({ }, })); -const initialState = { +const mockInitialState = { swaps: { '1': { isLive: true }, hasOnboarded: false, isLive: true }, wizard: { step: 0, @@ -26,6 +27,7 @@ const initialState = { }, engine: { backgroundState: { + ...initialBackgroundState, PreferencesController: { selectedAddress: '0x', identities: { @@ -40,7 +42,7 @@ jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), useSelector: jest .fn() - .mockImplementation((callback) => callback(initialState)), + .mockImplementation((callback) => callback(mockInitialState)), })); const mockNavigate = jest.fn(); @@ -69,7 +71,7 @@ describe('EditAccountName', () => { mockSetOptions.mockClear(); }); it('should render correctly', () => { - const { getByText, toJSON } = renderComponent(initialState); + const { getByText, toJSON } = renderComponent(mockInitialState); expect(getByText('Cancel')).toBeDefined(); expect(getByText('Save')).toBeDefined(); expect(getByText('Name')).toBeDefined(); @@ -78,7 +80,7 @@ describe('EditAccountName', () => { }); it('should enable the save button when text input changes', () => { - const { getByTestId } = renderComponent(initialState); + const { getByTestId } = renderComponent(mockInitialState); const input = getByTestId('account-name-input'); const saveButton = getByTestId('save-button'); @@ -91,14 +93,14 @@ describe('EditAccountName', () => { }); it('should call goBack when cancel button is pressed', () => { - const { getByText } = renderComponent(initialState); + const { getByText } = renderComponent(mockInitialState); const cancelButton = getByText('Cancel'); fireEvent.press(cancelButton); expect(mockGoBack).toHaveBeenCalled(); }); it('should call navigate when save button is pressed', () => { - const { getByTestId } = renderComponent(initialState); + const { getByTestId } = renderComponent(mockInitialState); const input = getByTestId('account-name-input'); const saveButton = getByTestId('save-button'); fireEvent.changeText(input, 'New Name'); diff --git a/app/components/Views/NetworkSelector/NetworkSelector.test.tsx b/app/components/Views/NetworkSelector/NetworkSelector.test.tsx index c65e0d7183a..ded88c77abe 100644 --- a/app/components/Views/NetworkSelector/NetworkSelector.test.tsx +++ b/app/components/Views/NetworkSelector/NetworkSelector.test.tsx @@ -5,6 +5,7 @@ import { fireEvent } from '@testing-library/react-native'; // External dependencies import renderWithProvider from '../../../util/test/renderWithProvider'; import Engine from '../../../core/Engine'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; // Internal dependencies import NetworkSelector from './NetworkSelector'; @@ -45,9 +46,7 @@ const initialState = { }, engine: { backgroundState: { - SwapsController: { - tokens: [], - }, + ...initialBackgroundState, AccountTrackerController: { accounts: { '0x': { @@ -69,9 +68,6 @@ const initialState = { conversionRate: 5, currentCurrency: 'usd', }, - TokensController: { - tokens: [], - }, PreferencesController: { showTestNetworks: false, selectedAddress: '0x', @@ -113,15 +109,6 @@ const initialState = { }, ], }, - TokenBalancesController: { - contractBalances: {}, - }, - TokenListController: { - tokenList: {}, - }, - TokenRatesController: { - contractExchangeRates: {}, - }, NftController: { allNfts: { '0x': { '1': [] } }, allNftContracts: { '0x': { '1': [] } }, @@ -173,18 +160,7 @@ describe('Network Selector', () => { }, engine: { backgroundState: { - SwapsController: { - tokens: [], - }, - AccountTrackerController: { - accounts: { - '0x': { - name: 'account 1', - address: '0x', - balance: 0, - }, - }, - }, + ...initialState.engine.backgroundState, NetworkController: { providerConfig: { type: 'mainnet', @@ -193,78 +169,6 @@ describe('Network Selector', () => { chainId: '5', }, }, - CurrencyRateController: { - conversionRate: 5, - currentCurrency: 'usd', - }, - TokensController: { - tokens: [], - }, - PreferencesController: { - showTestNetworks: false, - selectedAddress: '0x', - identities: { - '0x': { name: 'Account 1', address: '0x' }, - }, - frequentRpcList: [ - { - chainId: '43114', - nickname: 'Avalanche Mainnet C-Chain', - rpcPrefs: { blockExplorerUrl: 'https://snowtrace.io' }, - rpcUrl: 'https://api.avax.network/ext/bc/C/rpc', - ticker: 'AVAX', - }, - { - chainId: '137', - nickname: 'Polygon Mainnet', - rpcPrefs: { blockExplorerUrl: 'https://polygonscan.com' }, - rpcUrl: - 'https://polygon-mainnet.infura.io/v3/cda392a134014865ad3c273dc7ddfff3', - ticker: 'MATIC', - }, - { - chainId: '10', - nickname: 'Optimism', - rpcPrefs: { - blockExplorerUrl: 'https://optimistic.etherscan.io', - }, - rpcUrl: - 'https://optimism-mainnet.infura.io/v3/cda392a134014865ad3c273dc7ddfff3', - ticker: 'ETH', - }, - { - chainId: '59140', - nickname: 'Linea Goerli Test Network', - rpcPrefs: { - blockExplorerUrl: 'https://explorer.goerli.linea.build', - }, - rpcUrl: 'https://rpc.goerli.linea.build/', - ticker: 'LineaETH', - }, - { - chainId: '100', - nickname: 'Gnosis Chain', - rpcPrefs: { - blockExplorerUrl: 'https://blockscout.com/xdai/mainnet/', - }, - rpcUrl: 'https://rpc.gnosischain.com/', - ticker: 'XDAI', - }, - ], - }, - TokenBalancesController: { - contractBalances: {}, - }, - TokenListController: { - tokenList: {}, - }, - TokenRatesController: { - contractExchangeRates: {}, - }, - NftController: { - allNfts: { '0x': { '1': [] } }, - allNftContracts: { '0x': { '1': [] } }, - }, }, }, }); diff --git a/app/components/Views/SendFlow/AddressElement/AddressElement.test.tsx b/app/components/Views/SendFlow/AddressElement/AddressElement.test.tsx index fd91e73d929..ea90da56381 100644 --- a/app/components/Views/SendFlow/AddressElement/AddressElement.test.tsx +++ b/app/components/Views/SendFlow/AddressElement/AddressElement.test.tsx @@ -4,6 +4,7 @@ import renderWithProvider from '../../../../util/test/renderWithProvider'; import AddressElement from './'; import Engine from '../../../../core/Engine'; import { renderShortAddress } from '../../../../util/address'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; const mockEngine = Engine; @@ -22,11 +23,7 @@ jest.mock('../../../../core/Engine', () => ({ const initialState = { engine: { - backgroundState: { - NetworkController: { - network: '1', - }, - }, + backgroundState: initialBackgroundState, }, }; diff --git a/app/components/Views/SendFlow/AddressList/AddressList.test.tsx b/app/components/Views/SendFlow/AddressList/AddressList.test.tsx index 9cf2f551bd5..01e685c9684 100644 --- a/app/components/Views/SendFlow/AddressList/AddressList.test.tsx +++ b/app/components/Views/SendFlow/AddressList/AddressList.test.tsx @@ -1,16 +1,12 @@ import React from 'react'; import renderWithProvider from '../../../../util/test/renderWithProvider'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; import AddressList from './'; const initialState = { engine: { backgroundState: { - NetworkController: { - network: '1', - providerConfig: { - chainId: '1', - }, - }, + ...initialBackgroundState, AddressBookController: { addressBook: { '0x51239E13Fe029cD52asA8babEBafb6814bc8Ba4b': { @@ -30,9 +26,6 @@ const initialState = { }, }, }, - TransactionController: { - transactions: [], - }, }, }, }; diff --git a/app/components/Views/SendFlow/Amount/index.test.tsx b/app/components/Views/SendFlow/Amount/index.test.tsx index be1ede85723..2e47a72af72 100644 --- a/app/components/Views/SendFlow/Amount/index.test.tsx +++ b/app/components/Views/SendFlow/Amount/index.test.tsx @@ -12,6 +12,7 @@ import { TRANSACTION_AMOUNT_CONVERSION_VALUE, TRANSACTION_AMOUNT_INPUT, } from '../../../../../wdio/screen-objects/testIDs/Screens/AmountScreen.testIds.js'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; const mockEngine = Engine; const mockTransactionTypes = TransactionTypes; @@ -71,6 +72,7 @@ const RECEIVER_ACCOUNT = '0x2a'; const initialState = { engine: { backgroundState: { + ...initialBackgroundState, NetworkController: { network: '1', providerConfig: { @@ -91,20 +93,10 @@ const initialState = { }, }, }, - TokensController: { - tokens: [], - }, NftController: { allNfts: { [CURRENT_ACCOUNT]: { '1': [] } }, allNftContracts: { [CURRENT_ACCOUNT]: { '1': [] } }, }, - TokenRatesController: { - contractExchangeRates: {}, - }, - CurrencyRateController: {}, - TokenBalancesController: { - contractBalances: {}, - }, }, }, settings: { diff --git a/app/components/Views/SendFlow/Confirm/index.test.tsx b/app/components/Views/SendFlow/Confirm/index.test.tsx index a1d5d1e8603..f965a721bd3 100644 --- a/app/components/Views/SendFlow/Confirm/index.test.tsx +++ b/app/components/Views/SendFlow/Confirm/index.test.tsx @@ -4,10 +4,12 @@ import { waitFor } from '@testing-library/react-native'; import Confirm from '.'; import { renderScreen } from '../../../../util/test/renderWithProvider'; import Routes from '../../../../constants/navigation/Routes'; +import initialBackgroundState from '../../../../util/test/initial-background-state.json'; -const initialState = { +const mockInitialState = { engine: { backgroundState: { + ...initialBackgroundState, NetworkController: { network: '1', providerConfig: { @@ -15,25 +17,13 @@ const initialState = { type: 'mainnet', }, }, - AddressBookController: { - addressBook: {}, - }, AccountTrackerController: { accounts: { '0x2': { balance: '0' } }, }, - TransactionController: { - transactions: [], - }, - TokenRatesController: { - contractExchangeRates: {}, - }, CurrencyRateController: { currentCurrency: 'USD', conversionRate: 1, }, - TokenBalancesController: { - contractBalances: {}, - }, PreferencesController: { identities: { '0x1': { name: 'Account1' }, @@ -42,9 +32,6 @@ const initialState = { KeyringController: { keyrings: [{ accounts: ['0x'], type: 'HD Key Tree' }], }, - GasFeeController: { - gasFeeEstimates: {}, - }, }, }, settings: { @@ -74,7 +61,7 @@ jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), useSelector: jest .fn() - .mockImplementation((callback) => callback(initialState)), + .mockImplementation((callback) => callback(mockInitialState)), })); jest.mock('../../../../core/GasPolling/GasPolling', () => ({ ...jest.requireActual('../../../../core/GasPolling/GasPolling'), @@ -112,7 +99,7 @@ function render(Component: React.ComponentType | ConnectedComponent) { name: Routes.SEND_FLOW.CONFIRM, }, { - state: initialState, + state: mockInitialState, }, ); } diff --git a/app/components/Views/WalletActions/WalletActions.test.tsx b/app/components/Views/WalletActions/WalletActions.test.tsx index 1b11b96f4ac..a69fba2e5f6 100644 --- a/app/components/Views/WalletActions/WalletActions.test.tsx +++ b/app/components/Views/WalletActions/WalletActions.test.tsx @@ -11,6 +11,7 @@ import { WALLET_SWAP, } from './WalletActions.constants'; import Engine from '../../../core/Engine'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; const mockEngine = Engine; @@ -28,7 +29,7 @@ const mockInitialState = { }, engine: { backgroundState: { - PreferencesController: {}, + ...initialBackgroundState, NetworkController: { providerConfig: { type: 'mainnet', chainId: '1', ticker: 'ETH' }, }, @@ -89,7 +90,7 @@ describe('WalletActions', () => { }); it('should not show the buy button and swap button if the chain does not allow buying', () => { - const state = { + const mockState = { swaps: { '1': { isLive: false }, hasOnboarded: false, isLive: true }, fiatOrders: { networks: [ @@ -103,7 +104,7 @@ describe('WalletActions', () => { }, engine: { backgroundState: { - PreferencesController: {}, + ...initialBackgroundState, NetworkController: { providerConfig: { type: 'mainnet', @@ -117,11 +118,13 @@ describe('WalletActions', () => { jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), - useSelector: jest.fn().mockImplementation((callback) => callback(state)), + useSelector: jest + .fn() + .mockImplementation((callback) => callback(mockState)), })); const { queryByTestId } = renderWithProvider(, { - state, + mockState, }); expect(queryByTestId(WALLET_BUY)).toBeNull(); diff --git a/app/components/hooks/useExistingAddress.test.ts b/app/components/hooks/useExistingAddress.test.ts index 722c39c46a6..de021f5066b 100644 --- a/app/components/hooks/useExistingAddress.test.ts +++ b/app/components/hooks/useExistingAddress.test.ts @@ -1,43 +1,12 @@ import { renderHookWithProvider } from '../../util/test/renderWithProvider'; import useExistingAddress from './useExistingAddress'; +import initialBackgroundState from '../../util/test/initial-background-state.json'; -jest.mock('react-redux', () => ({ - ...jest.requireActual('react-redux'), - useSelector: (fn: any) => - fn({ - engine: { - backgroundState: { - PreferencesController: { - selectedAddress: '0x0', - identities: { - '0x0': { - address: '0x0', - name: 'Account 1', - }, - }, - }, - NetworkController: { - network: 1, - }, - AddressBookController: { - addressBook: { - 1: { - '0x1': { - address: '0x1', - name: 'Account 2', - }, - }, - }, - }, - }, - }, - }), -})); - -const initialState = { +const mockInitialState = { settings: {}, engine: { backgroundState: { + ...initialBackgroundState, PreferencesController: { selectedAddress: '0x0', identities: { @@ -64,22 +33,27 @@ const initialState = { }, }; +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useSelector: (fn: any) => fn(mockInitialState), +})); + describe('useExistingAddress', () => { it('should return existing address from identities', async () => { const { result } = renderHookWithProvider(() => useExistingAddress('0x0'), { - state: initialState, + state: mockInitialState, }); expect(result?.current?.name).toEqual('Account 1'); }); it('should return existing address from address book', async () => { const { result } = renderHookWithProvider(() => useExistingAddress('0x1'), { - state: initialState, + state: mockInitialState, }); expect(result?.current?.name).toEqual('Account 2'); }); it('should return undefined address not in identities or address book', async () => { const { result } = renderHookWithProvider(() => useExistingAddress('0x2'), { - state: initialState, + state: mockInitialState, }); expect(result?.current).toBeUndefined(); }); diff --git a/app/components/hooks/useTokenBalancesController/useTokenBalancesController.test.tsx b/app/components/hooks/useTokenBalancesController/useTokenBalancesController.test.tsx index 99b05e6fbec..286058f1cf8 100644 --- a/app/components/hooks/useTokenBalancesController/useTokenBalancesController.test.tsx +++ b/app/components/hooks/useTokenBalancesController/useTokenBalancesController.test.tsx @@ -6,11 +6,13 @@ import { act, render, waitFor } from '@testing-library/react-native'; import useTokenBalancesController from './useTokenBalancesController'; import { BN } from 'ethereumjs-util'; import { cloneDeep } from 'lodash'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; // initial state for the test store -const initialState = { +const mockInitialState = { engine: { backgroundState: { + ...initialBackgroundState, TokenBalancesController: { contractBalances: { '0x326836cc6cd09B5aa59B81A7F72F25FcC0136b95': new BN(0x2a), @@ -66,7 +68,7 @@ describe('useTokenBalancesController()', () => { // create a test store, not a mock, as we need to test for content changes // Cloning as the store is mutated by the reducer and prevents the test from // starting from fresh store with the initial state - testStore = createStore(testBalancesReducer, cloneDeep(initialState)); + testStore = createStore(testBalancesReducer, cloneDeep(mockInitialState)); // console.log('testStore', JSON.stringify(testStore.getState())); diff --git a/app/util/logs/index.test.ts b/app/util/logs/index.test.ts index 932461cf17f..b29a3eacb70 100644 --- a/app/util/logs/index.test.ts +++ b/app/util/logs/index.test.ts @@ -1,4 +1,5 @@ import { generateStateLogs } from '.'; +import initialBackgroundState from '../../util/test/initial-background-state.json'; jest.mock('../../core/Engine', () => ({ context: { @@ -15,12 +16,7 @@ describe('logs :: generateStateLogs', () => { const mockStateInput = { engine: { backgroundState: { - NftController: {}, - TokensController: {}, - AssetsContractController: {}, - TokenDetectionController: {}, - NftDetectionController: {}, - PhishingController: {}, + ...initialBackgroundState, KeyringController: { vault: 'vault mock', }, From 71340aa884b72f90f8f125275e4033cf49947281 Mon Sep 17 00:00:00 2001 From: Brian August Nguyen Date: Tue, 25 Jul 2023 12:55:26 -0700 Subject: [PATCH 09/20] Fixed misalignment issue for multiselect cells (#6863) --- .../variants/CellMultiSelect/CellMultiSelect.styles.ts | 3 +++ .../Cell/variants/CellMultiSelect/CellMultiSelect.tsx | 1 + .../__snapshots__/CellMultiSelect.test.tsx.snap | 10 ++++++++++ .../MultiSelectItem/MultiSelectItem.styles.ts | 1 - .../__snapshots__/MultiSelectItem.test.tsx.snap | 1 - 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.styles.ts b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.styles.ts index 40b95a5ddee..3a491ddc210 100644 --- a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.styles.ts +++ b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.styles.ts @@ -24,6 +24,9 @@ const styleSheet = (params: { return StyleSheet.create({ base: Object.assign({} as ViewStyle, style) as ViewStyle, + cell: { + flex: 1, + }, }); }; diff --git a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.tsx b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.tsx index 0c81b2cd9be..8753fb9f94d 100644 --- a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.tsx +++ b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/CellMultiSelect.tsx @@ -39,6 +39,7 @@ const CellMultiSelect = ({ secondaryText={secondaryText} tertiaryText={tertiaryText} tagLabel={tagLabel} + style={styles.cell} > {children} diff --git a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap index 7907998c01e..0e1f17837f6 100644 --- a/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap +++ b/app/component-library/components/Cells/Cell/variants/CellMultiSelect/__snapshots__/CellMultiSelect.test.tsx.snap @@ -16,6 +16,11 @@ exports[`CellMultiSelect - Snapshot should render default settings correctly 1`] "variant": "Account", } } + style={ + Object { + "flex": 1, + } + } title="Orangefox.eth" /> @@ -37,6 +42,11 @@ exports[`CellMultiSelect - Snapshot should render the proper selected state 1`] "variant": "Account", } } + style={ + Object { + "flex": 1, + } + } title="Orangefox.eth" /> diff --git a/app/component-library/components/Select/MultiSelect/MultiSelectItem/MultiSelectItem.styles.ts b/app/component-library/components/Select/MultiSelect/MultiSelectItem/MultiSelectItem.styles.ts index 2a58e7c7f99..be326d6f602 100644 --- a/app/component-library/components/Select/MultiSelect/MultiSelectItem/MultiSelectItem.styles.ts +++ b/app/component-library/components/Select/MultiSelect/MultiSelectItem/MultiSelectItem.styles.ts @@ -25,7 +25,6 @@ const styleSheet = (params: { return StyleSheet.create({ base: Object.assign( { - flexDirection: 'row', alignItems: 'flex-start', backgroundColor: colors.background.default, opacity: isDisabled ? 0.5 : 1, diff --git a/app/component-library/components/Select/MultiSelect/MultiSelectItem/__snapshots__/MultiSelectItem.test.tsx.snap b/app/component-library/components/Select/MultiSelect/MultiSelectItem/__snapshots__/MultiSelectItem.test.tsx.snap index 392a6c00249..2a94cb50805 100644 --- a/app/component-library/components/Select/MultiSelect/MultiSelectItem/__snapshots__/MultiSelectItem.test.tsx.snap +++ b/app/component-library/components/Select/MultiSelect/MultiSelectItem/__snapshots__/MultiSelectItem.test.tsx.snap @@ -7,7 +7,6 @@ exports[`MultiSelectItem should render snapshot correctly 1`] = ` Object { "alignItems": "flex-start", "backgroundColor": "#FFFFFF", - "flexDirection": "row", "opacity": 1, } } From 35992d2c79ec56ecf9b13698d04343dce7243d5e Mon Sep 17 00:00:00 2001 From: sethkfman <10342624+sethkfman@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:29:46 -0600 Subject: [PATCH 10/20] fix(browser): added remaining fields in WebSourceResponse patch (#6479) * added remaining fields in WebSourceResposne patch * updated patch to provide reasonPhrase if empty * updated to remove build code --------- Co-authored-by: Cal Leung --- patches/react-native-webview+11.13.0.patch | 83 ++++++++++++---------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/patches/react-native-webview+11.13.0.patch b/patches/react-native-webview+11.13.0.patch index 311d1734e94..a2aabc78601 100644 --- a/patches/react-native-webview+11.13.0.patch +++ b/patches/react-native-webview+11.13.0.patch @@ -83,7 +83,7 @@ index 0000000..f4a6af9 + } +} diff --git a/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java b/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java -index f743bbc..ede5475 100644 +index f743bbc..406a7d4 100644 --- a/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java +++ b/node_modules/react-native-webview/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java @@ -5,6 +5,7 @@ import android.annotation.TargetApi; @@ -128,7 +128,7 @@ index f743bbc..ede5475 100644 import android.widget.FrameLayout; import androidx.annotation.Nullable; -@@ -88,18 +96,54 @@ import com.reactnativecommunity.webview.events.TopRenderProcessGoneEvent; +@@ -88,18 +96,55 @@ import com.reactnativecommunity.webview.events.TopRenderProcessGoneEvent; import org.json.JSONException; import org.json.JSONObject; @@ -162,6 +162,7 @@ index f743bbc..ede5475 100644 +import java.util.Set; import java.util.concurrent.atomic.AtomicReference; ++import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; @@ -183,7 +184,7 @@ index f743bbc..ede5475 100644 /** * Manages instances of {@link WebView} *

-@@ -137,13 +181,19 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -137,13 +182,19 @@ public class RNCWebViewManager extends SimpleViewManager { public static final int COMMAND_LOAD_URL = 7; public static final int COMMAND_FOCUS = 8; @@ -204,7 +205,7 @@ index f743bbc..ede5475 100644 protected static final String HTML_MIME_TYPE = "text/html"; protected static final String JAVASCRIPT_INTERFACE = "ReactNativeWebView"; protected static final String HTTP_METHOD_POST = "POST"; -@@ -155,13 +205,19 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -155,13 +206,19 @@ public class RNCWebViewManager extends SimpleViewManager { protected RNCWebChromeClient mWebChromeClient = null; protected boolean mAllowsFullscreenVideo = false; @@ -229,7 +230,7 @@ index f743bbc..ede5475 100644 }; } -@@ -182,6 +238,7 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -182,6 +239,7 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.LOLLIPOP) protected WebView createViewInstance(ThemedReactContext reactContext) { RNCWebView webView = createRNCWebViewInstance(reactContext); @@ -237,7 +238,7 @@ index f743bbc..ede5475 100644 setupWebChromeClient(reactContext, webView); reactContext.addLifecycleEventListener(webView); mWebViewConfig.configWebView(webView); -@@ -209,47 +266,161 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -209,47 +267,171 @@ public class RNCWebViewManager extends SimpleViewManager { } webView.setDownloadListener(new DownloadListener() { @@ -415,7 +416,17 @@ index f743bbc..ede5475 100644 + is = new InputStreamWithInjectedJS(is, reactWebView.injectedJSBeforeContentLoaded, charset); + } + -+ return new WebResourceResponse("text/html", charset.name(), is); ++ Headers headers = response.headers(); ++ Map headerMap = new HashMap(); ++ for (String headerName : headers.names()) { ++ String headerValue = headers.get(headerName); ++ headerMap.put(headerName, headerValue); ++ } ++ ++ //Response message is generally empty but response is valid. Populate a string of the response code if nothing exists ++ String reasonPhrase = response.message().isEmpty() ? Integer.toString(response.code()) : response.message(); ++ ++ return new WebResourceResponse("text/html", charset.name(), response.code(), reasonPhrase, headerMap, is); + } catch (IOException e) { + return null; + } @@ -424,7 +435,7 @@ index f743bbc..ede5475 100644 @ReactProp(name = "javaScriptEnabled") public void setJavaScriptEnabled(WebView view, boolean enabled) { view.getSettings().setJavaScriptEnabled(enabled); -@@ -285,13 +456,10 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -285,13 +467,10 @@ public class RNCWebViewManager extends SimpleViewManager { if (enabled) { Context ctx = view.getContext(); if (ctx != null) { @@ -438,7 +449,7 @@ index f743bbc..ede5475 100644 } } -@@ -327,12 +495,12 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -327,12 +506,12 @@ public class RNCWebViewManager extends SimpleViewManager { public void setLayerType(WebView view, String layerTypeString) { int layerType = View.LAYER_TYPE_NONE; switch (layerTypeString) { @@ -457,7 +468,7 @@ index f743bbc..ede5475 100644 } view.setLayerType(layerType, null); } -@@ -387,9 +555,9 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -387,9 +566,9 @@ public class RNCWebViewManager extends SimpleViewManager { @ReactProp(name = "userAgent") public void setUserAgent(WebView view, @Nullable String userAgent) { if (userAgent != null) { @@ -469,7 +480,7 @@ index f743bbc..ede5475 100644 } this.setUserAgentString(view); } -@@ -399,19 +567,19 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -399,19 +578,19 @@ public class RNCWebViewManager extends SimpleViewManager { if(applicationName != null) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { String defaultUserAgent = WebSettings.getDefaultUserAgent(view.getContext()); @@ -495,7 +506,7 @@ index f743bbc..ede5475 100644 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // handle unsets of `userAgent` prop as long as device is >= API 17 view.getSettings().setUserAgentString(WebSettings.getDefaultUserAgent(view.getContext())); -@@ -490,7 +658,6 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -490,7 +669,6 @@ public class RNCWebViewManager extends SimpleViewManager { // Disable caching view.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); @@ -503,7 +514,7 @@ index f743bbc..ede5475 100644 view.clearHistory(); view.clearCache(true); -@@ -842,13 +1009,116 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -842,13 +1020,116 @@ public class RNCWebViewManager extends SimpleViewManager { } } @@ -588,7 +599,7 @@ index f743bbc..ede5475 100644 + return nextByte; + } + } -+ + + if (!headWasFound) { + int nextByte = pageIS.read(); + contentBuffer.append((char) nextByte); @@ -609,7 +620,7 @@ index f743bbc..ede5475 100644 + } + + protected class RNCWebViewClient extends WebViewClient { - ++ + protected static final String REACT_CLASS = "RNCWebViewClient"; protected boolean mLastLoadFailed = false; protected @Nullable @@ -621,7 +632,7 @@ index f743bbc..ede5475 100644 public void setIgnoreErrFailedForThisURL(@Nullable String url) { ignoreErrFailedForThisURL = url; -@@ -857,24 +1127,26 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -857,24 +1138,26 @@ public class RNCWebViewManager extends SimpleViewManager { @Override public void onPageFinished(WebView webView, String url) { super.onPageFinished(webView, url); @@ -653,7 +664,7 @@ index f743bbc..ede5475 100644 ((RNCWebView) webView).dispatchEvent( webView, new TopLoadingStartEvent( -@@ -882,6 +1154,20 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -882,6 +1165,20 @@ public class RNCWebViewManager extends SimpleViewManager { createWebViewEvent(webView, url))); } @@ -674,7 +685,7 @@ index f743bbc..ede5475 100644 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { final RNCWebView rncWebView = (RNCWebView) view; -@@ -891,7 +1177,6 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -891,7 +1188,6 @@ public class RNCWebViewManager extends SimpleViewManager { final Pair> lock = RNCWebViewModule.shouldOverrideUrlLoadingLock.getNewLock(); final int lockIdentifier = lock.first; final AtomicReference lockObject = lock.second; @@ -682,7 +693,7 @@ index f743bbc..ede5475 100644 final WritableMap event = createWebViewEvent(view, url); event.putInt("lockIdentifier", lockIdentifier); rncWebView.sendDirectMessage("onShouldStartLoadWithRequest", event); -@@ -919,6 +1204,17 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -919,6 +1215,17 @@ public class RNCWebViewManager extends SimpleViewManager { RNCWebViewModule.shouldOverrideUrlLoadingLock.removeLock(lockIdentifier); return shouldOverride; @@ -700,7 +711,7 @@ index f743bbc..ede5475 100644 } else { FLog.w(TAG, "Couldn't use blocking synchronous call for onShouldStartLoadWithRequest due to debugging or missing Catalyst instance, falling back to old event-and-load."); progressChangedFilter.setWaitingForCommandLoadUrl(true); -@@ -934,67 +1230,86 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -934,67 +1241,86 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { @@ -795,7 +806,8 @@ index f743bbc..ede5475 100644 + int code = error.getPrimaryError(); + String description = ""; + String descriptionPrefix = "SSL error: "; -+ + +- description = descriptionPrefix + description; + // https://developer.android.com/reference/android/net/http/SslError.html + switch (code) { + case SslError.SSL_DATE_INVALID: @@ -821,15 +833,14 @@ index f743bbc..ede5475 100644 + break; + } -- description = descriptionPrefix + description; -+ description = descriptionPrefix + description; - - this.onReceivedError( - webView, - code, - description, - failingUrl - ); ++ description = descriptionPrefix + description; ++ + this.onReceivedError( + webView, + code, @@ -839,7 +850,7 @@ index f743bbc..ede5475 100644 } @Override -@@ -1005,9 +1320,9 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1005,9 +1331,9 @@ public class RNCWebViewManager extends SimpleViewManager { String failingUrl) { if (ignoreErrFailedForThisURL != null @@ -852,7 +863,7 @@ index f743bbc..ede5475 100644 // This is a workaround for a bug in the WebView. // See these chromium issues for more context: -@@ -1056,36 +1371,36 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1056,36 +1382,36 @@ public class RNCWebViewManager extends SimpleViewManager { @TargetApi(Build.VERSION_CODES.O) @Override public boolean onRenderProcessGone(WebView webView, RenderProcessGoneDetail detail) { @@ -913,7 +924,7 @@ index f743bbc..ede5475 100644 } protected void emitFinishEvent(WebView webView, String url) { -@@ -1138,6 +1453,7 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1138,6 +1464,7 @@ public class RNCWebViewManager extends SimpleViewManager { protected View mVideoView; protected WebChromeClient.CustomViewCallback mCustomViewCallback; @@ -921,7 +932,7 @@ index f743bbc..ede5475 100644 /* * - Permissions - -@@ -1217,19 +1533,44 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1217,19 +1544,44 @@ public class RNCWebViewManager extends SimpleViewManager { ArrayList requestedAndroidPermissions = new ArrayList<>(); for (String requestedResource : request.getResources()) { String androidPermission = null; @@ -967,7 +978,7 @@ index f743bbc..ede5475 100644 } else { requestedAndroidPermissions.add(androidPermission); } -@@ -1238,8 +1579,11 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1238,8 +1590,11 @@ public class RNCWebViewManager extends SimpleViewManager { // If all the permissions are already granted, send the response to the WebView synchronously if (requestedAndroidPermissions.isEmpty()) { @@ -981,7 +992,7 @@ index f743bbc..ede5475 100644 return; } -@@ -1250,6 +1594,10 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1250,6 +1605,10 @@ public class RNCWebViewManager extends SimpleViewManager { requestPermissions(requestedAndroidPermissions); } @@ -992,7 +1003,7 @@ index f743bbc..ede5475 100644 @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { -@@ -1402,6 +1750,15 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1402,6 +1761,15 @@ public class RNCWebViewManager extends SimpleViewManager { } } @@ -1008,7 +1019,7 @@ index f743bbc..ede5475 100644 @Override public void onHostPause() { } -@@ -1447,6 +1804,13 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1447,6 +1815,13 @@ public class RNCWebViewManager extends SimpleViewManager { protected boolean nestedScrollEnabled = false; protected ProgressChangedFilter progressChangedFilter; @@ -1022,7 +1033,7 @@ index f743bbc..ede5475 100644 /** * WebView must be created with an context of the current activity *

-@@ -1475,6 +1839,42 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1475,6 +1850,42 @@ public class RNCWebViewManager extends SimpleViewManager { this.nestedScrollEnabled = nestedScrollEnabled; } @@ -1065,7 +1076,7 @@ index f743bbc..ede5475 100644 @Override public void onHostResume() { // do nothing -@@ -1533,6 +1933,8 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1533,6 +1944,8 @@ public class RNCWebViewManager extends SimpleViewManager { } } @@ -1074,7 +1085,7 @@ index f743bbc..ede5475 100644 public @Nullable RNCWebViewClient getRNCWebViewClient() { return mRNCWebViewClient; -@@ -1609,8 +2011,8 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1609,8 +2022,8 @@ public class RNCWebViewManager extends SimpleViewManager { public void callInjectedJavaScriptBeforeContentLoaded() { if (getSettings().getJavaScriptEnabled() && @@ -1085,7 +1096,7 @@ index f743bbc..ede5475 100644 evaluateJavascriptWithFallback("(function() {\n" + injectedJSBeforeContentLoaded + ";\n})();"); } } -@@ -1672,16 +2074,16 @@ public class RNCWebViewManager extends SimpleViewManager { +@@ -1672,16 +2085,16 @@ public class RNCWebViewManager extends SimpleViewManager { if (mOnScrollDispatchHelper.onScrollChanged(x, y)) { ScrollEvent event = ScrollEvent.obtain( From a936db3ec0ee0a9a9e3355f405494d18c8f18f3b Mon Sep 17 00:00:00 2001 From: LeoTM <1881059+leotm@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:32:52 +0100 Subject: [PATCH 11/20] refactor: TypeScript ~4.8.4 and ESLint deps upgrades and initial type fixes (#6080) * TypeScript 5 ESLint upgrade and initial type fixes * Add back test and rename both * Update ESLint config comment * Downgrade TypeScript from ^5.0.2 to ~4.8.4 As @Gudahtt pointed out in: https://github.com/MetaMask/metamask-mobile/pull/6080#discussion_r1155902095 * Update Yarn.lock after conflict resolution * Bump CocoaPods from 1.11.3 to 1.12.0 Unsure why Git autoresolved to 1.11.3 nor flagged as conflict * Revert "Bump CocoaPods from 1.11.3 to 1.12.0" Nevermind, this is/should only be done in RN upg branch 0.71.6+ This reverts commit 4354a9eeff0f41a87e60b62da197a686006c1565. * Revert ButtonLink.types.ts TextStyle addition After call with @brianacnguyen * Remove Button style from ContractBoxBase After call with @brianacnguyen * Update Yarn lockfile (from prev conflict res) * Fix lint error @typescript-eslint/no-loss-of-precision Keep mock account balances consistent as hex strings * Downgrade ESLint config to v9 and fix peer dependency warnings * Bump eslint-plugin-react-native 4.0.0 to ^4.0.0 --------- Co-authored-by: sethkfman <10342624+sethkfman@users.noreply.github.com> Co-authored-by: Mark Stacey Co-authored-by: Cal Leung --- .eslintrc.js | 7 + ...e-payments.js => react-native-payments.ts} | 0 .../{async-storage.js => async-storage.ts} | 0 ...ct-native-i18n.js => react-native-i18n.ts} | 2 - app/actions/security/index.ts | 10 +- .../ContractBoxBase/ContractBoxBase.test.tsx | 4 + .../ContractBoxBase/ContractBoxBase.tsx | 1 - .../ContractBoxBase.test.tsx.snap | 5 +- app/components/UI/Identicon/index.tsx | 5 + .../useAddressBalance.test.tsx | 2 +- app/core/Authentication/Authentication.ts | 4 +- app/core/EngineService/EngineService.ts | 2 +- app/declarations.d.ts | 7 + package.json | 28 +- yarn.lock | 1190 +++++++---------- 15 files changed, 543 insertions(+), 724 deletions(-) rename app/__mocks__/@exodus/{react-native-payments.js => react-native-payments.ts} (100%) rename app/__mocks__/@react-native-async-storage/{async-storage.js => async-storage.ts} (100%) rename app/__mocks__/{react-native-i18n.js => react-native-i18n.ts} (96%) diff --git a/.eslintrc.js b/.eslintrc.js index a80f341b52f..0b1048a3cf9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,6 +3,9 @@ module.exports = { root: true, parser: 'babel-eslint', extends: [ + // @react-native-community + // - Depends on babel-eslint parser + // - Migrated to @react-native/eslint-config after v3.2.0 '@react-native-community', 'eslint:recommended', 'plugin:import/warnings', @@ -13,6 +16,10 @@ module.exports = { { files: ['*.{ts,tsx}'], extends: ['@metamask/eslint-config-typescript'], + rules: { + // TODO: re-enable + 'jsdoc/no-types': 'off', + }, }, { files: ['scripts/**/*.js'], diff --git a/app/__mocks__/@exodus/react-native-payments.js b/app/__mocks__/@exodus/react-native-payments.ts similarity index 100% rename from app/__mocks__/@exodus/react-native-payments.js rename to app/__mocks__/@exodus/react-native-payments.ts diff --git a/app/__mocks__/@react-native-async-storage/async-storage.js b/app/__mocks__/@react-native-async-storage/async-storage.ts similarity index 100% rename from app/__mocks__/@react-native-async-storage/async-storage.js rename to app/__mocks__/@react-native-async-storage/async-storage.ts diff --git a/app/__mocks__/react-native-i18n.js b/app/__mocks__/react-native-i18n.ts similarity index 96% rename from app/__mocks__/react-native-i18n.js rename to app/__mocks__/react-native-i18n.ts index 250cb6464d5..95f9fe03dbb 100644 --- a/app/__mocks__/react-native-i18n.js +++ b/app/__mocks__/react-native-i18n.ts @@ -1,5 +1,3 @@ -// @flow - // eslint-disable-next-line import/no-extraneous-dependencies import I18nJs from 'i18n-js'; diff --git a/app/actions/security/index.ts b/app/actions/security/index.ts index 80d5d4323c2..2b5e2d5be46 100644 --- a/app/actions/security/index.ts +++ b/app/actions/security/index.ts @@ -1,5 +1,5 @@ /* eslint-disable import/prefer-default-export */ -import type { Action } from 'redux'; +import type { Action as ReduxAction } from 'redux'; export enum ActionType { SET_ALLOW_LOGIN_WITH_REMEMBER_ME = 'SET_ALLOW_LOGIN_WITH_REMEMBER_ME', @@ -9,22 +9,22 @@ export enum ActionType { } export interface AllowLoginWithRememberMeUpdated - extends Action { + extends ReduxAction { enabled: boolean; } export interface AutomaticSecurityChecks - extends Action { + extends ReduxAction { enabled: boolean; } export interface UserSelectedAutomaticSecurityChecksOptions - extends Action { + extends ReduxAction { selected: boolean; } export interface SetAutomaticSecurityChecksModalOpen - extends Action { + extends ReduxAction { open: boolean; } diff --git a/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.test.tsx b/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.test.tsx index c7fb7934b7f..26dd0e82a49 100644 --- a/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.test.tsx +++ b/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.test.tsx @@ -5,6 +5,8 @@ import TEST_ADDRESS from '../../../../constants/address'; import { CONTRACT_PET_NAME, CONTRACT_LOCAL_IMAGE, + CONTRACT_COPY_ADDRESS, + CONTRACT_ON_PRESS, } from '../ContractBox/ContractBox.constants'; import { CONTRACT_BOX_NO_PET_NAME_TEST_ID } from './ContractBoxBase.constants'; import { ContractBoxBaseProps } from './ContractBoxBase.types'; @@ -17,6 +19,8 @@ describe('Component ContractBoxBase', () => { contractAddress: TEST_ADDRESS, contractPetName: CONTRACT_PET_NAME, contractLocalImage: CONTRACT_LOCAL_IMAGE, + onCopyAddress: CONTRACT_COPY_ADDRESS, + onContractPress: CONTRACT_ON_PRESS, }; }); diff --git a/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.tsx b/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.tsx index 883127d12ea..4cb12c1d3bd 100644 --- a/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.tsx +++ b/app/component-library/components-temp/Contracts/ContractBoxBase/ContractBoxBase.tsx @@ -72,7 +72,6 @@ const ContractBoxBase = ({ variant={ButtonVariants.Link} textVariant={TextVariant.HeadingMD} label={formattedAddress} - style={styles.header} onPress={onContractPress} /> diff --git a/app/component-library/components-temp/Contracts/ContractBoxBase/__snapshots__/ContractBoxBase.test.tsx.snap b/app/component-library/components-temp/Contracts/ContractBoxBase/__snapshots__/ContractBoxBase.test.tsx.snap index 54c91704a9f..560e0d73445 100644 --- a/app/component-library/components-temp/Contracts/ContractBoxBase/__snapshots__/ContractBoxBase.test.tsx.snap +++ b/app/component-library/components-temp/Contracts/ContractBoxBase/__snapshots__/ContractBoxBase.test.tsx.snap @@ -36,7 +36,9 @@ exports[`Component ContractBoxBase should render correctly 1`] = ` variant="Token" /> - + diff --git a/app/components/UI/Identicon/index.tsx b/app/components/UI/Identicon/index.tsx index c2046d1e9c0..87568aca4eb 100644 --- a/app/components/UI/Identicon/index.tsx +++ b/app/components/UI/Identicon/index.tsx @@ -30,6 +30,11 @@ interface IdenticonProps { useBlockieIcon?: boolean; } +/** + * UI component that renders an Identicon + * for now it's just a blockie + * but we could add more types in the future + */ const Identicon: React.FC = ({ diameter = 46, address, diff --git a/app/components/hooks/useAddressBalance/useAddressBalance.test.tsx b/app/components/hooks/useAddressBalance/useAddressBalance.test.tsx index ffb053d6de1..d74825bea98 100644 --- a/app/components/hooks/useAddressBalance/useAddressBalance.test.tsx +++ b/app/components/hooks/useAddressBalance/useAddressBalance.test.tsx @@ -17,7 +17,7 @@ const mockInitialState = { AccountTrackerController: { accounts: { '0x0': { - balance: 0x4a7036655fab2ca3, + balance: '0x4a7036655fab2ca3', }, '0x1': { balance: '0x5', diff --git a/app/core/Authentication/Authentication.ts b/app/core/Authentication/Authentication.ts index d4eb9436e7f..acc319c5ff8 100644 --- a/app/core/Authentication/Authentication.ts +++ b/app/core/Authentication/Authentication.ts @@ -141,9 +141,9 @@ class AuthenticationService { * This method is used for password memory obfuscation * It simply returns an empty string so we can reset all the sensitive params like passwords and SRPs. * Since we cannot control memory in JS the best we can do is remove the pointer to sensitive information in memory - * - see this thread for more details: https://security.stackexchange.com/questions/192387/how-to-securely-erase-javascript-parameters-after-use + * - see this thread for more details: https://security.stackexchange.com/questions/192387/how-to-securely-erase-javascript-parameters-after-use * [Future improvement] to fully remove these values from memory we can convert these params to Buffers or UInt8Array as is done in extension - * - see: https://github.com/MetaMask/metamask-extension/commit/98f187c301176152a7f697e62e2ba6d78b018b68 + * - see: https://github.com/MetaMask/metamask-extension/commit/98f187c301176152a7f697e62e2ba6d78b018b68 */ private wipeSensitiveData = () => ''; diff --git a/app/core/EngineService/EngineService.ts b/app/core/EngineService/EngineService.ts index f2bb124f8b7..3d901be074d 100644 --- a/app/core/EngineService/EngineService.ts +++ b/app/core/EngineService/EngineService.ts @@ -98,7 +98,7 @@ class EngineService { * Initialize the engine with a backup vault from the Secure KeyChain * * @returns Promise - * InitializeEngineResult { + * InitializeEngineResult { success: boolean; error?: string; } diff --git a/app/declarations.d.ts b/app/declarations.d.ts index 06d7c44bfd3..8eb32bc845f 100644 --- a/app/declarations.d.ts +++ b/app/declarations.d.ts @@ -1,6 +1,13 @@ // This file contains type declarations for asset types. // Ex. This makes it so that when you import CloseIcon from './close-icon.svg, CloseIcon, will be detected as a React.FC component. declare module '*.mp4'; + +declare module '@exodus/react-native-payments/lib/js/__mocks__'; + +declare module 'react-native-fade-in-image'; + +declare module 'react-native-minimizer'; + declare module '*.svg' { import { SvgProps } from 'react-native-svg'; const content: React.FC; diff --git a/package.json b/package.json index ad2013314ff..e2623b51899 100644 --- a/package.json +++ b/package.json @@ -342,8 +342,8 @@ "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@lavamoat/allow-scripts": "^1.0.6", - "@metamask/eslint-config": "^7.0.0", - "@metamask/eslint-config-typescript": "^7.0.0", + "@metamask/eslint-config": "^9.0.0", + "@metamask/eslint-config-typescript": "^9.0.0", "@metamask/mobile-provider": "^2.1.0", "@metamask/test-dapp": "^6.1.0", "@react-native-community/eslint-config": "^2.0.0", @@ -357,7 +357,8 @@ "@testing-library/react": "14.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "12.1.2", - "@types/enzyme": "^3.10.9", + "@types/i18n-js": "^3.8.4", + "@types/enzyme": "^3.10.12", "@types/is-url": "^1.2.30", "@types/jest": "^28.1.8", "@types/node": "^17.0.21", @@ -367,12 +368,12 @@ "@types/react-native-background-timer": "^2.0.0", "@types/react-native-material-textfield": "^0.16.5", "@types/react-native-svg-charts": "^5.0.12", - "@types/react-native-vector-icons": "^6.4.8", - "@types/react-native-video": "^5.0.13", + "@types/react-native-vector-icons": "^6.4.13", + "@types/react-native-video": "^5.0.14", "@types/redux-mock-store": "^1.0.3", "@types/url-parse": "^1.4.8", - "@typescript-eslint/eslint-plugin": "^4.20.0", - "@typescript-eslint/parser": "^4.20.0", + "@typescript-eslint/eslint-plugin": "^5.57.0", + "@typescript-eslint/parser": "^5.57.0", "@walletconnect/types": "^2.9.0", "@wdio/appium-service": "^7.19.1", "@wdio/browserstack-service": "^7.26.0", @@ -396,13 +397,14 @@ "enzyme": "3.9.0", "enzyme-adapter-react-16": "1.10.0", "enzyme-to-json": "3.3.5", - "eslint": "7.14.0", - "eslint-config-react-native": "4.0.0", - "eslint-import-resolver-typescript": "^2.4.0", - "eslint-plugin-import": "^2.22.1", + "eslint": "^7.23.0", + "eslint-config-prettier": "^8.1.0", + "eslint-import-resolver-typescript": "^3.5.3", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsdoc": "^36.1.0", "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-react": "7.16.0", - "eslint-plugin-react-native": "3.7.0", + "eslint-plugin-react-native": "^4.0.0", "execa": "^5.0.0", "fbjs-scripts": "^3.0.1", "fs-extra": "^10.1.0", @@ -434,7 +436,7 @@ "rn-nodeify": "10.3.0", "stack-beautifier": "1.0.2", "ts-node": "^10.5.0", - "typescript": "^4.4.2", + "typescript": "~4.8.4", "wdio-cucumberjs-json-reporter": "^4.4.3", "xml2js": "^0.5.0" }, diff --git a/yarn.lock b/yarn.lock index b6131bf404e..b30da5ab90d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -137,6 +137,13 @@ "@types/ws" "8.5.4" type-fest "3.10.0" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" @@ -1056,6 +1063,15 @@ "@babel/traverse" "^7.22.6" "@babel/types" "^7.22.5" +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" @@ -1083,15 +1099,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/parser@^7.1.0", "@babel/parser@^7.7.0": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" @@ -2871,19 +2878,39 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@eslint/eslintrc@^0.2.1": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== +"@es-joy/jsdoccomment@0.10.8": + version "0.10.8" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz#b3152887e25246410ed4ea569a55926ec13b2b05" + integrity sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ== + dependencies: + comment-parser "1.2.4" + esquery "^1.4.0" + jsdoc-type-pratt-parser "1.1.1" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.1.tgz#0b371c118b8e4ebf9dbddb56120ab4befd791211" + integrity sha512-O7x6dMstWLn2ktjcoiNLDkAGG2EjveHL+Vvc+n0fXumkJYAcSqcVYKtwDU+hDZ0uDUsnUagSYaZrOLAYE8un1A== + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.19" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -3848,6 +3875,20 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@hypnosphi/create-react-context@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" @@ -5224,15 +5265,15 @@ resolved "https://registry.yarnpkg.com/@metamask/design-tokens/-/design-tokens-1.11.1.tgz#58cc57101e3f7024538b0bf4b56b8233008ff28d" integrity sha512-N+exN94rudeeAqjq47/BEugOgkMP6te1Mak+6xujzuISBoFMi0VK3JvPivG8MYlFE33yz+75YL+kDqP9GrYfEQ== -"@metamask/eslint-config-typescript@^7.0.0": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eslint-config-typescript/-/eslint-config-typescript-7.0.1.tgz#e013f7f0505741b9321cab21351136f651abbba6" - integrity sha512-nqWivz9XHjiHAE2Aqf/y+p8R3xDoN9ScX2i97vtTxNKjAqkzmUwAd8lEHEibRfPOYaRBQJ0x85wrof++PpLfZg== +"@metamask/eslint-config-typescript@^9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eslint-config-typescript/-/eslint-config-typescript-9.0.1.tgz#900d53579ce074734ac9bf4e3f66fc20b92bd6af" + integrity sha512-+W7MXCoq8Q29wvkAv0ycwKB82xMbl+LfkUoM8oWN4n7vyMDXgcgbNjY7ug+quJPZfDTJJ7fxgPmG8m4LrkEImw== -"@metamask/eslint-config@^7.0.0": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eslint-config/-/eslint-config-7.0.1.tgz#eeb87baa902965ca7931c26911d7027373706f34" - integrity sha512-dMZ+iyZrHdZK0D1uStTx8UN6Q6IK9YGbqPUwxgTj63M0mZOsuqs8qpGf+9Dn7uqS+8Oe9jNqejKxozjTiJvsEw== +"@metamask/eslint-config@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@metamask/eslint-config/-/eslint-config-9.0.0.tgz#22d4911b705f7e4e566efbdda0e37912da33e30f" + integrity sha512-mWlLGQKjXXFOj9EtDClKSoTLeQuPW2kM1w3EpUMf4goYAQ+kLXCCa8pEff6h8ApWAnjhYmXydA1znQ2J4XvD+A== "@metamask/eth-hd-keyring@^4.0.2": version "4.0.2" @@ -5681,6 +5722,18 @@ dependencies: "@octokit/openapi-types" "^12.11.0" +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + "@reach/router@^1.2.1": version "1.3.4" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c" @@ -7030,10 +7083,10 @@ resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.1.tgz#29c539826376a65e7f7d672d51301f37ed718f6d" integrity sha512-RQul5wEfY7BjWm0sYY86cmUN/pcXWGyVxWX93DFFJvcrxax5zKlieLwA3T77xJGwNcZW0YW6CYG70p1m8xPFmA== -"@types/enzyme@^3.10.9": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.9.tgz#b2d7c7429a37d994c156b6f361e83f271a60c8aa" - integrity sha512-dx5UvcWe2Vtye6S9Hw2rFB7Ul9uMXOAje2FAbXvVYieQDNle9qPAo7DfvFMSztZ9NFiD3dVZ4JsRYGTrSLynJg== +"@types/enzyme@^3.10.12": + version "3.10.12" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.12.tgz#ac4494801b38188935580642f772ad18f72c132f" + integrity sha512-xryQlOEIe1TduDWAOphR0ihfebKFSWOXpIsk+70JskCfRfW+xALdnJ0r1ZOTo85F9Qsjk6vtlU7edTYHbls9tA== dependencies: "@types/cheerio" "*" "@types/react" "*" @@ -7114,6 +7167,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/i18n-js@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@types/i18n-js/-/i18n-js-3.8.4.tgz#d82acfe3b1fbfbb9ae7eff84360a6ae436ba14d7" + integrity sha512-lXIJLglOZsa81DzqiiG99xF6qGJvwRGqzCQe1FB+/JhgVTyGGVa63DMopEQMJdpAlUUSdJsIhC7sw5xDfDjXWw== + "@types/inquirer@^8.1.2": version "8.2.4" resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.4.tgz#f7f0c76c65870c7bbc80a112c9c77ffcf7f158c1" @@ -7185,11 +7243,16 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== -"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7": +"@types/json-schema@^7.0.5": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + "@types/json-stringify-safe@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@types/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz#df34d054419d39323a3730966bacba02ac5e474e" @@ -7441,18 +7504,18 @@ "@types/react-native" "*" react-native-svg "^6.2.1" -"@types/react-native-vector-icons@^6.4.8": - version "6.4.8" - resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.8.tgz#7dd9740f36a71e98c484b9ea12155940c85cedc2" - integrity sha512-ImqhwVPHtcWrfwaS4vVrnN/C1mY50+Gjer4wMltUJlkt9pTJ5WXCyn8VFPmxC5h8Zy0DBN2tYdusBZ2xJP14OA== +"@types/react-native-vector-icons@^6.4.13": + version "6.4.13" + resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.13.tgz#28b34d15094e040718beefb67cb3eff0c4994cb6" + integrity sha512-1PqFoKuXTSzMHwGMAr+REdYJBQAbe9xrww3ecZR0FsHcD1K+vGS/rxuAriL4rsI6+p69sZQjDzpEVAbDQcjSwA== dependencies: "@types/react" "*" - "@types/react-native" "*" + "@types/react-native" "^0.70" -"@types/react-native-video@^5.0.13": - version "5.0.13" - resolved "https://registry.yarnpkg.com/@types/react-native-video/-/react-native-video-5.0.13.tgz#4a6df3156c5d9ad4e3a37edb320199eaeb22ea20" - integrity sha512-pXdF+uM5Kqmsx90eQzOArkz06QOzKQi8uekdcqD+KeNXuQfwJ6hiuGTiC46VcgxGdQVCKAa1AYMg6oUMPaygew== +"@types/react-native-video@^5.0.14": + version "5.0.14" + resolved "https://registry.yarnpkg.com/@types/react-native-video/-/react-native-video-5.0.14.tgz#275d08f836280ace088462b2cb267925a6a915f3" + integrity sha512-KdcyY4HY/Q1l6f5qQA337BNVN+GsdZy836j9CXbWHZ008VVNzSlnJypJQPsnUgI0EPBw/uG/lyJk6cg9Jj1syg== dependencies: "@types/react" "*" "@types/react-native" "*" @@ -7471,6 +7534,13 @@ dependencies: "@types/react" "*" +"@types/react-native@^0.70": + version "0.70.13" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.70.13.tgz#a38a1378e68dc25fe5911b09c49b8afffe191316" + integrity sha512-VnC/ny8Eynk3fvY4cnNKXpo/0zUhA2gO64RX51yzVofblOP6TR6jciga0kIjI4c+2eUyWNGrahmiolNm+QU6Cw== + dependencies: + "@types/react" "*" + "@types/react-redux@^7.1.16": version "7.1.18" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.18.tgz#2bf8fd56ebaae679a90ebffe48ff73717c438e04" @@ -7571,6 +7641,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + "@types/send@*": version "0.17.1" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" @@ -7735,17 +7810,20 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/eslint-plugin@^4.20.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.30.0.tgz#4a0c1ae96b953f4e67435e20248d812bfa55e4fb" - integrity sha512-NgAnqk55RQ/SD+tZFD9aPwNSeHmDHHe5rtUyhIq0ZeCWZEvo4DK9rYz7v9HDuQZFvn320Ot+AikaCKMFKLlD0g== +"@typescript-eslint/eslint-plugin@^5.57.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: - "@typescript-eslint/experimental-utils" "4.30.0" - "@typescript-eslint/scope-manager" "4.30.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.1.0" - semver "^7.3.5" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@3.10.1": @@ -7759,18 +7837,6 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/experimental-utils@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.30.0.tgz#9e49704fef568432ae16fc0d6685c13d67db0fd5" - integrity sha512-K8RNIX9GnBsv5v4TjtwkKtqMSzYpjqAQg/oSphtxf3xxdt6T0owqnpojztjjTcatSteH3hLj3t/kklKx87NPqw== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.30.0" - "@typescript-eslint/types" "4.30.0" - "@typescript-eslint/typescript-estree" "4.30.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - "@typescript-eslint/parser@^3.1.0": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" @@ -7782,33 +7848,43 @@ "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/parser@^4.20.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.30.0.tgz#6abd720f66bd790f3e0e80c3be77180c8fcb192d" - integrity sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg== +"@typescript-eslint/parser@^5.57.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "4.30.0" - "@typescript-eslint/types" "4.30.0" - "@typescript-eslint/typescript-estree" "4.30.0" - debug "^4.3.1" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" -"@typescript-eslint/scope-manager@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz#1a3ffbb385b1a06be85cd5165a22324f069a85ee" - integrity sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "4.30.0" - "@typescript-eslint/visitor-keys" "4.30.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/types@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.30.0.tgz#fb9d9b0358426f18687fba82eb0b0f869780204f" - integrity sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" @@ -7824,19 +7900,33 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz#ae57833da72a753f4846cd3053758c771670c2ac" - integrity sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "4.30.0" - "@typescript-eslint/visitor-keys" "4.30.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/visitor-keys@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" @@ -7844,13 +7934,13 @@ dependencies: eslint-visitor-keys "^1.1.0" -"@typescript-eslint/visitor-keys@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz#a47c6272fc71b0c627d1691f68eaecf4ad71445e" - integrity sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "4.30.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" "@walletconnect/auth-client@2.1.0": version "2.1.0" @@ -8786,11 +8876,6 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.0.0, acorn-jsx@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -8801,12 +8886,7 @@ acorn-walk@^8.1.1, acorn-walk@^8.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^6.0.7: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -8885,7 +8965,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -8895,6 +8975,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^8.6.3: version "8.8.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" @@ -8929,11 +9019,6 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -9783,7 +9868,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.0.3, array-includes@^3.1.1: +array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -9794,7 +9879,7 @@ array-includes@^3.0.3, array-includes@^3.1.1: get-intrinsic "^1.1.3" is-string "^1.0.7" -array-includes@^3.1.2, array-includes@^3.1.3: +array-includes@^3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== @@ -9855,7 +9940,7 @@ array.prototype.find@^2.1.1: define-properties "^1.1.3" es-abstract "^1.17.4" -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.4: +array.prototype.flat@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== @@ -9864,7 +9949,7 @@ array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.4: define-properties "^1.1.3" es-abstract "^1.18.0-next.1" -array.prototype.flat@^1.2.5: +array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== @@ -9874,16 +9959,6 @@ array.prototype.flat@^1.2.5: es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" - integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - function-bind "^1.1.1" - array.prototype.flatmap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" @@ -9893,6 +9968,16 @@ array.prototype.flatmap@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + asap@^2.0.0, asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -10157,7 +10242,7 @@ babel-core@7.0.0-bridge.0, babel-core@^7.0.0-bridge.0: resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-eslint@10.1.0, babel-eslint@^10.0.1, babel-eslint@^10.1.0: +babel-eslint@10.1.0, babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== @@ -11157,7 +11242,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -11400,13 +11485,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -11436,11 +11514,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -11710,6 +11783,11 @@ commander@~2.13.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +comment-parser@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.2.4.tgz#489f3ee55dfd184a6e4bffb31baba284453cb760" + integrity sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -12339,7 +12417,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -12353,7 +12431,7 @@ debug@4.3.1: dependencies: ms "2.1.2" -debug@4.3.4, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4.3.4, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -13221,6 +13299,14 @@ engine.io-parser@~5.0.3: resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== +enhanced-resolve@^5.12.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -13550,16 +13636,6 @@ escodegen@^1.8.1: optionalDependencies: source-map "~0.6.1" -eslint-config-esnext@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz#8695b858fcf40d28c1aedca181f700528c7b60c6" - integrity sha512-GhfVEXdqYKEIIj7j+Fw2SQdL9qyZMekgXfq6PyXM66cQw0B435ddjz3P3kxOBVihMRJ0xGYjosaveQz5Y6z0uA== - dependencies: - babel-eslint "^10.0.1" - eslint "^6.8.0" - eslint-plugin-babel "^5.2.1" - eslint-plugin-import "^2.14.0" - eslint-config-prettier@^6.10.1: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -13567,65 +13643,40 @@ eslint-config-prettier@^6.10.1: dependencies: get-stdin "^6.0.0" -eslint-config-react-native@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-native/-/eslint-config-react-native-4.0.0.tgz#1eaeb4296a025998423e811599463e5a08ccc76f" - integrity sha512-0b+yie+RJVugAxeFUX6RrR9jQKTSkBaPeBTHGbhGqmGZ/R9fErtMcMutBoc//7TfRmITmmDuVPnJAZ8tM/T8Yw== - dependencies: - eslint "^5.6.0" - eslint-config-esnext "^4.0.0" - eslint-plugin-react "^7.11.1" - eslint-plugin-react-native "^3.3.0" - -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" +eslint-config-prettier@^8.1.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-import-resolver-typescript@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.4.0.tgz#ec1e7063ebe807f0362a7320543aaed6fe1100e1" - integrity sha512-useJKURidCcldRLCNKWemr1fFQL1SzB3G4a0li6lFGvlc5xGe1hY343bvG07cbpCzPuM/lK19FIJB3XGFSkplA== - dependencies: - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-module-utils@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" - integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== +eslint-import-resolver-typescript@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz#7370c326c3c08f0c1839c592d79d20b704de15d4" + integrity sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A== dependencies: - debug "^3.2.7" - pkg-dir "^2.0.0" + debug "^4.3.4" + enhanced-resolve "^5.12.0" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + synckit "^0.8.5" -eslint-module-utils@^2.7.3: +eslint-module-utils@^2.7.4: version "2.7.4" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" -eslint-plugin-babel@^5.2.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz#75a2413ffbf17e7be57458301c60291f2cfbf560" - integrity sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g== - dependencies: - eslint-rule-composer "^0.3.0" - eslint-plugin-eslint-comments@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" @@ -13641,44 +13692,25 @@ eslint-plugin-flowtype@2.50.3: dependencies: lodash "^4.17.10" -eslint-plugin-import@^2.14.0: - version "2.23.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" - integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== - dependencies: - array-includes "^3.1.3" - array.prototype.flat "^1.2.4" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.1" - find-up "^2.0.0" - has "^1.0.3" - is-core-module "^2.4.0" - minimatch "^3.0.4" - object.values "^1.1.3" - pkg-up "^2.0.0" - read-pkg-up "^3.0.0" - resolve "^1.20.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-import@^2.22.1: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" eslint-plugin-jest@22.4.1: @@ -13686,6 +13718,21 @@ eslint-plugin-jest@22.4.1: resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz#a5fd6f7a2a41388d16f527073b778013c5189a9c" integrity sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg== +eslint-plugin-jsdoc@^36.1.0: + version "36.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.1.tgz#124cd0e53a5d07f01ebde916a96dd1a6009625d6" + integrity sha512-nuLDvH1EJaKx0PCa9oeQIxH6pACIhZd1gkalTUxZbaxxwokjs7TplqY0Q8Ew3CoZaf5aowm0g/Z3JGHCatt+gQ== + dependencies: + "@es-joy/jsdoccomment" "0.10.8" + comment-parser "1.2.4" + debug "^4.3.2" + esquery "^1.4.0" + jsdoc-type-pratt-parser "^1.1.1" + lodash "^4.17.21" + regextras "^0.8.0" + semver "^7.3.5" + spdx-expression-parse "^3.0.1" + eslint-plugin-prettier@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" @@ -13710,14 +13757,7 @@ eslint-plugin-react-native-globals@^0.1.1: resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== -eslint-plugin-react-native@3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.7.0.tgz#7e2cc1f3cf24919c4c0ea7fac13301e7444e105f" - integrity sha512-krLtQmGih/uJDPxF8DBpnU8J3kRUsDm/Dey5yEhOO8LN1I3Wesbk4PGCg8Zah57azKFU+9YtGooFjJcDJWUs+g== - dependencies: - eslint-plugin-react-native-globals "^0.1.1" - -eslint-plugin-react-native@^3.3.0, eslint-plugin-react-native@^3.8.1: +eslint-plugin-react-native@^3.8.1: version "3.11.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz#c73b0886abb397867e5e6689d3a6a418682e6bac" integrity sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA== @@ -13725,6 +13765,14 @@ eslint-plugin-react-native@^3.3.0, eslint-plugin-react-native@^3.8.1: "@babel/traverse" "^7.7.4" eslint-plugin-react-native-globals "^0.1.1" +eslint-plugin-react-native@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz#eec41984abe4970bdd7c6082dff7a98a5e34d0bb" + integrity sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ== + dependencies: + "@babel/traverse" "^7.7.4" + eslint-plugin-react-native-globals "^0.1.1" + eslint-plugin-react@7.16.0: version "7.16.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz#9928e4f3e2122ed3ba6a5b56d0303ba3e41d8c09" @@ -13740,24 +13788,6 @@ eslint-plugin-react@7.16.0: prop-types "^15.7.2" resolve "^1.12.0" -eslint-plugin-react@^7.11.1: - version "7.24.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz#eadedfa351a6f36b490aa17f4fa9b14e842b9eb4" - integrity sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q== - dependencies: - array-includes "^3.1.3" - array.prototype.flatmap "^1.2.4" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.0.4" - object.entries "^1.1.4" - object.fromentries "^2.0.4" - object.values "^1.1.4" - prop-types "^15.7.2" - resolve "^2.0.0-next.3" - string.prototype.matchall "^4.0.5" - eslint-plugin-react@^7.20.0: version "7.27.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.27.0.tgz#f952c76517a3915b81c7788b220b2b4c96703124" @@ -13778,19 +13808,6 @@ eslint-plugin-react@^7.20.0: semver "^6.3.0" string.prototype.matchall "^4.0.6" -eslint-rule-composer@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" - integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -13799,13 +13816,6 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.3.1, eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" @@ -13813,13 +13823,6 @@ eslint-utils@^2.0.0, eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" @@ -13830,29 +13833,37 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" - integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== +eslint-visitor-keys@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^7.23.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.1" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" - espree "^7.3.0" - esquery "^1.2.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -13860,7 +13871,7 @@ eslint@7.14.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -13869,114 +13880,11 @@ eslint@7.14.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@^5.6.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.3.0: +espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== @@ -13990,14 +13898,14 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -15115,18 +15023,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.2.9: +fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -15242,13 +15139,6 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -15256,12 +15146,12 @@ figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-type@^9.0.0: version "9.0.0" @@ -15359,13 +15249,6 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -15408,24 +15291,23 @@ findit@^2.0.0: resolved "https://registry.yarnpkg.com/findit/-/findit-2.0.0.tgz#6509f0126af4c178551cfa99394e032e13a4d56e" integrity sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4= -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== flow-parser@0.*: version "0.164.0" @@ -15897,6 +15779,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-tsconfig@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f" + integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -15934,7 +15821,7 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -15967,19 +15854,24 @@ global@^4.3.2, global@^4.4.0, global@~4.4.0: min-document "^2.19.0" process "^0.11.10" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.6.0, globals@^13.9.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" + +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== -globby@^11.0.1: +globby@^11.0.1, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -15991,17 +15883,21 @@ globby@^11.0.1: merge2 "^1.4.1" slash "^3.0.0" -globby@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== +globby@^13.1.3: + version "13.1.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" + integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== dependencies: - array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== globule@^1.0.0: version "1.3.4" @@ -16056,6 +15952,11 @@ grapheme-splitter@^1.0.2: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -16490,7 +16391,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.5, ignore@^5.1.4: +ignore@^5.0.5: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -16647,44 +16548,6 @@ inquirer@8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -16875,20 +16738,20 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-core-module@^2.8.1, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -18016,7 +17879,7 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -18074,6 +17937,16 @@ jscodeshift@^0.13.1: temp "^0.8.4" write-file-atomic "^2.3.0" +jsdoc-type-pratt-parser@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz#10fe5e409ba38de22a48b555598955a26ff0160f" + integrity sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g== + +jsdoc-type-pratt-parser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz#3482a3833b74a88c95a6ba7253f0c0de3b77b9f5" + integrity sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -18184,7 +18057,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.1, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -18583,14 +18456,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -18599,6 +18464,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + license-checker@^13.0.3: version "13.1.0" resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-13.1.0.tgz#754c0aaaa3971f20f1855b5ae2d1d3f445a6595d" @@ -18701,16 +18574,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-utils@^1.4.0: version "1.4.2" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" @@ -18727,14 +18590,6 @@ localforage@^1.8.1: dependencies: lie "3.1.1" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -18854,6 +18709,11 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -18864,7 +18724,7 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg== -lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.9, lodash@^4.2.1, lodash@^4.6.1: +lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.16.6, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.9, lodash@^4.2.1, lodash@^4.6.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -20183,11 +20043,6 @@ mime@^2.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -20438,11 +20293,6 @@ multiple-cucumber-html-reporter@^3.0.1: open "^8.4.2" uuid "^9.0.0" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -20508,6 +20358,11 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -21055,7 +20910,7 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.0.4, object.entries@^1.1.2, object.entries@^1.1.4: +object.entries@^1.0.4, object.entries@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== @@ -21091,7 +20946,7 @@ object.fromentries@^2.0.0: define-properties "^1.1.4" es-abstract "^1.20.4" -object.fromentries@^2.0.3, object.fromentries@^2.0.4: +object.fromentries@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== @@ -21125,7 +20980,7 @@ object.pick@^1.1.1, object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.0.4, object.values@^1.1.0, object.values@^1.1.3, object.values@^1.1.4: +object.values@^1.0.4, object.values@^1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== @@ -21143,6 +20998,15 @@ object.values@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + obs-store@4.0.3, obs-store@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/obs-store/-/obs-store-4.0.3.tgz#b632ec7814baa604fae084a4c97e87c0b7a6d14c" @@ -21211,13 +21075,6 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -21240,7 +21097,7 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" -open@^8.2.0, open@^8.4.2: +open@^8.2.0, open@^8.4.0, open@^8.4.2: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -21259,7 +21116,7 @@ opencv-bindings@4.5.5: resolved "https://registry.yarnpkg.com/opencv-bindings/-/opencv-bindings-4.5.5.tgz#0c1457238ff97ac9afd59ab04c5009d79b48a3af" integrity sha512-FdYE9uqnoPKbAkZFEOpIh6RTtJIz1lz+W27xPCo1Ov6+d0OOgg+Hm9OT2MIGIG8V1Dp3fWlLvi7SIjDOpqO2XA== -optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -21360,13 +21217,6 @@ p-iteration@^1.1.8: resolved "https://registry.yarnpkg.com/p-iteration/-/p-iteration-1.1.8.tgz#14df726d55af368beba81bcc92a26bb1b48e714a" integrity sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -21381,13 +21231,6 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -21416,11 +21259,6 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -21621,11 +21459,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -21655,13 +21488,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -21854,13 +21680,6 @@ pkg-dir@5.0.0: dependencies: find-up "^5.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -21868,13 +21687,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - pkginfo@0.3.x, pkginfo@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" @@ -23429,14 +23241,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -23456,15 +23260,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -23758,11 +23553,6 @@ regexp.prototype.flags@^1.5.0: define-properties "^1.2.0" functions-have-names "^1.2.3" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -23804,6 +23594,11 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" +regextras@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.8.0.tgz#ec0f99853d4912839321172f608b544814b02217" + integrity sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ== + regjsgen@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" @@ -23967,7 +23762,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.6, resolve@^1.22.0: +resolve@^1.1.6, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -23976,7 +23771,7 @@ resolve@^1.1.6, resolve@^1.22.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0: +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -24006,14 +23801,6 @@ resq@^1.6.0, resq@^1.9.1: dependencies: fast-deep-equal "^2.0.1" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -24057,13 +23844,6 @@ rgb2hex@^0.1.0: resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.10.tgz#4fdd432665273e2d5900434940ceba0a04c8a8a8" integrity sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ== -rimraf@2.6.3, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -24097,6 +23877,13 @@ rimraf@~2.5.2: dependencies: glob "^7.0.5" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -24168,7 +23955,7 @@ rst-selector-parser@^2.2.3: lodash.flattendeep "^4.4.0" nearley "^2.7.10" -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -24190,7 +23977,7 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@6, rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.7: +rxjs@6, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -24377,7 +24164,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -24783,7 +24570,12 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.0.0, slice-ansi@^2.1.0: +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== @@ -25003,7 +24795,7 @@ spdx-expression-parse@^2.0.1: spdx-exceptions "^2.0.0" spdx-license-ids "^2.0.1" -spdx-expression-parse@^3.0.0: +spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== @@ -25258,7 +25050,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -25293,20 +25085,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" - integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - string.prototype.matchall@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" @@ -25468,16 +25246,16 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -25570,15 +25348,24 @@ swappable-obj-proxy@^1.1.0: resolved "https://registry.yarnpkg.com/swappable-obj-proxy/-/swappable-obj-proxy-1.1.0.tgz#fe23c60a0df22499e85d94b71297d9c39ff05fa4" integrity sha512-bXbKO85b0YNbZi/61TjRAbNtY49ABKu7rQ4k2+RFXPL7TA2mphttfqAqCeJ+lrlKlkYc5pvm6erFk6vOWJSpdw== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +table@^6.0.9: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" taim@^1.0.2: version "1.1.0" @@ -25589,6 +25376,11 @@ taim@^1.0.2: pretty-hrtime "^1.0.0" ramda "0.18.x" +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + tar-fs@2.1.1, tar-fs@^2.0.0, tar-fs@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -25803,6 +25595,14 @@ timm@^1.6.1: resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + tiny-queue@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.0.tgz#c49fcb5c87555be1b4a5df7eb87101d5b78bc9dc" @@ -25984,15 +25784,6 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^3.9.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" - integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q== - dependencies: - json5 "^2.2.0" - minimist "^1.2.0" - strip-bom "^3.0.0" - tslib@1.14.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -26008,6 +25799,11 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.4.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + tslib@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" @@ -26091,7 +25887,7 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^0.8.0, type-fest@^0.8.1: +type-fest@^0.8.0: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -26131,11 +25927,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.4.2, typescript@^4.6.2: +typescript@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== +typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + u2f-api@0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" @@ -27123,13 +26924,6 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" From 6677a5fbcb6142d98721b5a23a91aeaf04750aca Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 26 Jul 2023 13:02:34 -0230 Subject: [PATCH 12/20] test: Improve migration unit tests (#6881) * test: Improve migration unit tests The migration unit tests have been updated to group tests by the migration number. One additional test case has been added as well, to cover the case where the affected state doesn't exist. This change was done to simplify PR #6872, which is part of https://github.com/MetaMask/mobile-planning/issues/798 * Explicitly reference migration version in test block for that version --- app/store/migrations.test.js | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/app/store/migrations.test.js b/app/store/migrations.test.js index 9be107900e8..85d90f8fb1e 100644 --- a/app/store/migrations.test.js +++ b/app/store/migrations.test.js @@ -1,7 +1,14 @@ +import { cloneDeep } from 'lodash'; import { migrations, version } from './migrations'; describe('Redux Persist Migrations', () => { + it('should have all migrations up to the latest version', () => { + // Assert that the latest migration index matches the version constant + expect(Object.keys(migrations).length - 1).toBe(version); + }); + it('should apply last migration version and return state', () => { + // update this state to be compatible with the most recent migration const oldState = { recents: '0x1', }; @@ -11,10 +18,31 @@ describe('Redux Persist Migrations', () => { const newState = migration(oldState); expect(newState).toBeDefined(); - expect(newState.recents).toBeUndefined(); }); - it('should have all migrations up to the latest version', () => { - // Assert that the latest migration index matches the version constant - expect(Object.keys(migrations).length - 1).toBe(version); + + describe('#19', () => { + it('should not change state if recents are missing', () => { + const oldState = { + foo: 'bar', + }; + + const migration = migrations[19]; + + const newState = migration(cloneDeep(oldState)); + + expect(newState).toStrictEqual(oldState); + }); + + it('should remove recents', () => { + const oldState = { + recents: '0x1', + }; + + const migration = migrations[19]; + + const newState = migration(oldState); + + expect(newState).toStrictEqual({}); + }); }); }); From 2c462b1014933e51ea77e350d8da79203756ebd6 Mon Sep 17 00:00:00 2001 From: Sylva Elendu Date: Wed, 26 Jul 2023 17:48:11 +0100 Subject: [PATCH 13/20] chore: Custom Gas Modal Component (#6287) * custom gas modal component * failing snapshot * validate for error txn with data * initialbackgroundstate in unit test --- .../CustomGasModal/CustomGasModal.styles.ts | 15 + .../UI/CustomGasModal/CustomGasModal.test.tsx | 140 ++ .../UI/CustomGasModal/CustomGasModal.tsx | 200 +++ .../UI/CustomGasModal/CustomGasModal.types.ts | 39 + .../CustomGasModal.test.tsx.snap | 1356 +++++++++++++++++ app/components/UI/CustomGasModal/index.ts | 1 + .../UI/EditGasFeeLegacyUpdate/types.ts | 6 +- .../Views/SendFlow/Confirm/index.js | 322 +--- app/constants/test-ids.js | 2 + app/util/test/renderWithProvider.tsx | 38 +- 10 files changed, 1856 insertions(+), 263 deletions(-) create mode 100644 app/components/UI/CustomGasModal/CustomGasModal.styles.ts create mode 100644 app/components/UI/CustomGasModal/CustomGasModal.test.tsx create mode 100644 app/components/UI/CustomGasModal/CustomGasModal.tsx create mode 100644 app/components/UI/CustomGasModal/CustomGasModal.types.ts create mode 100644 app/components/UI/CustomGasModal/__snapshots__/CustomGasModal.test.tsx.snap create mode 100644 app/components/UI/CustomGasModal/index.ts diff --git a/app/components/UI/CustomGasModal/CustomGasModal.styles.ts b/app/components/UI/CustomGasModal/CustomGasModal.styles.ts new file mode 100644 index 00000000000..7002e7d4fd3 --- /dev/null +++ b/app/components/UI/CustomGasModal/CustomGasModal.styles.ts @@ -0,0 +1,15 @@ +import { StyleSheet } from 'react-native'; + +const createStyles = () => + StyleSheet.create({ + bottomModal: { + justifyContent: 'flex-end', + margin: 0, + }, + keyboardAwareWrapper: { + flex: 1, + justifyContent: 'flex-end', + }, + }); + +export default createStyles; diff --git a/app/components/UI/CustomGasModal/CustomGasModal.test.tsx b/app/components/UI/CustomGasModal/CustomGasModal.test.tsx new file mode 100644 index 00000000000..9a751fd47d3 --- /dev/null +++ b/app/components/UI/CustomGasModal/CustomGasModal.test.tsx @@ -0,0 +1,140 @@ +import React from 'react'; + +import { fireEvent } from '@testing-library/react-native'; + +import Engine from '../../../core/Engine'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; +import renderWithProvider from '../../../util/test/renderWithProvider'; +import CustomGasModal from './'; + +Engine.init({}); +jest.mock('@react-navigation/native', () => ({ + useNavigation: () => ({ + navigation: {}, + }), + createNavigatorFactory: () => ({}), +})); + +jest.mock('react-native-keyboard-aware-scroll-view', () => { + const KeyboardAwareScrollView = jest.requireActual('react-native').ScrollView; + return { KeyboardAwareScrollView }; +}); + +const gasSelected = 'high'; + +const mockInitialState = { + settings: {}, + transaction: { + selectedAsset: {}, + transaction: { + gas: '0x0', + gasPrice: '0x0', + data: '0x0', + }, + }, + engine: { + backgroundState: { + ...initialBackgroundState, + }, + }, +}; + +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useSelector: (fn: any) => fn(mockInitialState), +})); + +const mockedAction = jest.fn(); +const updateGasState = jest.fn(); +const eip1559GasData = { + maxFeePerGas: '0x0', + maxPriorityFeePerGas: '0x1', + suggestedMaxFeePerGas: '0x2', + suggestedMaxPriorityFeePerGas: '0x3', + suggestedGasLimit: '0x4', +}; +const eip1559GasTxn = { + suggestedGasLimit: '0x5', + totalMaxHex: '0x6', +}; + +const legacyGasData = { + legacyGasLimit: '', + suggestedGasPrice: '', +}; + +const customGasModalSharedProps = { + gasSelected, + onChange: mockedAction, + onCancel: mockedAction, + isAnimating: false, + onlyGas: false, + validateAmount: mockedAction, + updateGasState, + onGasChanged: (gas: string) => mockedAction(gas), + onGasCanceled: (gas: string) => mockedAction(gas), +}; + +describe('CustomGasModal', () => { + it('should render correctly', () => { + const wrapper = renderWithProvider( + , + { state: mockInitialState }, + false, + ); + expect(wrapper).toMatchSnapshot(); + }); + + it('should contain gas price if legacy', async () => { + const { findByText } = renderWithProvider( + , + { state: mockInitialState }, + false, + ); + + expect(await findByText('Gas price')).toBeDefined(); + expect(await findByText('Gas limit must be at least 21000')).toBeDefined(); + }); + + it('should contain gas fee if EIP1559 if legacy is false', () => { + const { queryByText } = renderWithProvider( + , + { state: mockInitialState }, + false, + ); + + expect(queryByText('Max fee')).toBeDefined(); + }); + + it('should call updateParentState when saved', () => { + const { getByText } = renderWithProvider( + , + { state: mockInitialState }, + false, + ); + + const saveButton = getByText('Save'); + + fireEvent.press(saveButton); + expect(updateGasState).toHaveBeenCalled(); + }); +}); diff --git a/app/components/UI/CustomGasModal/CustomGasModal.tsx b/app/components/UI/CustomGasModal/CustomGasModal.tsx new file mode 100644 index 00000000000..991c6420b8b --- /dev/null +++ b/app/components/UI/CustomGasModal/CustomGasModal.tsx @@ -0,0 +1,200 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; +import Modal from 'react-native-modal'; +import { useSelector } from 'react-redux'; + +import { selectChainId } from '../../../selectors/networkController'; +import { useAppThemeFromContext } from '../../../util/theme'; +import EditGasFee1559 from '../../UI/EditGasFee1559Update'; +import EditGasFeeLegacy from '../../UI/EditGasFeeLegacyUpdate'; +import createStyles from './CustomGasModal.styles'; +import { CustomGasModalProps } from './CustomGasModal.types'; + +const CustomGasModal = ({ + gasSelected, + animateOnChange, + isAnimating, + onlyGas, + validateAmount, + legacy, + legacyGasData, + EIP1559GasData, + EIP1559GasTxn, + onGasChanged, + onGasCanceled, + updateGasState, +}: CustomGasModalProps) => { + const { colors } = useAppThemeFromContext(); + const styles = createStyles(); + const transaction = useSelector((state: any) => state.transaction); + const gasFeeEstimate = useSelector( + (state: any) => + state.engine.backgroundState.GasFeeController.gasFeeEstimates, + ); + const primaryCurrency = useSelector( + (state: any) => state.settings.primaryCurrency, + ); + const chainId = useSelector((state: any) => selectChainId(state)); + const selectedAsset = useSelector( + (state: any) => state.transaction.selectedAsset, + ); + const gasEstimateType = useSelector( + (state: any) => + state.engine.backgroundState.GasFeeController.gasEstimateType, + ); + + const [selectedGas, setSelectedGas] = useState(gasSelected); + const [eip1559Txn, setEIP1559Txn] = useState(EIP1559GasTxn); + const [legacyGasObj, setLegacyGasObj] = useState(legacyGasData); + const [eip1559GasObj, setEIP1559GasObj] = useState(EIP1559GasData); + const [isViewAnimating, setIsViewAnimating] = useState(false); + const [error, setError] = useState(''); + + useEffect(() => { + setIsViewAnimating(isAnimating); + }, [isAnimating]); + + const onGasAnimationStart = useCallback(() => setIsViewAnimating(true), []); + const onGasAnimationEnd = useCallback(() => setIsViewAnimating(false), []); + + const getGasAnalyticsParams = () => ({ + active_currency: { value: selectedAsset.symbol, anonymous: true }, + gas_estimate_type: gasEstimateType, + }); + + const onChangeGas = (gasValue: string) => { + setSelectedGas(gasValue); + onGasChanged(selectedGas); + }; + + const onCancelGas = () => { + onGasCanceled(selectedGas); + }; + + const updatedTransactionFrom = useMemo( + () => ({ + ...transaction, + data: transaction?.transaction?.data, + from: transaction?.transaction?.from, + }), + [transaction], + ); + + const onSaveLegacyGasOption = useCallback( + (gasTxn, gasObj, gasSelect) => { + gasTxn.error = validateAmount({ + transaction: updatedTransactionFrom, + total: gasTxn.totalHex, + }); + setLegacyGasObj(gasObj); + setError(gasTxn?.error); + updateGasState({ gasTxn, gasObj, gasSelect, txnType: legacy }); + }, + [validateAmount, updatedTransactionFrom, legacy, updateGasState], + ); + + const onSaveEIP1559GasOption = useCallback( + (gasTxn, gasObj) => { + gasTxn.error = validateAmount({ + transaction: updatedTransactionFrom, + total: gasTxn.totalMaxHex, + }); + + setEIP1559Txn(gasTxn); + setEIP1559GasObj(gasObj); + setError(gasTxn?.error); + updateGasState({ + gasTxn, + gasObj, + gasSelect: selectedGas, + txnType: legacy, + }); + }, + [ + validateAmount, + selectedGas, + updatedTransactionFrom, + legacy, + updateGasState, + ], + ); + + const legacyGasObject = { + legacyGasLimit: legacyGasObj?.legacyGasLimit, + suggestedGasPrice: legacyGasObj?.suggestedGasPrice, + }; + + const eip1559GasObject = { + suggestedMaxFeePerGas: + eip1559GasObj?.suggestedMaxFeePerGas || + eip1559GasObj?.[selectedGas]?.suggestedMaxFeePerGas, + suggestedMaxPriorityFeePerGas: + eip1559GasObj?.suggestedMaxPriorityFeePerGas || + gasFeeEstimate[selectedGas]?.suggestedMaxPriorityFeePerGas, + suggestedGasLimit: + eip1559GasObj?.suggestedGasLimit || eip1559Txn?.suggestedGasLimit, + }; + + return ( + + + {legacy ? ( + + ) : ( + + )} + + + ); +}; + +export default CustomGasModal; diff --git a/app/components/UI/CustomGasModal/CustomGasModal.types.ts b/app/components/UI/CustomGasModal/CustomGasModal.types.ts new file mode 100644 index 00000000000..639889523b9 --- /dev/null +++ b/app/components/UI/CustomGasModal/CustomGasModal.types.ts @@ -0,0 +1,39 @@ +export interface CustomGasModalProps { + gasSelected: string; + onChange: (gas: string) => void; + onCancel: () => void; + animateOnChange?: boolean; + isAnimating: any; + onlyGas: boolean; + validateAmount: ({ + transaction, + total, + }: { + transaction: any; + total: string; + }) => void; + legacy: boolean; + legacyGasData?: { + legacyGasLimit: string; + suggestedGasPrice: string; + }; + EIP1559GasData?: { + maxFeePerGas: string; + maxPriorityFeePerGas: string; + suggestedMaxFeePerGas: string; + suggestedMaxPriorityFeePerGas: string; + suggestedGasLimit: string; + }; + EIP1559GasTxn?: { + suggestedGasLimit: string; + totalMaxHex: string; + }; + onGasChanged: (gas: string) => void; + onGasCanceled: (gas: string) => void; + updateGasState: (state: { + gasTxn: any; + gasObj: any; + gasSelect: string; + txnType: boolean; + }) => void; +} diff --git a/app/components/UI/CustomGasModal/__snapshots__/CustomGasModal.test.tsx.snap b/app/components/UI/CustomGasModal/__snapshots__/CustomGasModal.test.tsx.snap new file mode 100644 index 00000000000..0953fe2d162 --- /dev/null +++ b/app/components/UI/CustomGasModal/__snapshots__/CustomGasModal.test.tsx.snap @@ -0,0 +1,1356 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CustomGasModal should render correctly 1`] = ` + + + + + + + + + + + + + +  + + + + Edit gas fee + + +  + + + + + + + + + ~ + + + + + + + + 0 ETH + + + + + + + + + + + Gas limit + + + + +  + + + + + + + + +  + + + + + + + + + + +  + + + + + + +  + + + Gas limit must be at least 21000 + + + + + + + + + + Gas price + + + + +  + + + + + + + + +  + + + + + + + GWEI + + + + + + +  + + + + + + + + + + + + + Save + + + + + + + + + + + + +`; diff --git a/app/components/UI/CustomGasModal/index.ts b/app/components/UI/CustomGasModal/index.ts new file mode 100644 index 00000000000..3aa4dbc4bb5 --- /dev/null +++ b/app/components/UI/CustomGasModal/index.ts @@ -0,0 +1 @@ +export { default } from './CustomGasModal'; diff --git a/app/components/UI/EditGasFeeLegacyUpdate/types.ts b/app/components/UI/EditGasFeeLegacyUpdate/types.ts index 1b465b9cc6e..a3f742d962b 100644 --- a/app/components/UI/EditGasFeeLegacyUpdate/types.ts +++ b/app/components/UI/EditGasFeeLegacyUpdate/types.ts @@ -41,7 +41,7 @@ export interface EditGasFeeLegacyUpdateProps { /** * Warning message to show */ - warning: any | undefined; + warning?: any; /** * Ignore option array */ @@ -49,11 +49,11 @@ export interface EditGasFeeLegacyUpdateProps { /** * Extend options object. Object has option keys and properties will be spread */ - extendOptions: any; + extendOptions?: any; /** * Recommended object with type and render function */ - recommended: any; + recommended?: any; /** * Estimate option to compare with for too low warning */ diff --git a/app/components/Views/SendFlow/Confirm/index.js b/app/components/Views/SendFlow/Confirm/index.js index e98a9ca3506..264233c17d5 100644 --- a/app/components/Views/SendFlow/Confirm/index.js +++ b/app/components/Views/SendFlow/Confirm/index.js @@ -9,7 +9,6 @@ import { ActivityIndicator, Platform, } from 'react-native'; -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; import { connect } from 'react-redux'; import { getSendFlowTitle } from '../../../UI/Navbar'; import PropTypes from 'prop-types'; @@ -20,11 +19,9 @@ import { weiToFiat, balanceToFiat, isDecimal, - fromWei, hexToBN, BNToHex, } from '../../../../util/number'; - import { getTicker, decodeTransferData, @@ -68,8 +65,6 @@ import { removeFavoriteCollectible } from '../../../../actions/collectibles'; import { SafeAreaView } from 'react-native-safe-area-context'; import AccountFromToInfoCard from '../../../UI/AccountFromToInfoCard'; import TransactionReview from '../../../UI/TransactionReview/TransactionReviewEIP1559Update'; -import EditGasFee1559 from '../../../UI/EditGasFee1559Update'; -import EditGasFeeLegacy from '../../../UI/EditGasFeeLegacyUpdate'; import CustomNonce from '../../../UI/CustomNonce'; import AppConstants from '../../../../core/AppConstants'; import { @@ -105,10 +100,14 @@ import generateTestId from '../../../../../wdio/utils/generateTestId'; import { COMFIRM_TXN_AMOUNT } from '../../../../../wdio/screen-objects/testIDs/Screens/TransactionConfirm.testIds'; import { isNetworkBuyNativeTokenSupported } from '../../../UI/Ramp/utils'; import { getRampNetworks } from '../../../../reducers/fiatOrders'; +import CustomGasModal from '../../../UI/CustomGasModal'; +import { + TXN_CONFIRM_SCREEN, + TXN_CONFIRM_SEND_BUTTON, +} from '../../../../constants/test-ids'; const EDIT = 'edit'; const EDIT_NONCE = 'edit_nonce'; -const EDIT_EIP1559 = 'edit_eip1559'; const REVIEW = 'review'; const POLLING_INTERVAL_ESTIMATED_L1_FEE = 30000; @@ -236,11 +235,8 @@ class Confirm extends PureComponent { errorMessage: undefined, mode: REVIEW, gasSelected: AppConstants.GAS_OPTIONS.MEDIUM, - gasSelectedTemp: AppConstants.GAS_OPTIONS.MEDIUM, stopUpdateGas: false, advancedGasInserted: false, - gasSpeedSelected: AppConstants.GAS_OPTIONS.MEDIUM, - suggestedGasLimit: undefined, EIP1559GasTransaction: {}, EIP1559GasObject: {}, legacyGasObject: {}, @@ -286,18 +282,6 @@ class Confirm extends PureComponent { } }; - getGasAnalyticsParams = () => { - try { - const { selectedAsset, gasEstimateType } = this.props; - return { - active_currency: { value: selectedAsset.symbol, anonymous: true }, - gas_estimate_type: gasEstimateType, - }; - } catch (error) { - return {}; - } - }; - updateNavBar = () => { const { navigation, route, resetTransaction } = this.props; const colors = this.context.colors || mockTheme.colors; @@ -358,7 +342,13 @@ class Confirm extends PureComponent { }; componentDidMount = async () => { - const { chainId } = this.props; + const { + chainId, + showCustomNonce, + navigation, + providerType, + isPaymentRequest, + } = this.props; this.updateNavBar(); this.getGasLimit(); @@ -372,8 +362,6 @@ class Confirm extends PureComponent { this.getAnalyticsParams(), ); - const { showCustomNonce, navigation, providerType, isPaymentRequest } = - this.props; showCustomNonce && (await this.setNetworkNonce()); navigation.setParams({ providerType, isPaymentRequest }); this.parseTransactionDataHeader(); @@ -396,6 +384,9 @@ class Confirm extends PureComponent { selectedAsset, } = this.props; this.updateNavBar(); + + if (this.state?.closeModal) this.toggleConfirmationModal(REVIEW); + const { errorMessage, fromSelectedAddress } = this.state; const valueChanged = prevProps.transactionState.transaction.value !== value; const fromAddressChanged = @@ -427,9 +418,6 @@ class Confirm extends PureComponent { const gasSelected = gasEstimateTypeChanged ? AppConstants.GAS_OPTIONS.MEDIUM : this.state.gasSelected; - const gasSelectedTemp = gasEstimateTypeChanged - ? AppConstants.GAS_OPTIONS.MEDIUM - : this.state.gasSelectedTemp; if ( (!this.state.stopUpdateGas && !this.state.advancedGasInserted) || @@ -442,25 +430,19 @@ class Confirm extends PureComponent { gasEstimationReady: true, animateOnChange: true, gasSelected, - gasSelectedTemp, }, () => { this.setState({ animateOnChange: false }); }, ); } else if (this.props.gasEstimateType !== GAS_ESTIMATE_TYPES.NONE) { - const suggestedGasLimit = fromWei(gas, 'wei'); - this.setError(this.state.legacyGasTransaction.error); - // eslint-disable-next-line react/no-did-update-set-state this.setState( { gasEstimationReady: true, animateOnChange: true, gasSelected, - gasSelectedTemp, - suggestedGasLimit, }, () => { this.setState({ animateOnChange: false }); @@ -476,12 +458,9 @@ class Confirm extends PureComponent { this.scrollView = ref; }; - review = () => { - this.onModeChange(REVIEW); - }; - - edit = (MODE) => { + toggleConfirmationModal = (MODE) => { this.onModeChange(MODE); + this.setState({ closeModal: false }); }; onModeChange = (mode) => { @@ -573,25 +552,6 @@ class Confirm extends PureComponent { }); }; - handleSetGasSpeed = (speed) => { - this.setState({ gasSpeedSelected: speed }); - }; - - validateGas = () => { - const { accounts } = this.props; - const { gas, gasPrice, value, from } = - this.props.transactionState.transaction; - let errorMessage; - const totalGas = gas.mul(gasPrice); - const valueBN = hexToBN(value); - const balanceBN = hexToBN(accounts[from].balance); - if (valueBN.add(totalGas).gt(balanceBN)) { - errorMessage = strings('transaction.insufficient'); - this.setState({ errorMessage }); - } - return errorMessage; - }; - prepareTransactionToSend = () => { const { transactionState: { transaction }, @@ -661,7 +621,7 @@ class Confirm extends PureComponent { transaction: { value }, }, } = this.props; - const selectedAddress = transaction.from; + const selectedAddress = transaction?.from; let weiBalance, weiInput, error; if (isDecimal(value)) { @@ -830,167 +790,6 @@ class Confirm extends PureComponent { this.setState({ hexDataModalVisible: !hexDataModalVisible }); }; - cancelGasEdition = () => { - this.setState({ - stopUpdateGas: false, - gasSelectedTemp: this.state.gasSelected, - }); - this.review(); - }; - - saveGasEdition = (EIP1559GasTransaction, EIP1559GasObject) => { - const { transaction } = this.props; - EIP1559GasTransaction.error = this.validateAmount({ - transaction, - total: EIP1559GasTransaction.totalMaxHex, - }); - - this.setState({ EIP1559GasTransaction, EIP1559GasObject }); - - this.review(); - }; - - saveGasEditionLegacy = ( - legacyGasTransaction, - legacyGasObject, - gasSelected, - ) => { - const { transaction } = this.props; - - legacyGasTransaction.error = this.validateAmount({ - transaction, - total: legacyGasTransaction.totalHex, - }); - this.setState({ - gasSelected, - gasSelectedTemp: gasSelected, - advancedGasInserted: !gasSelected, - stopUpdateGas: false, - legacyGasTransaction, - legacyGasObject, - }); - this.review(); - }; - - renderCustomGasModalEIP1559 = () => { - const { primaryCurrency, chainId, gasFeeEstimates } = this.props; - const { - gasSelected, - isAnimating, - animateOnChange, - EIP1559GasObject, - EIP1559GasTransaction, - } = this.state; - - const selectedGasObject = { - suggestedMaxFeePerGas: - EIP1559GasObject.suggestedMaxFeePerGas || - gasFeeEstimates[gasSelected]?.suggestedMaxFeePerGas, - suggestedMaxPriorityFeePerGas: - EIP1559GasObject.suggestedMaxPriorityFeePerGas || - gasFeeEstimates[gasSelected]?.suggestedMaxPriorityFeePerGas, - suggestedGasLimit: - EIP1559GasObject.suggestedGasLimit || - EIP1559GasTransaction.suggestedGasLimit, - }; - - const colors = this.context.colors || mockTheme.colors; - const styles = createStyles(colors); - - return ( - - - - - - ); - }; - - renderCustomGasModalLegacy = () => { - const { primaryCurrency, chainId, gasEstimateType, gasFeeEstimates } = - this.props; - const { legacyGasObject, gasSelected, isAnimating, animateOnChange } = - this.state; - - const selectedGasObject = { - legacyGasLimit: legacyGasObject?.legacyGasLimit, - suggestedGasPrice: legacyGasObject?.suggestedGasPrice, - }; - - const colors = this.context.colors || mockTheme.colors; - const styles = createStyles(colors); - - return ( - - - - - - ); - }; - renderCustomNonceModal = () => { const { setNonce } = this.props; const { proposedNonce, nonce } = this.props.transaction; @@ -998,7 +797,7 @@ class Confirm extends PureComponent { this.review()} + close={() => this.toggleConfirmationModal(REVIEW)} save={setNonce} /> ); @@ -1083,21 +882,6 @@ class Confirm extends PureComponent { }); }; - updateGasSelected = (selected) => { - this.setState({ - stopUpdateGas: !selected, - gasSelectedTemp: selected, - gasSelected: selected, - }); - }; - - calculateTempGasFeeLegacy = (selected) => { - this.setState({ - stopUpdateGas: !selected, - gasSelectedTemp: selected, - }); - }; - onUpdatingValuesStart = () => { this.setState({ isAnimating: true }); }; @@ -1112,6 +896,37 @@ class Confirm extends PureComponent { }); }; + onGasChanged = (gasValue) => { + this.setState({ gasSelected: gasValue }); + }; + + onGasCanceled = (gasValue) => { + this.setState({ + stopUpdateGas: false, + gasSelectedTemp: gasValue, + closeModal: true, + }); + }; + + updateGasState = ({ gasTxn, gasObj, gasSelect, txnType }) => { + this.setState({ + gasSelectedTemp: gasSelect, + gasSelected: gasSelect, + closeModal: true, + ...(txnType + ? { + legacyGasTransaction: gasTxn, + legacyGasObject: gasObj, + advancedGasInserted: !gasSelect, + stopUpdateGas: false, + } + : { + EIP1559GasTransaction: gasTxn, + EIP1559GasObject: gasObj, + }), + }); + }; + render = () => { const { selectedAsset, paymentRequest } = this.props.transactionState; const { @@ -1136,10 +951,13 @@ class Confirm extends PureComponent { isAnimating, animateOnChange, multiLayerL1FeeTotal, + gasSelected, + EIP1559GasObject, + EIP1559GasTransaction, + legacyGasObject, } = this.state; const colors = this.context.colors || mockTheme.colors; const styles = createStyles(colors); - const showFeeMarket = !gasEstimateType || gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET || @@ -1157,7 +975,7 @@ class Confirm extends PureComponent { this.edit(!showFeeMarket ? EDIT : EDIT_EIP1559)} + onEdit={() => this.toggleConfirmationModal(EDIT)} onUpdatingValuesStart={this.onUpdatingValuesStart} onUpdatingValuesEnd={this.onUpdatingValuesEnd} animateOnChange={animateOnChange} isAnimating={isAnimating} gasEstimationReady={gasEstimationReady} chainId={chainId} - gasObject={ - !showFeeMarket - ? this.state.legacyGasObject - : this.state.EIP1559GasObject - } + gasObject={!showFeeMarket ? legacyGasObject : EIP1559GasObject} updateTransactionState={this.updateTransactionState} legacy={!showFeeMarket} onlyGas={false} multiLayerL1FeeTotal={multiLayerL1FeeTotal} /> + {mode === EDIT && ( + + )} {showCustomNonce && ( this.edit(EDIT_NONCE)} + onNonceEdit={() => this.toggleConfirmationModal(EDIT_NONCE)} /> )} @@ -1284,7 +1114,7 @@ class Confirm extends PureComponent { } containerStyle={styles.buttonNext} onPress={this.onNext} - testID={'txn-confirm-send-button'} + testID={TXN_CONFIRM_SEND_BUTTON} > {transactionConfirmed ? ( @@ -1295,9 +1125,7 @@ class Confirm extends PureComponent { )} - {mode === EDIT && this.renderCustomGasModalLegacy()} {mode === EDIT_NONCE && this.renderCustomNonceModal()} - {mode === EDIT_EIP1559 && this.renderCustomGasModalEIP1559()} {this.renderHexDataModal()} ); diff --git a/app/constants/test-ids.js b/app/constants/test-ids.js index 89167a62d4d..47c79decc37 100644 --- a/app/constants/test-ids.js +++ b/app/constants/test-ids.js @@ -101,3 +101,5 @@ export const SIGNATURE_MODAL_CANCEL_BUTTON_ID = // Advanced Settings export const ADVANCED_SETTINGS_CONTAINER_ID = 'advanced-settings'; export const ETH_SIGN_SWITCH_ID = 'eth-sign-switch'; +export const TXN_CONFIRM_SCREEN = 'txn-confirm-screen'; +export const TXN_CONFIRM_SEND_BUTTON = 'txn-confirm-send-button'; diff --git a/app/util/test/renderWithProvider.tsx b/app/util/test/renderWithProvider.tsx index 6374122a0b3..5071b789ad7 100644 --- a/app/util/test/renderWithProvider.tsx +++ b/app/util/test/renderWithProvider.tsx @@ -1,18 +1,20 @@ -import { NavigationContainer } from '@react-navigation/native'; import React from 'react'; import { Provider } from 'react-redux'; + +import { NavigationContainer } from '@react-navigation/native'; +import { + createStackNavigator, + StackNavigationOptions, +} from '@react-navigation/stack'; import { - RenderHookResult, render, renderHook, + RenderHookResult, } from '@testing-library/react-native'; + import { mockTheme, ThemeContext } from '../theme'; -import configureStore from './configureStore'; import { Theme } from '../theme/models'; -import { - createStackNavigator, - StackNavigationOptions, -} from '@react-navigation/stack'; +import configureStore from './configureStore'; interface ProviderValues { state?: Record; @@ -22,18 +24,28 @@ interface ProviderValues { export default function renderWithProvider( component: React.ReactElement, providerValues?: ProviderValues, + includeNavigationContainer = true, ) { const { state = {}, theme = mockTheme } = providerValues ?? {}; const store = configureStore(state); - const AllProviders = ({ children }: { children: React.ReactElement }) => ( - - - {children} - - + const InnerProvider = ({ children }: { children: React.ReactElement }) => ( + + {children} + ); + const AllProviders = ({ children }: { children: React.ReactElement }) => { + if (includeNavigationContainer) { + return ( + + {children} + + ); + } + return {children}; + }; + return render(component, { wrapper: AllProviders }); } From c10d38a1e49fe66ae354acdc82aa9c8c8c9d6853 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 26 Jul 2023 16:29:47 -0230 Subject: [PATCH 14/20] fix: Fix crash when switching to Linea (#6903) * fix: Fix crash when switching to Linea A recent `@metamask/controller-utils` update in #6874 caused the app to crash when switching to Linea because it removed the resolution for this package. Without that resolution, multiple copies of the package were introduced, but the Linea patch was only applied to one of them. The network controller was using a copy without the patch applied, resulting in the crash. This was resolved by restoring the resolution. We can remove it again once we have deleted the patch. * Update controller-utils patch to restore constants The constants `MAINNET` and `TESTNET_TICKER_SYMBOLS` were removed in v3.1.0, which was accidentally omitted from the changelog and not considered in the release version (this should have been a breaking change). They have been restored until we no longer rely on packages that use `@metamask/controller-utils` at versions under v3.1.0. --- package.json | 3 +- .../@metamask+controller-utils+3.4.0.patch | 51 ++++++++++++++---- yarn.lock | 53 +------------------ 3 files changed, 46 insertions(+), 61 deletions(-) diff --git a/package.json b/package.json index e2623b51899..cd4439b6b2a 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "react-native-level-fs/**/bl": "^1.2.3", "react-native-level-fs/**/semver": "^4.3.2", "@metamask/contract-metadata": "^2.1.0", + "@metamask/controller-utils": "^3.4.0", "@metamask/approval-controller": "3.4.0", "@exodus/react-native-payments/validator": "^13.7.0", "react-devtools-core": "4.22.1", @@ -513,4 +514,4 @@ "puppeteer": false } } -} \ No newline at end of file +} diff --git a/patches/@metamask+controller-utils+3.4.0.patch b/patches/@metamask+controller-utils+3.4.0.patch index 85e1df96817..3a726d40ea7 100644 --- a/patches/@metamask+controller-utils+3.4.0.patch +++ b/patches/@metamask+controller-utils+3.4.0.patch @@ -1,16 +1,30 @@ diff --git a/node_modules/@metamask/controller-utils/dist/constants.d.ts b/node_modules/@metamask/controller-utils/dist/constants.d.ts -index c8e8769..a78401d 100644 +index c8e8769..00e617f 100644 --- a/node_modules/@metamask/controller-utils/dist/constants.d.ts +++ b/node_modules/@metamask/controller-utils/dist/constants.d.ts -@@ -27,6 +27,7 @@ export declare const ASSET_TYPES: { +@@ -1,4 +1,7 @@ + import { NetworkType, NetworksTicker, NetworksChainId, NetworkId } from './types'; ++// PATCH: Restore `MAINNET` constant, which was removed in v3.1.0 ++// We need this patch until there are no remaining dependencies on Date: Wed, 26 Jul 2023 18:29:37 -0700 Subject: [PATCH 15/20] Added README to BannerBase (#6894) * Added README to BannerBase * Updated README based on comments --- .../BannerBase/BannerBase.constants.tsx | 1 + .../foundation/BannerBase/BannerBase.tsx | 2 - .../Banner/foundation/BannerBase/README.md | 89 +++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 app/component-library/components/Banners/Banner/foundation/BannerBase/README.md diff --git a/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.constants.tsx b/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.constants.tsx index b1ae89b3eaa..75701786a67 100644 --- a/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.constants.tsx +++ b/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.constants.tsx @@ -35,6 +35,7 @@ const SAMPLE_BANNERBASE_STARTACCESSORY = ; const SAMPLE_BANNERBASE_TITLE = 'Sample Banner Title'; const SAMPLE_BANNERBASE_DESCRIPTION = 'Sample Banner Description'; const SAMPLE_BANNERBASE_ACTIONBUTTON_PROPS: ButtonProps = { + variant: ButtonVariants.Secondary, label: 'Action Label', onPress: () => { console.log('clicked'); diff --git a/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.tsx b/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.tsx index ea46b42f796..5001646778f 100644 --- a/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.tsx +++ b/app/component-library/components/Banners/Banner/foundation/BannerBase/BannerBase.tsx @@ -17,7 +17,6 @@ import { BannerBaseProps } from './BannerBase.types'; import { DEFAULT_BANNERBASE_TITLE_TEXTVARIANT, DEFAULT_BANNERBASE_DESCRIPTION_TEXTVARIANT, - DEFAULT_BANNERBASE_ACTIONBUTTON_VARIANT, DEFAULT_BANNERBASE_ACTIONBUTTON_SIZE, DEFAULT_BANNERBASE_CLOSEBUTTON_BUTTONICONVARIANT, DEFAULT_BANNERBASE_CLOSEBUTTON_BUTTONICONSIZE, @@ -60,7 +59,6 @@ const BannerBase: React.FC = ({ {renderDescription()} {actionButtonProps && (